• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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