1 /*
2  * Copyright (c) 2024 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 #include "cj_video_ffi.h"
17 
18 #include <cinttypes>
19 
20 #include "base/json/json_util.h"
21 #include "cj_lambda.h"
22 #include "bridge/cj_frontend/interfaces/cj_ffi/utils.h"
23 
24 using namespace OHOS::Ace;
25 using namespace OHOS::FFI;
26 using namespace OHOS::Ace::Framework;
27 
28 namespace OHOS::Ace::Framework {
NativeVideoController()29 NativeVideoController::NativeVideoController() : FFIData()
30 {
31     RefPtr<VideoControllerV2> controller = AceType::MakeRefPtr<VideoControllerV2>();
32     SetController(controller);
33     LOGI("NativeVideoController constructed: %{public}" PRId64, GetID());
34 }
35 
Start()36 void NativeVideoController::Start()
37 {
38     if (videoController_) {
39         videoController_->Start();
40     }
41 }
42 
Pause()43 void NativeVideoController::Pause()
44 {
45     if (videoController_) {
46         videoController_->Pause();
47     }
48 }
49 
Stop()50 void NativeVideoController::Stop()
51 {
52     if (videoController_) {
53         videoController_->Stop();
54     }
55 }
56 
SetCurrentTime(int32_t time,int32_t seekMode)57 void NativeVideoController::SetCurrentTime(int32_t time, int32_t seekMode)
58 {
59     double value = (double)time;
60     SeekMode mode = static_cast<SeekMode>(seekMode);
61     if (videoController_) {
62         videoController_->SeekTo(value, mode);
63     }
64 }
65 
RequestFullscreen(bool fullScreen)66 void NativeVideoController::RequestFullscreen(bool fullScreen)
67 {
68     if (videoController_) {
69         videoController_->RequestFullscreen(fullScreen);
70     }
71 }
72 
ExitFullscreen()73 void NativeVideoController::ExitFullscreen()
74 {
75     if (videoController_) {
76         videoController_->ExitFullscreen(false);
77     }
78 }
79 } // namespace OHOS::Ace::Framework
80 
81 extern "C" {
FfiOHOSAceFrameworkVideoCreate(const char * src,double progressRate,const char * preview,int64_t controllerId)82 void FfiOHOSAceFrameworkVideoCreate(const char* src, double progressRate, const char* preview, int64_t controllerId)
83 {
84     auto controller = FFIData::GetData<NativeVideoController>(controllerId);
85     if (controller) {
86         VideoModel::GetInstance()->Create(controller->GetController());
87         VideoModel::GetInstance()->SetSrc(src, "", "");
88         VideoModel::GetInstance()->SetProgressRate(progressRate);
89         VideoModel::GetInstance()->SetPosterSourceInfo(preview, "", "");
90     } else {
91         LOGE("video controller id is invalid");
92     }
93 }
94 
FfiOHOSAceFrameworkVideoMuted(bool muted)95 void FfiOHOSAceFrameworkVideoMuted(bool muted)
96 {
97     VideoModel::GetInstance()->SetMuted(muted);
98 }
99 
FfiOHOSAceFrameworkVideoAutoPlay(bool autoPlay)100 void FfiOHOSAceFrameworkVideoAutoPlay(bool autoPlay)
101 {
102     VideoModel::GetInstance()->SetAutoPlay(autoPlay);
103 }
104 
FfiOHOSAceFrameworkVideoControls(bool controls)105 void FfiOHOSAceFrameworkVideoControls(bool controls)
106 {
107     VideoModel::GetInstance()->SetControls(controls);
108 }
109 
FfiOHOSAceFrameworkVideoObjectFit(int32_t objectFit)110 void FfiOHOSAceFrameworkVideoObjectFit(int32_t objectFit)
111 {
112     VideoModel::GetInstance()->SetObjectFit(static_cast<ImageFit>(objectFit));
113 }
114 
FfiOHOSAceFrameworkVideoLoop(bool loop)115 void FfiOHOSAceFrameworkVideoLoop(bool loop)
116 {
117     VideoModel::GetInstance()->SetLoop(loop);
118 }
119 
FfiOHOSAceFrameworkVideoOnStart(void (* callback)(const char * value))120 void FfiOHOSAceFrameworkVideoOnStart(void (*callback)(const char* value))
121 {
122     auto func = [ffiCallback = CJLambda::Create(callback)](const std::string& param) { ffiCallback(param.c_str()); };
123     VideoModel::GetInstance()->SetOnStart(std::move(func));
124 }
125 
FfiOHOSAceFrameworkVideoOnPause(void (* callback)(const char * value))126 void FfiOHOSAceFrameworkVideoOnPause(void (*callback)(const char* value))
127 {
128     auto func = [ffiCallback = CJLambda::Create(callback)](const std::string& param) { ffiCallback(param.c_str()); };
129     VideoModel::GetInstance()->SetOnPause(std::move(func));
130 }
131 
FfiOHOSAceFrameworkVideoOnFinish(void (* callback)(const char * value))132 void FfiOHOSAceFrameworkVideoOnFinish(void (*callback)(const char* value))
133 {
134     auto func = [ffiCallback = CJLambda::Create(callback)](const std::string& param) { ffiCallback(param.c_str()); };
135     VideoModel::GetInstance()->SetOnFinish(std::move(func));
136 }
137 
FfiOHOSAceFrameworkVideoOnError(void (* callback)(const char * value))138 void FfiOHOSAceFrameworkVideoOnError(void (*callback)(const char* value))
139 {
140     auto func = [ffiCallback = CJLambda::Create(callback)](const std::string& param) { ffiCallback(param.c_str()); };
141     VideoModel::GetInstance()->SetOnError(std::move(func));
142 }
143 
FfiOHOSAceFrameworkVideoOnPrepared(void (* callback)(int32_t value))144 void FfiOHOSAceFrameworkVideoOnPrepared(void (*callback)(int32_t value))
145 {
146     auto func = [ffiCallback = CJLambda::Create(callback)](const std::string& param) {
147         auto json = JsonUtil::ParseJsonString(param);
148         if (!json || !json->IsValid()) {
149             LOGE("json is invalid");
150             return;
151         }
152         auto res = json->GetValue("duration")->GetInt();
153         ffiCallback(res);
154     };
155     VideoModel::GetInstance()->SetOnPrepared(std::move(func));
156 }
157 
FfiOHOSAceFrameworkVideoOnSeeking(void (* callback)(int32_t value))158 void FfiOHOSAceFrameworkVideoOnSeeking(void (*callback)(int32_t value))
159 {
160     auto func = [ffiCallback = CJLambda::Create(callback)](const std::string& param) {
161         auto json = JsonUtil::ParseJsonString(param);
162         if (!json || !json->IsValid()) {
163             LOGE("json is invalid");
164             return;
165         }
166         auto res = json->GetValue("time")->GetInt();
167         ffiCallback(res);
168     };
169     VideoModel::GetInstance()->SetOnSeeking(std::move(func));
170 }
171 
FfiOHOSAceFrameworkVideoOnSeeked(void (* callback)(int32_t value))172 void FfiOHOSAceFrameworkVideoOnSeeked(void (*callback)(int32_t value))
173 {
174     auto func = [ffiCallback = CJLambda::Create(callback)](const std::string& param) {
175         auto json = JsonUtil::ParseJsonString(param);
176         if (!json || !json->IsValid()) {
177             LOGE("json is invalid");
178             return;
179         }
180         auto res = json->GetValue("time")->GetInt();
181         ffiCallback(res);
182     };
183     VideoModel::GetInstance()->SetOnSeeked(std::move(func));
184 }
185 
FfiOHOSAceFrameworkVideoOnUpdate(void (* callback)(int32_t value))186 void FfiOHOSAceFrameworkVideoOnUpdate(void (*callback)(int32_t value))
187 {
188     auto func = [ffiCallback = CJLambda::Create(callback)](const std::string& param) {
189         auto json = JsonUtil::ParseJsonString(param);
190         if (!json || !json->IsValid()) {
191             LOGE("json is invalid");
192             return;
193         }
194         auto res = json->GetValue("time")->GetInt();
195         ffiCallback(res);
196     };
197     VideoModel::GetInstance()->SetOnUpdate(std::move(func));
198 }
199 
FfiOHOSAceFrameworkVideoOnFullscreenChange(void (* callback)(bool value))200 void FfiOHOSAceFrameworkVideoOnFullscreenChange(void (*callback)(bool value))
201 {
202     auto func = [ffiCallback = CJLambda::Create(callback)](const std::string& param) {
203         auto json = JsonUtil::ParseJsonString(param);
204         if (!json || !json->IsValid()) {
205             LOGE("json is invalid");
206             return;
207         }
208         auto res = json->GetValue("fullscreen")->GetBool();
209         ffiCallback(res);
210     };
211     VideoModel::GetInstance()->SetOnFullScreenChange(std::move(func));
212 }
213 
FfiOHOSAceFrameworkVideoControllerCreate()214 int64_t FfiOHOSAceFrameworkVideoControllerCreate()
215 {
216     auto controller = FFIData::Create<NativeVideoController>();
217     if (controller == nullptr) {
218         return FFI_ERROR_CODE;
219     }
220     return controller->GetID();
221 }
222 
FfiOHOSAceFrameworkVideoControllerStart(int64_t selfID)223 void FfiOHOSAceFrameworkVideoControllerStart(int64_t selfID)
224 {
225     auto self = FFIData::GetData<NativeVideoController>(selfID);
226     if (self) {
227         self->Start();
228     } else {
229         LOGE("invalid video controller id");
230     }
231 }
232 
FfiOHOSAceFrameworkVideoControllerPause(int64_t selfID)233 void FfiOHOSAceFrameworkVideoControllerPause(int64_t selfID)
234 {
235     auto self = FFIData::GetData<NativeVideoController>(selfID);
236     if (self) {
237         self->Pause();
238     } else {
239         LOGE("invalid video controller id");
240     }
241 }
242 
FfiOHOSAceFrameworkVideoControllerStop(int64_t selfID)243 void FfiOHOSAceFrameworkVideoControllerStop(int64_t selfID)
244 {
245     auto self = FFIData::GetData<NativeVideoController>(selfID);
246     if (self) {
247         self->Stop();
248     } else {
249         LOGE("invalid video controller id");
250     }
251 }
252 
FfiOHOSAceFrameworkVideoControllerSetCurrentTime(int32_t time,int32_t seekMode,int64_t selfID)253 void FfiOHOSAceFrameworkVideoControllerSetCurrentTime(int32_t time, int32_t seekMode, int64_t selfID)
254 {
255     auto self = FFIData::GetData<NativeVideoController>(selfID);
256     if (self) {
257         self->SetCurrentTime(time, seekMode);
258     } else {
259         LOGE("invalid video controller id");
260     }
261 }
262 
FfiOHOSAceFrameworkVideoControllerRequestFullscreen(bool fullScreen,int64_t selfID)263 void FfiOHOSAceFrameworkVideoControllerRequestFullscreen(bool fullScreen, int64_t selfID)
264 {
265     auto self = FFIData::GetData<NativeVideoController>(selfID);
266     if (self) {
267         self->RequestFullscreen(fullScreen);
268     } else {
269         LOGE("invalid video controller id");
270     }
271 }
272 
FfiOHOSAceFrameworkVideoControllerExitFullscreen(int64_t selfID)273 void FfiOHOSAceFrameworkVideoControllerExitFullscreen(int64_t selfID)
274 {
275     auto self = FFIData::GetData<NativeVideoController>(selfID);
276     if (self) {
277         self->ExitFullscreen();
278     } else {
279         LOGE("invalid video controller id");
280     }
281 }
282 }