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 }