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