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