1 /* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef OHOS_NAPI_AVCAST_CONTROLLER_CALLBACK_H 17 #define OHOS_NAPI_AVCAST_CONTROLLER_CALLBACK_H 18 19 #include <list> 20 #include "errors.h" 21 #include "napi/native_api.h" 22 #include "napi/native_node_api.h" 23 #include "napi_async_callback.h" 24 #include "avsession_info.h" 25 #include "avsession_log.h" 26 27 namespace OHOS::AVSession { 28 using MSErrCode = ErrCode; 29 class NapiAVCastControllerCallback : public AVCastControllerCallback { 30 public: 31 enum { 32 EVENT_CAST_PLAYBACK_STATE_CHANGE, 33 EVENT_CAST_MEDIA_ITEM_CHANGE, 34 EVENT_CAST_PLAY_NEXT, 35 EVENT_CAST_PLAY_PREVIOUS, 36 EVENT_CAST_SEEK_DONE, 37 EVENT_CAST_VIDEO_SIZE_CHANGE, 38 EVENT_CAST_ERROR, 39 EVENT_CAST_END_OF_STREAM, 40 EVENT_CAST_TYPE_MAX, 41 }; 42 43 // bit 28~21 is subsys, bit 20~16 is Module. bit 15~0 is code 44 static constexpr MSErrCode MS_MODULE = 0X01000; 45 static constexpr MSErrCode MS_ERR_OFFSET = ErrCodeOffset(30, MS_MODULE); // 30 is SUBSYS_MULTIMEDIA 46 // media api9 error code 47 enum MediaServiceExtErrCodeAPI9 : ErrCode { 48 MSERR_EXT_API9_OK = 0, // use for determine error 49 MSERR_EXT_API9_NO_PERMISSION = 201, // permission denied (AccessToken). 50 MSERR_EXT_API9_PERMISSION_DENIED = 202, // permission denied (system API). 51 MSERR_EXT_API9_INVALID_PARAMETER = 401, // invalid parameter. 52 MSERR_EXT_API9_UNSUPPORT_CAPABILITY = 801, // unsupport api. 53 MSERR_EXT_API9_NO_MEMORY = 5400101, // no memory. 54 MSERR_EXT_API9_OPERATE_NOT_PERMIT = 5400102, // opertation not be permitted. 55 MSERR_EXT_API9_IO = 5400103, // IO error. 56 MSERR_EXT_API9_TIMEOUT = 5400104, // opertate timeout. 57 MSERR_EXT_API9_SERVICE_DIED = 5400105, // media service died. 58 MSERR_EXT_API9_UNSUPPORT_FORMAT = 5400106, // unsupport format. 59 }; 60 61 enum MediaServiceErrCode : ErrCode { 62 MSERR_OK = ERR_OK, 63 MSERR_NO_MEMORY = MS_ERR_OFFSET + ENOMEM, // no memory 64 MSERR_INVALID_OPERATION = MS_ERR_OFFSET + ENOSYS, // opertation not be permitted 65 MSERR_INVALID_VAL = MS_ERR_OFFSET + EINVAL, // invalid argument 66 MSERR_UNKNOWN = MS_ERR_OFFSET + 0x200, // unkown error. 67 MSERR_SERVICE_DIED, // media service died 68 MSERR_CREATE_REC_ENGINE_FAILED, // create recorder engine failed. 69 MSERR_CREATE_PLAYER_ENGINE_FAILED, // create player engine failed. 70 MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED, // create avmetadatahelper engine failed. 71 MSERR_CREATE_AVCODEC_ENGINE_FAILED, // create avcodec engine failed. 72 MSERR_INVALID_STATE, // the state is not support this operation. 73 MSERR_UNSUPPORT, // unsupport interface. 74 MSERR_UNSUPPORT_AUD_SRC_TYPE, // unsupport audio source type. 75 MSERR_UNSUPPORT_AUD_SAMPLE_RATE, // unsupport audio sample rate. 76 MSERR_UNSUPPORT_AUD_CHANNEL_NUM, // unsupport audio channel. 77 MSERR_UNSUPPORT_AUD_ENC_TYPE, // unsupport audio encoder type. 78 MSERR_UNSUPPORT_AUD_PARAMS, // unsupport audio params(other params). 79 MSERR_UNSUPPORT_VID_SRC_TYPE, // unsupport video source type. 80 MSERR_UNSUPPORT_VID_ENC_TYPE, // unsupport video encoder type. 81 MSERR_UNSUPPORT_VID_PARAMS, // unsupport video params(other params). 82 MSERR_UNSUPPORT_CONTAINER_TYPE, // unsupport container format type. 83 MSERR_UNSUPPORT_PROTOCOL_TYPE, // unsupport protocol type. 84 MSERR_UNSUPPORT_VID_DEC_TYPE, // unsupport video decoder type. 85 MSERR_UNSUPPORT_AUD_DEC_TYPE, // unsupport audio decoder type. 86 MSERR_UNSUPPORT_STREAM, // internal data stream error. 87 MSERR_UNSUPPORT_FILE, // this appears to be a text file. 88 MSERR_UNSUPPORT_SOURCE, // unsupport source type. 89 MSERR_AUD_RENDER_FAILED, // audio render failed. 90 MSERR_AUD_ENC_FAILED, // audio encode failed. 91 MSERR_VID_ENC_FAILED, // video encode failed. 92 MSERR_AUD_DEC_FAILED, // audio decode failed. 93 MSERR_VID_DEC_FAILED, // video decode failed. 94 MSERR_MUXER_FAILED, // stream avmuxer failed. 95 MSERR_DEMUXER_FAILED, // stream demuxer or parser failed. 96 MSERR_OPEN_FILE_FAILED, // open file failed. 97 MSERR_FILE_ACCESS_FAILED, // read or write file failed. 98 MSERR_START_FAILED, // audio/video start failed. 99 MSERR_PAUSE_FAILED, // audio/video pause failed. 100 MSERR_STOP_FAILED, // audio/video stop failed. 101 MSERR_SEEK_FAILED, // audio/video seek failed. 102 MSERR_NETWORK_TIMEOUT, // network timeout. 103 MSERR_NOT_FIND_CONTAINER, // not find a demuxer. 104 MSERR_DATA_SOURCE_IO_ERROR, // media data source IO failed. 105 MSERR_DATA_SOURCE_OBTAIN_MEM_ERROR, // media data source get mem failed. 106 MSERR_DATA_SOURCE_ERROR_UNKNOWN, // media data source error unknow. 107 MSERR_EXTEND_START = MS_ERR_OFFSET + 0xF000, // extend err start. 108 }; 109 110 const std::map<MediaServiceErrCode, std::string> MSERRCODE_INFOS = { 111 {MSERR_OK, "success"}, 112 {MSERR_NO_MEMORY, "no memory"}, 113 {MSERR_INVALID_OPERATION, "operation not be permitted"}, 114 {MSERR_INVALID_VAL, "invalid argument"}, 115 {MSERR_UNKNOWN, "unkown error"}, 116 {MSERR_SERVICE_DIED, "media service died"}, 117 {MSERR_CREATE_REC_ENGINE_FAILED, "create recorder engine failed"}, 118 {MSERR_CREATE_PLAYER_ENGINE_FAILED, "create player engine failed"}, 119 {MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED, "create avmetadatahelper engine failed"}, 120 {MSERR_INVALID_STATE, "the state is not support this operation"}, 121 {MSERR_UNSUPPORT, "unsupport interface"}, 122 {MSERR_UNSUPPORT_AUD_SRC_TYPE, "unsupport audio source type"}, 123 {MSERR_UNSUPPORT_AUD_SAMPLE_RATE, "unsupport audio sample rate"}, 124 {MSERR_UNSUPPORT_AUD_CHANNEL_NUM, "unsupport audio channel"}, 125 {MSERR_UNSUPPORT_AUD_ENC_TYPE, "unsupport audio encoder type"}, 126 {MSERR_UNSUPPORT_AUD_PARAMS, "unsupport audio params(other params)"}, 127 {MSERR_UNSUPPORT_VID_SRC_TYPE, "unsupport video source type"}, 128 {MSERR_UNSUPPORT_VID_ENC_TYPE, "unsupport video encoder type"}, 129 {MSERR_UNSUPPORT_VID_PARAMS, "unsupport video params(other params)"}, 130 {MSERR_UNSUPPORT_CONTAINER_TYPE, "unsupport container format type"}, 131 {MSERR_UNSUPPORT_PROTOCOL_TYPE, "unsupport protocol type"}, 132 {MSERR_UNSUPPORT_VID_DEC_TYPE, "unsupport video decoder type"}, 133 {MSERR_UNSUPPORT_AUD_DEC_TYPE, "unsupport audio decoder type"}, 134 {MSERR_UNSUPPORT_STREAM, "internal data stream error"}, 135 {MSERR_UNSUPPORT_FILE, "this appears to be a text file"}, 136 {MSERR_UNSUPPORT_SOURCE, "unsupport source type"}, 137 {MSERR_AUD_ENC_FAILED, "audio encode failed"}, 138 {MSERR_AUD_RENDER_FAILED, "audio render failed"}, 139 {MSERR_VID_ENC_FAILED, "video encode failed"}, 140 {MSERR_AUD_DEC_FAILED, "audio decode failed"}, 141 {MSERR_VID_DEC_FAILED, "video decode failed"}, 142 {MSERR_MUXER_FAILED, "stream avmuxer failed"}, 143 {MSERR_DEMUXER_FAILED, "stream demuxer or parser failed"}, 144 {MSERR_OPEN_FILE_FAILED, "open file failed"}, 145 {MSERR_FILE_ACCESS_FAILED, "read or write file failed"}, 146 {MSERR_START_FAILED, "audio or video start failed"}, 147 {MSERR_PAUSE_FAILED, "audio or video pause failed"}, 148 {MSERR_STOP_FAILED, "audio or video stop failed"}, 149 {MSERR_SEEK_FAILED, "audio or video seek failed"}, 150 {MSERR_NETWORK_TIMEOUT, "network timeout"}, 151 {MSERR_NOT_FIND_CONTAINER, "not find a demuxer"}, 152 {MSERR_EXTEND_START, "extend start error code"}, 153 }; 154 155 const std::map<MediaServiceErrCode, MediaServiceExtErrCodeAPI9> MSERRCODE_TO_EXTERRORCODEAPI9 = { 156 {MSERR_OK, MSERR_EXT_API9_OK}, 157 {MSERR_NO_MEMORY, MSERR_EXT_API9_NO_MEMORY}, 158 {MSERR_INVALID_OPERATION, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 159 {MSERR_INVALID_VAL, MSERR_EXT_API9_INVALID_PARAMETER}, 160 {MSERR_SERVICE_DIED, MSERR_EXT_API9_SERVICE_DIED}, 161 {MSERR_CREATE_REC_ENGINE_FAILED, MSERR_EXT_API9_NO_MEMORY}, 162 {MSERR_CREATE_PLAYER_ENGINE_FAILED, MSERR_EXT_API9_NO_MEMORY}, 163 {MSERR_INVALID_STATE, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 164 {MSERR_UNSUPPORT, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 165 {MSERR_UNSUPPORT_AUD_SRC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 166 {MSERR_UNSUPPORT_AUD_SAMPLE_RATE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 167 {MSERR_UNSUPPORT_AUD_CHANNEL_NUM, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 168 {MSERR_UNSUPPORT_AUD_ENC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 169 {MSERR_UNSUPPORT_AUD_PARAMS, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 170 {MSERR_UNSUPPORT_VID_SRC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 171 {MSERR_UNSUPPORT_VID_ENC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 172 {MSERR_UNSUPPORT_VID_PARAMS, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 173 {MSERR_UNSUPPORT_CONTAINER_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 174 {MSERR_UNSUPPORT_PROTOCOL_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 175 {MSERR_UNSUPPORT_VID_DEC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 176 {MSERR_UNSUPPORT_AUD_DEC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 177 {MSERR_UNSUPPORT_STREAM, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 178 {MSERR_UNSUPPORT_FILE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 179 {MSERR_UNSUPPORT_SOURCE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 180 {MSERR_AUD_RENDER_FAILED, MSERR_EXT_API9_IO}, 181 {MSERR_AUD_ENC_FAILED, MSERR_EXT_API9_IO}, 182 {MSERR_VID_ENC_FAILED, MSERR_EXT_API9_IO}, 183 {MSERR_AUD_DEC_FAILED, MSERR_EXT_API9_IO}, 184 {MSERR_VID_DEC_FAILED, MSERR_EXT_API9_IO}, 185 {MSERR_MUXER_FAILED, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 186 {MSERR_DEMUXER_FAILED, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 187 {MSERR_OPEN_FILE_FAILED, MSERR_EXT_API9_IO}, 188 {MSERR_FILE_ACCESS_FAILED, MSERR_EXT_API9_IO}, 189 {MSERR_START_FAILED, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 190 {MSERR_PAUSE_FAILED, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 191 {MSERR_STOP_FAILED, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 192 {MSERR_SEEK_FAILED, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 193 {MSERR_NETWORK_TIMEOUT, MSERR_EXT_API9_TIMEOUT}, 194 {MSERR_NOT_FIND_CONTAINER, MSERR_EXT_API9_INVALID_PARAMETER}, 195 {MSERR_UNKNOWN, MSERR_EXT_API9_IO}, 196 }; 197 198 NapiAVCastControllerCallback(); 199 ~NapiAVCastControllerCallback() override; 200 201 void OnCastPlaybackStateChange(const AVPlaybackState& state) override; 202 void OnMediaItemChange(const AVQueueItem& avQueueItem) override; 203 void OnPlayNext() override; 204 void OnPlayPrevious() override; 205 void OnSeekDone(const int32_t seekNumber) override; 206 void OnVideoSizeChange(const int32_t width, const int32_t height) override; 207 void OnPlayerError(const int32_t errorCode, const std::string& errorMsg) override; 208 void OnEndOfStream(const int32_t isLooping) override; 209 210 napi_status AddCallback(napi_env env, int32_t event, napi_value callback); 211 napi_status RemoveCallback(napi_env env, int32_t event, napi_value callback); 212 213 private: 214 void HandleEvent(int32_t event); 215 216 template<typename T> 217 void HandleEvent(int32_t event, const T& param); 218 219 template<typename T> 220 void HandleEvent(int32_t event, const std::string& firstParam, const T& secondParam); 221 222 template<typename T> 223 void HandleEvent(int32_t event, const int32_t firstParam, const T& secondParam); 224 225 void HandleEvent(int32_t event, const int32_t firstParam, const int32_t secondParam, const int32_t thirdParam); 226 227 void HandleErrorEvent(int32_t event, const int32_t errorCode, const std::string& errorMsg); 228 229 std::mutex lock_; 230 std::shared_ptr<NapiAsyncCallback> asyncCallback_; 231 std::list<napi_ref> callbacks_[EVENT_CAST_TYPE_MAX] {}; 232 }; 233 } // namespace OHOS::AVSession 234 #endif // OHOS_NAPI_AVCAST_CONTROLLER_CALLBACK_H 235