1 /* 2 * Copyright (c) 2023-2025 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 "avsession_info.h" 21 #include "avsession_log.h" 22 #include "napi/native_api.h" 23 #include "napi/native_node_api.h" 24 #include "napi_async_callback.h" 25 #include "errors.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_GENERIC_ERR, 40 EVENT_CAST_IO_ERR, 41 EVENT_CAST_PARSING_ERR, 42 EVENT_CAST_DECOD_EERR, 43 EVENT_CAST_RENDER_ERR, 44 EVENT_CAST_DRM_ERR, 45 EVENT_CAST_END_OF_STREAM, 46 EVENT_CAST_PLAY_REQUEST, 47 EVENT_CAST_KEY_REQUEST, 48 EVENT_CAST_VALID_COMMAND_CHANGED, 49 EVENT_CAST_CUSTOM_DATA, 50 EVENT_CAST_TYPE_MAX, 51 }; 52 53 // bit 28~21 is subsys, bit 20~16 is Module. bit 15~0 is code 54 static constexpr MSErrCode MS_MODULE = 0X01000; 55 static constexpr MSErrCode MS_ERR_OFFSET = ErrCodeOffset(30, MS_MODULE); // 30 is SUBSYS_MULTIMEDIA 56 // media api9 error code 57 enum MediaServiceExtErrCodeAPI9 : ErrCode { 58 MSERR_EXT_API9_OK = 0, // use for determine error 59 MSERR_EXT_API9_NO_PERMISSION = 201, // permission denied (AccessToken). 60 MSERR_EXT_API9_PERMISSION_DENIED = 202, // permission denied (system API). 61 MSERR_EXT_API9_INVALID_PARAMETER = 401, // invalid parameter. 62 MSERR_EXT_API9_UNSUPPORT_CAPABILITY = 801, // unsupport api. 63 MSERR_EXT_API9_NO_MEMORY = 5400101, // no memory. 64 MSERR_EXT_API9_OPERATE_NOT_PERMIT = 5400102, // opertation not be permitted. 65 MSERR_EXT_API9_IO = 5400103, // IO error. 66 MSERR_EXT_API9_TIMEOUT = 5400104, // opertate timeout. 67 MSERR_EXT_API9_SERVICE_DIED = 5400105, // media service died. 68 MSERR_EXT_API9_UNSUPPORT_FORMAT = 5400106, // unsupport format. 69 }; 70 71 // cast api13 error code 72 enum CastExtErrCodeAPI13 : ErrCode { 73 // Generic error 74 CAST_GENERICERR_EXT_API13_UNSPECIFIED = 6611000, 75 CAST_GENERICERR_EXT_API13_REMOTE_ERROR, 76 CAST_GENERICERR_EXT_API13_BEHIND_LIVE_WINDOW, 77 CAST_GENERICERR_EXT_API13_TIMEOUT, 78 CAST_GENERICERR_EXT_API13_FAILED_RUNTIME_CHECK, 79 CAST_GENERICERR_EXT_API13_PLAYER_ERROR = 6611100, 80 CAST_GENERICERR_EXT_API13_SEEK_MODE_UNSUPPORTED, 81 CAST_GENERICERR_EXT_API13_ILLEGAL_SEEK_TARGET, 82 CAST_GENERICERR_EXT_API13_PLAY_MODE_UNSUPPORTED, 83 CAST_GENERICERR_EXT_API13_PLAY_SPEED_UNSUPPORTED, 84 CAST_GENERICERR_EXT_API13_DEVICE_MISSED, 85 CAST_GENERICERR_EXT_API13_INVALID_PARAM, 86 CAST_GENERICERR_EXT_API13_NO_MEMORY, 87 CAST_GENERICERR_EXT_API13_OPERATION_NOT_ALLOWED, 88 // Input/Output errors 89 CAST_IOERR_EXT_API13_UNSPECIFIED = 6612000, 90 CAST_IOERR_EXT_API13_NETWORK_CONNECTION_FAILED, 91 CAST_IOERR_EXT_API13_NETWORK_CONNECTION_TIMEOUT, 92 CAST_IOERR_EXT_API13_INVALID_HTTP_CONTENT_TYPE, 93 CAST_IOERR_EXT_API13_BAD_HTTP_STATUS, 94 CAST_IOERR_EXT_API13_FILE_NOT_FOUND, 95 CAST_IOERR_EXT_API13_NO_PERMISSION, 96 CAST_IOERR_EXT_API13_CLEARTEXT_NOT_PERMITTED, 97 CAST_IOERR_EXT_API13_READ_POSITION_OUT_OF_RANGE, 98 CAST_IOERR_EXT_API13_NO_CONTENTS = 6612100, 99 CAST_IOERR_EXT_API13_READ_ERROR, 100 CAST_IOERR_EXT_API13_CONTENT_BUSY, 101 CAST_IOERR_EXT_API13_CONTENT_EXPIRED, 102 CAST_IOERR_EXT_API13_CONTENT_NON_ALLOWED_USE, 103 CAST_IOERR_EXT_API13_CONTENT_CANNOT_VERIFIED, 104 CAST_IOERR_EXT_API13_CONTENT_EXHAUSTED_ALLOWED_USES, 105 CAST_IOERR_EXT_API13_NETWORK_PACKET_SENDING_FAILURE, 106 // Content parsing errors 107 CAST_PARSINGERR_EXT_API13_UNSPECIFIED = 6613000, 108 CAST_PARSINGERR_EXT_API13_CONTAINER_MALFORMED, 109 CAST_PARSINGERR_EXT_API13_MANIFEST_MALFORMED, 110 CAST_PARSINGERR_EXT_API13_CONTAINER_UNSUPPORTED, 111 CAST_PARSINGERR_EXT_API13_MANIFEST_UNSUPPORTED, 112 // Decoding errors 113 CAST_DECODEERR_EXT_API13_UNSPECIFIED = 6614000, 114 CAST_DECODEERR_EXT_API13_INIT_FAILED, 115 CAST_DECODEERR_EXT_API13_QUERY_FAILED, 116 CAST_DECODEERR_EXT_API13_FAILED, 117 CAST_DECODEERR_EXT_API13_FORMAT_EXCEEDS_CAPABILITIES, 118 CAST_DECODEERR_EXT_API13_FORMAT_UNSUPPORTED, 119 // AudioRender errors 120 CAST_RENDERERR_EXT_API13_UNSPECIFIED = 6615000, 121 CAST_RENDERERR_EXT_API13_INIT_FAILED, 122 CAST_RENDERERR_EXT_API13_WRITE_FAILED, 123 // DRM errors 124 CAST_DRMERR_EXT_API13_UNSPECIFIED = 6616000, 125 CAST_DRMERR_EXT_API13_SCHEME_UNSUPPORTED, 126 CAST_DRMERR_EXT_API13_PROVISIONING_FAILED, 127 CAST_DRMERR_EXT_API13_CONTENT_ERROR, 128 CAST_DRMERR_EXT_API13_LICENSE_ACQUISITION_FAILED, 129 CAST_DRMERR_EXT_API13_DISALLOWED_OPERATION, 130 CAST_DRMERR_EXT_API13_SYSTEM_ERROR, 131 CAST_DRMERR_EXT_API13_DEVICE_REVOKED, 132 CAST_DRMERR_EXT_API13_LICENSE_EXPIRED, 133 CAST_DRMERR_EXT_API13_PROVIDE_KEY_RESPONSE_ERROR = 6616100, 134 }; 135 136 enum MediaServiceErrCode : ErrCode { 137 MSERR_OK = ERR_OK, 138 MSERR_NO_MEMORY = MS_ERR_OFFSET + ENOMEM, // no memory 139 MSERR_INVALID_OPERATION = MS_ERR_OFFSET + ENOSYS, // opertation not be permitted 140 MSERR_INVALID_VAL = MS_ERR_OFFSET + EINVAL, // invalid argument 141 MSERR_UNKNOWN = MS_ERR_OFFSET + 0x200, // unkown error. 142 MSERR_SERVICE_DIED, // media service died 143 MSERR_CREATE_REC_ENGINE_FAILED, // create recorder engine failed. 144 MSERR_CREATE_PLAYER_ENGINE_FAILED, // create player engine failed. 145 MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED, // create avmetadatahelper engine failed. 146 MSERR_CREATE_AVCODEC_ENGINE_FAILED, // create avcodec engine failed. 147 MSERR_INVALID_STATE, // the state is not support this operation. 148 MSERR_UNSUPPORT, // unsupport interface. 149 MSERR_UNSUPPORT_AUD_SRC_TYPE, // unsupport audio source type. 150 MSERR_UNSUPPORT_AUD_SAMPLE_RATE, // unsupport audio sample rate. 151 MSERR_UNSUPPORT_AUD_CHANNEL_NUM, // unsupport audio channel. 152 MSERR_UNSUPPORT_AUD_ENC_TYPE, // unsupport audio encoder type. 153 MSERR_UNSUPPORT_AUD_PARAMS, // unsupport audio params(other params). 154 MSERR_UNSUPPORT_VID_SRC_TYPE, // unsupport video source type. 155 MSERR_UNSUPPORT_VID_ENC_TYPE, // unsupport video encoder type. 156 MSERR_UNSUPPORT_VID_PARAMS, // unsupport video params(other params). 157 MSERR_UNSUPPORT_CONTAINER_TYPE, // unsupport container format type. 158 MSERR_UNSUPPORT_PROTOCOL_TYPE, // unsupport protocol type. 159 MSERR_UNSUPPORT_VID_DEC_TYPE, // unsupport video decoder type. 160 MSERR_UNSUPPORT_AUD_DEC_TYPE, // unsupport audio decoder type. 161 MSERR_UNSUPPORT_STREAM, // internal data stream error. 162 MSERR_UNSUPPORT_FILE, // this appears to be a text file. 163 MSERR_UNSUPPORT_SOURCE, // unsupport source type. 164 MSERR_AUD_RENDER_FAILED, // audio render failed. 165 MSERR_AUD_ENC_FAILED, // audio encode failed. 166 MSERR_VID_ENC_FAILED, // video encode failed. 167 MSERR_AUD_DEC_FAILED, // audio decode failed. 168 MSERR_VID_DEC_FAILED, // video decode failed. 169 MSERR_MUXER_FAILED, // stream avmuxer failed. 170 MSERR_DEMUXER_FAILED, // stream demuxer or parser failed. 171 MSERR_OPEN_FILE_FAILED, // open file failed. 172 MSERR_FILE_ACCESS_FAILED, // read or write file failed. 173 MSERR_START_FAILED, // audio/video start failed. 174 MSERR_PAUSE_FAILED, // audio/video pause failed. 175 MSERR_STOP_FAILED, // audio/video stop failed. 176 MSERR_SEEK_FAILED, // audio/video seek failed. 177 MSERR_NETWORK_TIMEOUT, // network timeout. 178 MSERR_NOT_FIND_CONTAINER, // not find a demuxer. 179 MSERR_DATA_SOURCE_IO_ERROR, // media data source IO failed. 180 MSERR_DATA_SOURCE_OBTAIN_MEM_ERROR, // media data source get mem failed. 181 MSERR_DATA_SOURCE_ERROR_UNKNOWN, // media data source error unknow. 182 MSERR_EXTEND_START = MS_ERR_OFFSET + 0xF000, // extend err start. 183 }; 184 185 enum CastErrCode : ErrCode { 186 // Generic error 187 ERROR_CODE_GENERIC_START = 1000, 188 ERROR_CODE_UNSPECIFIED = ERROR_CODE_GENERIC_START, 189 ERROR_CODE_REMOTE_ERROR, 190 ERROR_CODE_BEHIND_LIVE_WINDOW, 191 ERROR_CODE_TIMEOUT, 192 ERROR_CODE_FAILED_RUNTIME_CHECK, 193 ERROR_CODE_PLAYER_ERROR = 1100, 194 ERROR_CODE_SEEK_MODE_UNSUPPORTED, 195 ERROR_CODE_ILLEGAL_SEEK_TARGET, 196 ERROR_CODE_PLAY_MODE_UNSUPPORTED, 197 ERROR_CODE_PLAY_SPEED_UNSUPPORTED, 198 ERROR_CODE_DEVICE_MISSED, 199 ERROR_CODE_INVALID_PARAM, 200 ERROR_CODE_NO_MEMORY, 201 ERROR_OPERATION_NOT_ALLOWED, 202 ERROR_CODE_GENERIC_END = ERROR_OPERATION_NOT_ALLOWED, 203 // Input/Output errors 204 ERROR_CODE_IO_START = 2000, 205 ERROR_CODE_IO_UNSPECIFIED = ERROR_CODE_IO_START, 206 ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, 207 ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT, 208 ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE, 209 ERROR_CODE_IO_BAD_HTTP_STATUS, 210 ERROR_CODE_IO_FILE_NOT_FOUND, 211 ERROR_CODE_IO_NO_PERMISSION, 212 ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED, 213 ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE, 214 ERROR_CODE_IO_NO_CONTENTS = 2100, 215 ERROR_CODE_IO_READ_ERROR, 216 ERROR_CODE_IO_CONTENT_BUSY, 217 ERROR_CODE_IO_CONTENT_EXPIRED, 218 ERROR_CODE_IO_CONTENT_NON_ALLOWED_USE, 219 ERROR_CODE_IO_CONTENT_CANNOT_VERIFIED, 220 ERROR_CODE_IO_CONTENT_EXHAUSTED_ALLOWED_USES, 221 ERROR_CODE_IO_NETWORK_PACKET_SENDING_FAILURE, 222 ERROR_CODE_IO_END = ERROR_CODE_IO_NETWORK_PACKET_SENDING_FAILURE, 223 // Content parsing errors 224 ERROR_CODE_PARSING_START = 3000, 225 ERROR_CODE_PARSING_UNSPECIFIED = ERROR_CODE_PARSING_START, 226 ERROR_CODE_PARSING_CONTAINER_MALFORMED, 227 ERROR_CODE_PARSING_MANIFEST_MALFORMED, 228 ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED, 229 ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED, 230 ERROR_CODE_PARSING_END = ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED, 231 // Decoding errors 232 ERROR_CODE_DECODE_START = 4000, 233 ERROR_CODE_DECODE_UNSPECIFIED = ERROR_CODE_DECODE_START, 234 ERROR_CODE_DECODER_INIT_FAILED, 235 ERROR_CODE_DECODER_QUERY_FAILED, 236 ERROR_CODE_DECODING_FAILED, 237 ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES, 238 ERROR_CODE_DECODING_FORMAT_UNSUPPORTED, 239 ERROR_CODE_DECODE_END = ERROR_CODE_DECODING_FORMAT_UNSUPPORTED, 240 // AudioRender errors 241 ERROR_CODE_AUDIO_RENDERS_START = 5000, 242 ERROR_CODE_AUDIO_RENDERS_UNSPECIFIED = ERROR_CODE_AUDIO_RENDERS_START, 243 ERROR_CODE_AUDIO_RENDERS_INIT_FAILED, 244 ERROR_CODE_AUDIO_RENDERS_WRITE_FAILED, 245 ERROR_CODE_AUDIO_RENDERS_END = ERROR_CODE_AUDIO_RENDERS_WRITE_FAILED, 246 // DRM errors 247 ERROR_CODE_DRM_START = 6000, 248 ERROR_CODE_DRM_UNSPECIFIED = ERROR_CODE_DRM_START, 249 ERROR_CODE_DRM_SCHEME_UNSUPPORTED, 250 ERROR_CODE_DRM_PROVISIONING_FAILED, 251 ERROR_CODE_DRM_CONTENT_ERROR, 252 ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED, 253 ERROR_CODE_DRM_DISALLOWED_OPERATION, 254 ERROR_CODE_DRM_SYSTEM_ERROR, 255 ERROR_CODE_DRM_DEVICE_REVOKED, 256 ERROR_CODE_DRM_LICENSE_EXPIRED, 257 ERROR_CODE_DRM_PROVIDE_KEY_RESPONSE_ERROR, 258 ERROR_CODE_DRM_END = ERROR_CODE_DRM_PROVIDE_KEY_RESPONSE_ERROR, 259 }; 260 261 const std::map<MediaServiceErrCode, std::string> MSERRCODE_INFOS = { 262 {MSERR_OK, "success"}, 263 {MSERR_NO_MEMORY, "no memory"}, 264 {MSERR_INVALID_OPERATION, "operation not be permitted"}, 265 {MSERR_INVALID_VAL, "invalid argument"}, 266 {MSERR_UNKNOWN, "unkown error"}, 267 {MSERR_SERVICE_DIED, "media service died"}, 268 {MSERR_CREATE_REC_ENGINE_FAILED, "create recorder engine failed"}, 269 {MSERR_CREATE_PLAYER_ENGINE_FAILED, "create player engine failed"}, 270 {MSERR_CREATE_AVMETADATAHELPER_ENGINE_FAILED, "create avmetadatahelper engine failed"}, 271 {MSERR_INVALID_STATE, "the state is not support this operation"}, 272 {MSERR_UNSUPPORT, "unsupport interface"}, 273 {MSERR_UNSUPPORT_AUD_SRC_TYPE, "unsupport audio source type"}, 274 {MSERR_UNSUPPORT_AUD_SAMPLE_RATE, "unsupport audio sample rate"}, 275 {MSERR_UNSUPPORT_AUD_CHANNEL_NUM, "unsupport audio channel"}, 276 {MSERR_UNSUPPORT_AUD_ENC_TYPE, "unsupport audio encoder type"}, 277 {MSERR_UNSUPPORT_AUD_PARAMS, "unsupport audio params(other params)"}, 278 {MSERR_UNSUPPORT_VID_SRC_TYPE, "unsupport video source type"}, 279 {MSERR_UNSUPPORT_VID_ENC_TYPE, "unsupport video encoder type"}, 280 {MSERR_UNSUPPORT_VID_PARAMS, "unsupport video params(other params)"}, 281 {MSERR_UNSUPPORT_CONTAINER_TYPE, "unsupport container format type"}, 282 {MSERR_UNSUPPORT_PROTOCOL_TYPE, "unsupport protocol type"}, 283 {MSERR_UNSUPPORT_VID_DEC_TYPE, "unsupport video decoder type"}, 284 {MSERR_UNSUPPORT_AUD_DEC_TYPE, "unsupport audio decoder type"}, 285 {MSERR_UNSUPPORT_STREAM, "internal data stream error"}, 286 {MSERR_UNSUPPORT_FILE, "this appears to be a text file"}, 287 {MSERR_UNSUPPORT_SOURCE, "unsupport source type"}, 288 {MSERR_AUD_ENC_FAILED, "audio encode failed"}, 289 {MSERR_AUD_RENDER_FAILED, "audio render failed"}, 290 {MSERR_VID_ENC_FAILED, "video encode failed"}, 291 {MSERR_AUD_DEC_FAILED, "audio decode failed"}, 292 {MSERR_VID_DEC_FAILED, "video decode failed"}, 293 {MSERR_MUXER_FAILED, "stream avmuxer failed"}, 294 {MSERR_DEMUXER_FAILED, "stream demuxer or parser failed"}, 295 {MSERR_OPEN_FILE_FAILED, "open file failed"}, 296 {MSERR_FILE_ACCESS_FAILED, "read or write file failed"}, 297 {MSERR_START_FAILED, "audio or video start failed"}, 298 {MSERR_PAUSE_FAILED, "audio or video pause failed"}, 299 {MSERR_STOP_FAILED, "audio or video stop failed"}, 300 {MSERR_SEEK_FAILED, "audio or video seek failed"}, 301 {MSERR_NETWORK_TIMEOUT, "network timeout"}, 302 {MSERR_NOT_FIND_CONTAINER, "not find a demuxer"}, 303 {MSERR_EXTEND_START, "extend start error code"}, 304 }; 305 306 // Generic error 307 const std::map<CastErrCode, std::string> CAST_GENERIC_ERRCODE_INFOS = { 308 {ERROR_CODE_UNSPECIFIED, "The error code for cast control is unspecified"}, 309 {ERROR_CODE_REMOTE_ERROR, "An unspecified error occurs in the remote player"}, 310 {ERROR_CODE_BEHIND_LIVE_WINDOW, "The playback position falls behind the live window"}, 311 {ERROR_CODE_TIMEOUT, "The process of cast contorl times out"}, 312 {ERROR_CODE_FAILED_RUNTIME_CHECK, "The runtime check failed"}, 313 {ERROR_CODE_PLAYER_ERROR, "Cross-device data transmission is locked"}, 314 {ERROR_CODE_SEEK_MODE_UNSUPPORTED, "The specified seek mode is not supported"}, 315 {ERROR_CODE_ILLEGAL_SEEK_TARGET, "The position to seek to is out of the range of the media\ 316 asset or the specified seek mode is not supported"}, 317 {ERROR_CODE_PLAY_MODE_UNSUPPORTED, "The specified playback mode is not supported"}, 318 {ERROR_CODE_PLAY_SPEED_UNSUPPORTED, "The specified playback speed is not supported"}, 319 {ERROR_CODE_DEVICE_MISSED, "The action failed because either the media source devce or the\ 320 media sink device has been revoked"}, 321 {ERROR_CODE_INVALID_PARAM, "The parameter is invalid, for example, the url is illegal to play"}, 322 {ERROR_CODE_NO_MEMORY, "Allocation of memory failed"}, 323 {ERROR_OPERATION_NOT_ALLOWED, "Operation is not allowed"}, 324 }; 325 // Input/Output errors 326 const std::map<CastErrCode, std::string> CAST_IO_ERRCODE_INFOS = { 327 {ERROR_CODE_IO_UNSPECIFIED, "An unspecified input/output error occurs"}, 328 {ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, "Network connection failure"}, 329 {ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT, "Network timeout"}, 330 {ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE, "Invalid \"Content-Type\" HTTP header"}, 331 {ERROR_CODE_IO_BAD_HTTP_STATUS, "The HTTP server returns an unexpected HTTP response status code"}, 332 {ERROR_CODE_IO_FILE_NOT_FOUND, "The file does not exist"}, 333 {ERROR_CODE_IO_NO_PERMISSION, "No permission is granted to perform the IO operation"}, 334 {ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED, "Access to cleartext HTTP traffic is not allowed by the\ 335 app's network security configuration"}, 336 {ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE, "Reading data out of the data bound"}, 337 {ERROR_CODE_IO_NO_CONTENTS, "The media does not contain any contents that can be played"}, 338 {ERROR_CODE_IO_READ_ERROR, "The media cannot be read, for example, because of dust or scratches"}, 339 {ERROR_CODE_IO_CONTENT_BUSY, "This resource is already in use"}, 340 {ERROR_CODE_IO_CONTENT_EXPIRED, "The content using the validity interval has expired"}, 341 {ERROR_CODE_IO_CONTENT_NON_ALLOWED_USE, "Using the requested content to play is not allowed"}, 342 {ERROR_CODE_IO_CONTENT_CANNOT_VERIFIED, "The use of the allowed content cannot be verified"}, 343 {ERROR_CODE_IO_CONTENT_EXHAUSTED_ALLOWED_USES, "The number of times this content has been used as\ 344 requested has reached the maximum allowed number of uses"}, 345 {ERROR_CODE_IO_NETWORK_PACKET_SENDING_FAILURE, "An error occurs when sending packet from source\ 346 device to sink device"}, 347 }; 348 // Content parsing errors 349 const std::map<CastErrCode, std::string> CAST_PARSING_ERRCODE_INFOS = { 350 {ERROR_CODE_PARSING_UNSPECIFIED, "Unspecified error related to content parsing"}, 351 {ERROR_CODE_PARSING_CONTAINER_MALFORMED, "Parsing error associated with media container format bit\ 352 streams"}, 353 {ERROR_CODE_PARSING_MANIFEST_MALFORMED, "Parsing error associated with the media manifest"}, 354 {ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED, "An error occurs when attempting to extract a file with\ 355 an unsupported media container format"}, 356 {ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED, "Unsupported feature in the media manifest"}, 357 }; 358 // Decoding errors 359 const std::map<CastErrCode, std::string> CAST_DECODE_ERRCODE_INFOS = { 360 {ERROR_CODE_DECODE_UNSPECIFIED, "Unspecified decoding error"}, 361 {ERROR_CODE_DECODER_INIT_FAILED, "Decoder initialization failed"}, 362 {ERROR_CODE_DECODER_QUERY_FAILED, "Decoder query failed"}, 363 {ERROR_CODE_DECODING_FAILED, "Decoding the media samples failed"}, 364 {ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES, "The format of the content to decode exceeds the\ 365 capabilities of the device"}, 366 {ERROR_CODE_DECODING_FORMAT_UNSUPPORTED, "The format of the content to decode is not supported"}, 367 }; 368 // AudioRender errors 369 const std::map<CastErrCode, std::string> CAST_RENDER_ERRCODE_INFOS = { 370 {ERROR_CODE_AUDIO_RENDERS_UNSPECIFIED, "Unspecified errors related to the audio renderer"}, 371 {ERROR_CODE_AUDIO_RENDERS_INIT_FAILED, "Initializing the audio renderer failed"}, 372 {ERROR_CODE_AUDIO_RENDERS_WRITE_FAILED, "The audio renderer fails to write data"}, 373 }; 374 // DRM errors 375 const std::map<CastErrCode, std::string> CAST_DRM_ERRCODE_INFOS = { 376 {ERROR_CODE_DRM_UNSPECIFIED, "Unspecified error related to DRM"}, 377 {ERROR_CODE_DRM_SCHEME_UNSUPPORTED, "The chosen DRM protection scheme is not supported by the device"}, 378 {ERROR_CODE_DRM_PROVISIONING_FAILED, "Device provisioning failed"}, 379 {ERROR_CODE_DRM_CONTENT_ERROR, "The DRM-protected content to play is incompatible"}, 380 {ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED, "Failed to obtain a license"}, 381 {ERROR_CODE_DRM_DISALLOWED_OPERATION, "The operation is disallowed by the license policy"}, 382 {ERROR_CODE_DRM_SYSTEM_ERROR, "An error occurs in the DRM system"}, 383 {ERROR_CODE_DRM_DEVICE_REVOKED, "The device has revoked DRM privileges"}, 384 {ERROR_CODE_DRM_LICENSE_EXPIRED, "The DRM license being loaded into the open DRM session has expire"}, 385 {ERROR_CODE_DRM_PROVIDE_KEY_RESPONSE_ERROR, "An error occurs when the DRM processes the key response"}, 386 }; 387 388 const std::map<MediaServiceErrCode, MediaServiceExtErrCodeAPI9> MSERRCODE_TO_EXTERRORCODEAPI9 = { 389 {MSERR_OK, MSERR_EXT_API9_OK}, 390 {MSERR_NO_MEMORY, MSERR_EXT_API9_NO_MEMORY}, 391 {MSERR_INVALID_OPERATION, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 392 {MSERR_INVALID_VAL, MSERR_EXT_API9_INVALID_PARAMETER}, 393 {MSERR_SERVICE_DIED, MSERR_EXT_API9_SERVICE_DIED}, 394 {MSERR_CREATE_REC_ENGINE_FAILED, MSERR_EXT_API9_NO_MEMORY}, 395 {MSERR_CREATE_PLAYER_ENGINE_FAILED, MSERR_EXT_API9_NO_MEMORY}, 396 {MSERR_INVALID_STATE, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 397 {MSERR_UNSUPPORT, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 398 {MSERR_UNSUPPORT_AUD_SRC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 399 {MSERR_UNSUPPORT_AUD_SAMPLE_RATE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 400 {MSERR_UNSUPPORT_AUD_CHANNEL_NUM, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 401 {MSERR_UNSUPPORT_AUD_ENC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 402 {MSERR_UNSUPPORT_AUD_PARAMS, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 403 {MSERR_UNSUPPORT_VID_SRC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 404 {MSERR_UNSUPPORT_VID_ENC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 405 {MSERR_UNSUPPORT_VID_PARAMS, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 406 {MSERR_UNSUPPORT_CONTAINER_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 407 {MSERR_UNSUPPORT_PROTOCOL_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 408 {MSERR_UNSUPPORT_VID_DEC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 409 {MSERR_UNSUPPORT_AUD_DEC_TYPE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 410 {MSERR_UNSUPPORT_STREAM, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 411 {MSERR_UNSUPPORT_FILE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 412 {MSERR_UNSUPPORT_SOURCE, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 413 {MSERR_AUD_RENDER_FAILED, MSERR_EXT_API9_IO}, 414 {MSERR_AUD_ENC_FAILED, MSERR_EXT_API9_IO}, 415 {MSERR_VID_ENC_FAILED, MSERR_EXT_API9_IO}, 416 {MSERR_AUD_DEC_FAILED, MSERR_EXT_API9_IO}, 417 {MSERR_VID_DEC_FAILED, MSERR_EXT_API9_IO}, 418 {MSERR_MUXER_FAILED, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 419 {MSERR_DEMUXER_FAILED, MSERR_EXT_API9_UNSUPPORT_FORMAT}, 420 {MSERR_OPEN_FILE_FAILED, MSERR_EXT_API9_IO}, 421 {MSERR_FILE_ACCESS_FAILED, MSERR_EXT_API9_IO}, 422 {MSERR_START_FAILED, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 423 {MSERR_PAUSE_FAILED, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 424 {MSERR_STOP_FAILED, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 425 {MSERR_SEEK_FAILED, MSERR_EXT_API9_OPERATE_NOT_PERMIT}, 426 {MSERR_NETWORK_TIMEOUT, MSERR_EXT_API9_TIMEOUT}, 427 {MSERR_NOT_FIND_CONTAINER, MSERR_EXT_API9_INVALID_PARAMETER}, 428 {MSERR_UNKNOWN, MSERR_EXT_API9_IO}, 429 }; 430 431 const std::map<CastErrCode, CastExtErrCodeAPI13> CASTERRCODE_TO_EXTERRORCODEAPI13 = { 432 // Generic error 433 {ERROR_CODE_UNSPECIFIED, CAST_GENERICERR_EXT_API13_UNSPECIFIED}, 434 {ERROR_CODE_REMOTE_ERROR, CAST_GENERICERR_EXT_API13_REMOTE_ERROR}, 435 {ERROR_CODE_BEHIND_LIVE_WINDOW, CAST_GENERICERR_EXT_API13_BEHIND_LIVE_WINDOW}, 436 {ERROR_CODE_TIMEOUT, CAST_GENERICERR_EXT_API13_TIMEOUT}, 437 {ERROR_CODE_FAILED_RUNTIME_CHECK, CAST_GENERICERR_EXT_API13_FAILED_RUNTIME_CHECK}, 438 {ERROR_CODE_PLAYER_ERROR, CAST_GENERICERR_EXT_API13_PLAYER_ERROR}, 439 {ERROR_CODE_SEEK_MODE_UNSUPPORTED, CAST_GENERICERR_EXT_API13_SEEK_MODE_UNSUPPORTED}, 440 {ERROR_CODE_ILLEGAL_SEEK_TARGET, CAST_GENERICERR_EXT_API13_ILLEGAL_SEEK_TARGET}, 441 {ERROR_CODE_PLAY_MODE_UNSUPPORTED, CAST_GENERICERR_EXT_API13_PLAY_MODE_UNSUPPORTED}, 442 {ERROR_CODE_PLAY_SPEED_UNSUPPORTED, CAST_GENERICERR_EXT_API13_PLAY_SPEED_UNSUPPORTED}, 443 {ERROR_CODE_DEVICE_MISSED, CAST_GENERICERR_EXT_API13_DEVICE_MISSED}, 444 {ERROR_CODE_INVALID_PARAM, CAST_GENERICERR_EXT_API13_INVALID_PARAM}, 445 {ERROR_CODE_NO_MEMORY, CAST_GENERICERR_EXT_API13_NO_MEMORY}, 446 {ERROR_OPERATION_NOT_ALLOWED, CAST_GENERICERR_EXT_API13_OPERATION_NOT_ALLOWED}, 447 // Input/Output errors 448 {ERROR_CODE_IO_UNSPECIFIED, CAST_IOERR_EXT_API13_UNSPECIFIED}, 449 {ERROR_CODE_IO_NETWORK_CONNECTION_FAILED, CAST_IOERR_EXT_API13_NETWORK_CONNECTION_FAILED}, 450 {ERROR_CODE_IO_NETWORK_CONNECTION_TIMEOUT, CAST_IOERR_EXT_API13_NETWORK_CONNECTION_TIMEOUT}, 451 {ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE, CAST_IOERR_EXT_API13_INVALID_HTTP_CONTENT_TYPE}, 452 {ERROR_CODE_IO_BAD_HTTP_STATUS, CAST_IOERR_EXT_API13_BAD_HTTP_STATUS}, 453 {ERROR_CODE_IO_FILE_NOT_FOUND, CAST_IOERR_EXT_API13_FILE_NOT_FOUND}, 454 {ERROR_CODE_IO_NO_PERMISSION, CAST_IOERR_EXT_API13_NO_PERMISSION}, 455 {ERROR_CODE_IO_CLEARTEXT_NOT_PERMITTED, CAST_IOERR_EXT_API13_CLEARTEXT_NOT_PERMITTED}, 456 {ERROR_CODE_IO_READ_POSITION_OUT_OF_RANGE, CAST_IOERR_EXT_API13_READ_POSITION_OUT_OF_RANGE}, 457 {ERROR_CODE_IO_NO_CONTENTS, CAST_IOERR_EXT_API13_NO_CONTENTS}, 458 {ERROR_CODE_IO_READ_ERROR, CAST_IOERR_EXT_API13_READ_ERROR}, 459 {ERROR_CODE_IO_CONTENT_BUSY, CAST_IOERR_EXT_API13_CONTENT_BUSY}, 460 {ERROR_CODE_IO_CONTENT_EXPIRED, CAST_IOERR_EXT_API13_CONTENT_EXPIRED}, 461 {ERROR_CODE_IO_CONTENT_NON_ALLOWED_USE, CAST_IOERR_EXT_API13_CONTENT_NON_ALLOWED_USE}, 462 {ERROR_CODE_IO_CONTENT_CANNOT_VERIFIED, CAST_IOERR_EXT_API13_CONTENT_CANNOT_VERIFIED}, 463 {ERROR_CODE_IO_CONTENT_EXHAUSTED_ALLOWED_USES, CAST_IOERR_EXT_API13_CONTENT_EXHAUSTED_ALLOWED_USES}, 464 {ERROR_CODE_IO_NETWORK_PACKET_SENDING_FAILURE, CAST_IOERR_EXT_API13_NETWORK_PACKET_SENDING_FAILURE}, 465 // Content parsing errors 466 {ERROR_CODE_PARSING_UNSPECIFIED, CAST_PARSINGERR_EXT_API13_UNSPECIFIED}, 467 {ERROR_CODE_PARSING_CONTAINER_MALFORMED, CAST_PARSINGERR_EXT_API13_CONTAINER_MALFORMED}, 468 {ERROR_CODE_PARSING_MANIFEST_MALFORMED, CAST_PARSINGERR_EXT_API13_MANIFEST_MALFORMED}, 469 {ERROR_CODE_PARSING_CONTAINER_UNSUPPORTED, CAST_PARSINGERR_EXT_API13_CONTAINER_UNSUPPORTED}, 470 {ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED, CAST_PARSINGERR_EXT_API13_MANIFEST_UNSUPPORTED}, 471 // Decoding errors 472 {ERROR_CODE_DECODE_UNSPECIFIED, CAST_DECODEERR_EXT_API13_UNSPECIFIED}, 473 {ERROR_CODE_DECODER_INIT_FAILED, CAST_DECODEERR_EXT_API13_INIT_FAILED}, 474 {ERROR_CODE_DECODER_QUERY_FAILED, CAST_DECODEERR_EXT_API13_QUERY_FAILED}, 475 {ERROR_CODE_DECODING_FAILED, CAST_DECODEERR_EXT_API13_FAILED}, 476 {ERROR_CODE_DECODING_FORMAT_EXCEEDS_CAPABILITIES, CAST_DECODEERR_EXT_API13_FORMAT_EXCEEDS_CAPABILITIES}, 477 {ERROR_CODE_DECODING_FORMAT_UNSUPPORTED, CAST_DECODEERR_EXT_API13_FORMAT_UNSUPPORTED}, 478 // AudioRender errors 479 {ERROR_CODE_AUDIO_RENDERS_UNSPECIFIED, CAST_RENDERERR_EXT_API13_UNSPECIFIED}, 480 {ERROR_CODE_AUDIO_RENDERS_INIT_FAILED, CAST_RENDERERR_EXT_API13_INIT_FAILED}, 481 {ERROR_CODE_AUDIO_RENDERS_WRITE_FAILED, CAST_RENDERERR_EXT_API13_WRITE_FAILED}, 482 // DRM errors 483 {ERROR_CODE_DRM_UNSPECIFIED, CAST_DRMERR_EXT_API13_UNSPECIFIED}, 484 {ERROR_CODE_DRM_SCHEME_UNSUPPORTED, CAST_DRMERR_EXT_API13_SCHEME_UNSUPPORTED}, 485 {ERROR_CODE_DRM_PROVISIONING_FAILED, CAST_DRMERR_EXT_API13_PROVISIONING_FAILED}, 486 {ERROR_CODE_DRM_CONTENT_ERROR, CAST_DRMERR_EXT_API13_CONTENT_ERROR}, 487 {ERROR_CODE_DRM_LICENSE_ACQUISITION_FAILED, CAST_DRMERR_EXT_API13_LICENSE_ACQUISITION_FAILED}, 488 {ERROR_CODE_DRM_DISALLOWED_OPERATION, CAST_DRMERR_EXT_API13_DISALLOWED_OPERATION}, 489 {ERROR_CODE_DRM_SYSTEM_ERROR, CAST_DRMERR_EXT_API13_SYSTEM_ERROR}, 490 {ERROR_CODE_DRM_DEVICE_REVOKED, CAST_DRMERR_EXT_API13_DEVICE_REVOKED}, 491 {ERROR_CODE_DRM_LICENSE_EXPIRED, CAST_DRMERR_EXT_API13_LICENSE_EXPIRED}, 492 {ERROR_CODE_DRM_PROVIDE_KEY_RESPONSE_ERROR, CAST_DRMERR_EXT_API13_PROVIDE_KEY_RESPONSE_ERROR}, 493 }; 494 495 NapiAVCastControllerCallback(); 496 ~NapiAVCastControllerCallback() override; 497 498 void OnCastPlaybackStateChange(const AVPlaybackState& state) override; 499 void OnMediaItemChange(const AVQueueItem& avQueueItem) override; 500 void OnPlayNext() override; 501 void OnPlayPrevious() override; 502 void OnSeekDone(const int32_t seekNumber) override; 503 void OnVideoSizeChange(const int32_t width, const int32_t height) override; 504 void OnPlayerError(const int32_t errorCode, const std::string& errorMsg) override; 505 void OnEndOfStream(const int32_t isLooping) override; 506 void OnPlayRequest(const AVQueueItem& avQueueItem) override; 507 void OnKeyRequest(const std::string &assetId, const std::vector<uint8_t> &keyRequestData) override; 508 void OnCastValidCommandChanged(const std::vector<int32_t>& cmds) override; 509 int32_t onDataSrcRead(const std::shared_ptr<AVSharedMemoryBase>& mem, uint32_t length, 510 int64_t pos, int32_t& result) override; 511 void OnCustomData(const AAFwk::WantParams& data) override; 512 513 bool IsCallbacksEmpty(int32_t event); 514 515 napi_status saveDataSrc(napi_env env, napi_value avQueueItem); 516 int32_t readDataSrc(napi_env env, const std::shared_ptr<AVSharedMemoryBase>& mem, uint32_t length, 517 int64_t pos, int32_t& result); 518 519 napi_env env_ = nullptr; 520 napi_ref dataSrcRef_ {}; 521 522 napi_status AddCallback(napi_env env, int32_t event, napi_value callback); 523 napi_status RemoveCallback(napi_env env, int32_t event, napi_value callback); 524 525 private: 526 void HandleEvent(int32_t event); 527 void HandlePlayerErrorAPI13(const int32_t errorCode, const std::string& errorMsg); 528 529 std::function<bool()> CheckCallbackValid(int32_t event, const std::list<napi_ref>::iterator& ref); 530 531 template<typename T> 532 void HandleEvent(int32_t event, const T& param); 533 534 template<typename T> 535 void HandleEvent(int32_t event, const std::string& firstParam, const T& secondParam); 536 537 template<typename T> 538 void HandleEvent(int32_t event, const int32_t firstParam, const T& secondParam); 539 540 void HandleEvent(int32_t event, const int32_t firstParam, const int32_t secondParam, const int32_t thirdParam); 541 542 void HandleErrorEvent(int32_t event, const int32_t errorCode, const std::string& errorMsg); 543 544 static void threadSafeReadDataSrcCb(napi_env env, napi_value js_cb, void* context, void* data); 545 546 struct DataContextForThreadSafe { 547 napi_ref& callback; 548 std::uint8_t* buffer; 549 uint32_t length; 550 int64_t pos; 551 int32_t* result; 552 std::condition_variable& dataSrcSyncCond; 553 }; 554 555 std::mutex lock_; 556 std::shared_ptr<NapiAsyncCallback> asyncCallback_; 557 std::list<napi_ref> callbacks_[EVENT_CAST_TYPE_MAX] {}; 558 std::shared_ptr<bool> isValid_; 559 560 std::mutex dataSrcSyncLock_; 561 std::condition_variable dataSrcSyncCond_; 562 napi_threadsafe_function threadSafeReadDataSrcFunc_ = nullptr; 563 }; 564 } // namespace OHOS::AVSession 565 #endif // OHOS_NAPI_AVCAST_CONTROLLER_CALLBACK_H 566