1 /*
2  * Copyright (C) 2021 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 VIDEO_PLAYER_NAPI_H_
17 #define VIDEO_PLAYER_NAPI_H_
18 
19 #include "player.h"
20 #include "media_errors.h"
21 #include "napi/native_api.h"
22 #include "napi/native_node_api.h"
23 #include "common_napi.h"
24 #include "audio_info.h"
25 
26 namespace OHOS {
27 namespace Media {
28 class VideoPlayerNapi {
29 public:
30     static napi_value Init(napi_env env, napi_value exports);
31 
32 private:
33     static napi_value Constructor(napi_env env, napi_callback_info info);
34     static void Destructor(napi_env env, void *nativeObject, void *finalize);
35     /**
36      * createVideoPlayer(callback: AsyncCallback<VideoPlayer>): void
37      * createVideoPlayer(): Promise<VideoPlayer>
38      */
39     static napi_value CreateVideoPlayer(napi_env env, napi_callback_info info);
40     /**
41      * setDisplaySurface(surfaceId: string, callback: AsyncCallback<void>): void
42      * setDisplaySurface(surfaceId: string): Promise<void>
43      */
44     static napi_value SetDisplaySurface(napi_env env, napi_callback_info info);
45     /**
46      * prepare(callback: AsyncCallback<void>): void
47      * prepare(): Promise<void>
48      */
49     static napi_value Prepare(napi_env env, napi_callback_info info);
50     /**
51      * play(callback: AsyncCallback<void>): void
52      * play(): Promise<void>
53      */
54     static napi_value Play(napi_env env, napi_callback_info info);
55     /**
56      * pause(callback: AsyncCallback<void>): void
57      * pause(): Promise<void>
58      */
59     static napi_value Pause(napi_env env, napi_callback_info info);
60     /**
61      * stop(callback: AsyncCallback<void>): void
62      * stop(): Promise<void>
63      */
64     static napi_value Stop(napi_env env, napi_callback_info info);
65     /**
66      * reset(callback: AsyncCallback<void>): void
67      * reset(): Promise<void>
68      */
69     static napi_value Reset(napi_env env, napi_callback_info info);
70     /**
71      * release(callback: AsyncCallback<void>): void
72      * release(): Promise<void>
73      */
74     static napi_value Release(napi_env env, napi_callback_info info);
75     /**
76      * seek(timeMs: number, callback:AsyncCallback<number>): void
77      * seek(timeMs: number, mode:SeekMode, callback:AsyncCallback<number>): void
78      * seek(timeMs: number): Promise<number>
79      * seek(timeMs: number, mode:SeekMode): Promise<number>
80      */
81     static napi_value Seek(napi_env env, napi_callback_info info);
82     /**
83      * setSpeed(speed: number, callback:AsyncCallback<number>): void
84      * setSpeed(speed: number): Promise<number>
85      */
86     static napi_value SetSpeed(napi_env env, napi_callback_info info);
87     /**
88      * setVolume(vol: number, callback:AsyncCallback<void>): void
89      * setVolume(vol: number): Promise<void>
90      */
91     static napi_value SetVolume(napi_env env, napi_callback_info info);
92 
93     /**
94      * SelectBitrate(bitRate: number, callback:AsyncCallback<number>): void
95      * SelectBitrate(bitRate: number): Promise<number>
96      */
97     static napi_value SelectBitrate(napi_env env, napi_callback_info info);
98 
99     /**
100      * url: string
101      */
102     static napi_value SetUrl(napi_env env, napi_callback_info info);
103     static napi_value GetUrl(napi_env env, napi_callback_info info);
104     /**
105      * dataSrc?: AVDataSource
106      */
107     static napi_value GetDataSrc(napi_env env, napi_callback_info info);
108     static napi_value SetDataSrc(napi_env env, napi_callback_info info);
109     /**
110      * fdSrc: AVFileDescriptor
111      */
112     static napi_value GetFdSrc(napi_env env, napi_callback_info info);
113     static napi_value SetFdSrc(napi_env env, napi_callback_info info);
114     /**
115      * loop: boolenan
116      */
117     static napi_value SetLoop(napi_env env, napi_callback_info info);
118     static napi_value GetLoop(napi_env env, napi_callback_info info);
119 
120     /**
121      * videoScaleType?: VideoScaleType
122      */
123     static napi_value SetVideoScaleType(napi_env env, napi_callback_info info);
124     static napi_value GetVideoScaleType(napi_env env, napi_callback_info info);
125 
126     /**
127      * audioInterruptMode?: audio.AudioInterruptMode
128      */
129     static napi_value GetAudioInterruptMode(napi_env env, napi_callback_info info);
130     static napi_value SetAudioInterruptMode(napi_env env, napi_callback_info info);
131     /**
132      * readonly currentTime: number
133      */
134     static napi_value GetCurrentTime(napi_env env, napi_callback_info info);
135     /**
136      * readonly duration: number
137      */
138     static napi_value GetDuration(napi_env env, napi_callback_info info);
139     /**
140      * readonly state: VideoPlayState
141      */
142     static napi_value GetState(napi_env env, napi_callback_info info);
143     /**
144      * readonly width: number
145      */
146     static napi_value GetWidth(napi_env env, napi_callback_info info);
147     /**
148      * readonly height: number
149      */
150     static napi_value GetHeight(napi_env env, napi_callback_info info);
151     /**
152      * getTrackDescription(callback:AsyncCallback<Array<MediaDescription>>): void
153      * getTrackDescription(): Promise<Array<MediaDescription>>
154      */
155     static napi_value GetTrackDescription(napi_env env, napi_callback_info info);
156     /**
157      * on(type: 'playbackCompleted', callback: Callback<void>): void
158      * on(type: 'bufferingUpdate', callback: (infoType: BufferingInfoType, valut: number) => void): void
159      * on(type: 'startRenderFrame', callback: Callback<void>): void
160      * on(type: 'videoSizeChanged', callback: (width: number, height: number)) => void): void
161      * on(type: 'error', callback: ErrorCallback): void
162      */
163     static napi_value On(napi_env env, napi_callback_info info);
164     static void AsyncGetTrackDescription(napi_env env, void *data);
165     static void AsyncSetDisplaySurface(napi_env env, void *data);
166     static void CompleteAsyncWork(napi_env env, napi_status status, void *data);
167     static int32_t ProcessWork(napi_env env, napi_status status, void *data);
168     void ErrorCallback(MediaServiceExtErrCode errCode, std::string errMsg = "unknown");
169     void SetCallbackReference(const std::string &callbackName, std::shared_ptr<AutoRef> ref);
170     void CancelCallback();
171     VideoPlayerNapi();
172     ~VideoPlayerNapi();
173 
174     static thread_local napi_ref constructor_;
175     napi_env env_ = nullptr;
176     std::shared_ptr<Player> nativePlayer_ = nullptr;
177     std::shared_ptr<PlayerCallback> jsCallback_ = nullptr;
178     std::string url_ = "";
179     int32_t videoScaleType_ = 0;
180     std::vector<Format> videoTrackInfoVec_;
181     AVFileDescriptor rawFd_;
182     OHOS::AudioStandard::InterruptMode interruptMode_ = AudioStandard::InterruptMode::SHARE_MODE;
183     std::map<std::string, std::shared_ptr<AutoRef>> refMap_;
184 };
185 } // namespace Media
186 } // namespace OHOS
187 #endif // VIDEO_PLAYER_NAPI_H_
188