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 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_video_bridge.h"
16
17 #include "bridge/common/utils/engine_helper.h"
18 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
19 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
20 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
21 #include "bridge/declarative_frontend/jsview/js_utils.h"
22 #include "core/components/common/layout/constants.h"
23
24 namespace OHOS::Ace::NG {
25 constexpr int32_t NUM_0 = 0;
26 constexpr int32_t NUM_1 = 1;
27
28 namespace {
ParseColorMetricsToColor(const EcmaVM * vm,const Local<JSValueRef> & jsValue,Color & result)29 bool ParseColorMetricsToColor(const EcmaVM* vm, const Local<JSValueRef>& jsValue, Color& result)
30 {
31 if (!jsValue->IsObject(vm)) {
32 return false;
33 }
34 auto obj = jsValue->ToObject(vm);
35 auto toNumericProp = obj->Get(vm, "toNumeric");
36 if (toNumericProp->IsFunction(vm)) {
37 panda::Local<panda::FunctionRef> func = toNumericProp;
38 auto colorVal = func->Call(vm, obj, nullptr, 0);
39 result.SetValue(colorVal->Uint32Value(vm));
40 return true;
41 }
42 return false;
43 }
44 } // namespace
45
SetAutoPlay(ArkUIRuntimeCallInfo * runtimeCallInfo)46 ArkUINativeModuleValue VideoBridge::SetAutoPlay(ArkUIRuntimeCallInfo* runtimeCallInfo)
47 {
48 EcmaVM* vm = runtimeCallInfo->GetVM();
49 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
50 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
51 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
52 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
53 if (secondArg->IsBoolean()) {
54 uint32_t autoPlay = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
55 GetArkUINodeModifiers()->getVideoModifier()->setAutoPlay(nativeNode, autoPlay);
56 } else {
57 GetArkUINodeModifiers()->getVideoModifier()->resetAutoPlay(nativeNode);
58 }
59 return panda::JSValueRef::Undefined(vm);
60 }
61
ResetAutoPlay(ArkUIRuntimeCallInfo * runtimeCallInfo)62 ArkUINativeModuleValue VideoBridge::ResetAutoPlay(ArkUIRuntimeCallInfo* runtimeCallInfo)
63 {
64 EcmaVM* vm = runtimeCallInfo->GetVM();
65 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
66 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
67 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
68 GetArkUINodeModifiers()->getVideoModifier()->resetAutoPlay(nativeNode);
69 return panda::JSValueRef::Undefined(vm);
70 }
71
SetControls(ArkUIRuntimeCallInfo * runtimeCallInfo)72 ArkUINativeModuleValue VideoBridge::SetControls(ArkUIRuntimeCallInfo* runtimeCallInfo)
73 {
74 EcmaVM* vm = runtimeCallInfo->GetVM();
75 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
76 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
77 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
78 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
79 if (secondArg->IsBoolean()) {
80 uint32_t controlsValue = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
81 GetArkUINodeModifiers()->getVideoModifier()->setVideoControls(nativeNode, controlsValue);
82 } else {
83 GetArkUINodeModifiers()->getVideoModifier()->resetVideoControls(nativeNode);
84 }
85 return panda::JSValueRef::Undefined(vm);
86 }
87
ResetControls(ArkUIRuntimeCallInfo * runtimeCallInfo)88 ArkUINativeModuleValue VideoBridge::ResetControls(ArkUIRuntimeCallInfo* runtimeCallInfo)
89 {
90 EcmaVM* vm = runtimeCallInfo->GetVM();
91 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
92 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
93 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
94 GetArkUINodeModifiers()->getVideoModifier()->resetVideoControls(nativeNode);
95 return panda::JSValueRef::Undefined(vm);
96 }
97
SetObjectFit(ArkUIRuntimeCallInfo * runtimeCallInfo)98 ArkUINativeModuleValue VideoBridge::SetObjectFit(ArkUIRuntimeCallInfo* runtimeCallInfo)
99 {
100 EcmaVM* vm = runtimeCallInfo->GetVM();
101 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
102 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
103 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
104 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
105 if (secondArg->IsInt()) {
106 int32_t imageFit = secondArg->Int32Value(vm);
107 GetArkUINodeModifiers()->getVideoModifier()->setVideoObjectFit(nativeNode, imageFit);
108 } else {
109 GetArkUINodeModifiers()->getVideoModifier()->resetVideoObjectFit(nativeNode);
110 }
111 return panda::JSValueRef::Undefined(vm);
112 }
113
ResetObjectFit(ArkUIRuntimeCallInfo * runtimeCallInfo)114 ArkUINativeModuleValue VideoBridge::ResetObjectFit(ArkUIRuntimeCallInfo* runtimeCallInfo)
115 {
116 EcmaVM* vm = runtimeCallInfo->GetVM();
117 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
118 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
119 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
120 GetArkUINodeModifiers()->getVideoModifier()->resetVideoObjectFit(nativeNode);
121 return panda::JSValueRef::Undefined(vm);
122 }
123
SetLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)124 ArkUINativeModuleValue VideoBridge::SetLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
125 {
126 EcmaVM* vm = runtimeCallInfo->GetVM();
127 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
128 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
129 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
130 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
131 if (secondArg->IsBoolean()) {
132 uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
133 GetArkUINodeModifiers()->getVideoModifier()->setVideoLoop(nativeNode, value);
134 } else {
135 GetArkUINodeModifiers()->getVideoModifier()->resetVideoLoop(nativeNode);
136 }
137 return panda::JSValueRef::Undefined(vm);
138 }
139
ResetLoop(ArkUIRuntimeCallInfo * runtimeCallInfo)140 ArkUINativeModuleValue VideoBridge::ResetLoop(ArkUIRuntimeCallInfo* runtimeCallInfo)
141 {
142 EcmaVM* vm = runtimeCallInfo->GetVM();
143 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
144 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
145 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
146 GetArkUINodeModifiers()->getVideoModifier()->resetVideoLoop(nativeNode);
147 return panda::JSValueRef::Undefined(vm);
148 }
149
SetMuted(ArkUIRuntimeCallInfo * runtimeCallInfo)150 ArkUINativeModuleValue VideoBridge::SetMuted(ArkUIRuntimeCallInfo* runtimeCallInfo)
151 {
152 EcmaVM* vm = runtimeCallInfo->GetVM();
153 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
154 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
155 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
156 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
157 if (secondArg->IsBoolean()) {
158 uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
159 GetArkUINodeModifiers()->getVideoModifier()->setVideoMuted(nativeNode, value);
160 } else {
161 GetArkUINodeModifiers()->getVideoModifier()->resetVideoMuted(nativeNode);
162 }
163 return panda::JSValueRef::Undefined(vm);
164 }
165
ResetMuted(ArkUIRuntimeCallInfo * runtimeCallInfo)166 ArkUINativeModuleValue VideoBridge::ResetMuted(ArkUIRuntimeCallInfo* runtimeCallInfo)
167 {
168 EcmaVM* vm = runtimeCallInfo->GetVM();
169 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
170 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
171 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
172 GetArkUINodeModifiers()->getVideoModifier()->resetVideoMuted(nativeNode);
173 return panda::JSValueRef::Undefined(vm);
174 }
175
SetOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)176 ArkUINativeModuleValue VideoBridge::SetOpacity(ArkUIRuntimeCallInfo* runtimeCallInfo)
177 {
178 EcmaVM* vm = runtimeCallInfo->GetVM();
179 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
180 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
181 Local<JSValueRef> opacityArg = runtimeCallInfo->GetCallArgRef(1);
182 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
183 double opacity;
184 if (!ArkTSUtils::ParseJsDouble(vm, opacityArg, opacity)) {
185 GetArkUINodeModifiers()->getVideoModifier()->resetVideoOpacity(nativeNode);
186 } else {
187 GetArkUINodeModifiers()->getVideoModifier()->setVideoOpacity(nativeNode, static_cast<ArkUI_Float32>(opacity));
188 }
189 return panda::JSValueRef::Undefined(vm);
190 }
191
ResetOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)192 ArkUINativeModuleValue VideoBridge::ResetOpacity(ArkUIRuntimeCallInfo* runtimeCallInfo)
193 {
194 EcmaVM *vm = runtimeCallInfo->GetVM();
195 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
196 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
197 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
198 GetArkUINodeModifiers()->getVideoModifier()->resetVideoOpacity(nativeNode);
199 return panda::JSValueRef::Undefined(vm);
200 }
201
SetTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)202 ArkUINativeModuleValue VideoBridge::SetTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
203 {
204 EcmaVM* vm = runtimeCallInfo->GetVM();
205 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
206 CommonBridge::SetTransitionPassThrough(runtimeCallInfo);
207 return panda::JSValueRef::Undefined(vm);
208 }
209
ResetTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)210 ArkUINativeModuleValue VideoBridge::ResetTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
211 {
212 EcmaVM* vm = runtimeCallInfo->GetVM();
213 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
214 CommonBridge::ResetTransitionPassThrough(runtimeCallInfo);
215 return panda::JSValueRef::Undefined(vm);
216 }
217
SetVideoSurfaceBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)218 ArkUINativeModuleValue VideoBridge::SetVideoSurfaceBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
219 {
220 EcmaVM* vm = runtimeCallInfo->GetVM();
221 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
222 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
223 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
224 if (!firstArg->IsNativePointer(vm)) {
225 return panda::JSValueRef::Undefined(vm);
226 }
227 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
228 Color color;
229 if (!ParseColorMetricsToColor(vm, secondArg, color)) {
230 GetArkUINodeModifiers()->getVideoModifier()->resetVideoSurfaceBackgroundColor(nativeNode);
231 } else {
232 GetArkUINodeModifiers()->getVideoModifier()->setVideoSurfaceBackgroundColor(nativeNode, color.GetValue());
233 }
234 return panda::JSValueRef::Undefined(vm);
235 }
236
ResetVideoSurfaceBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)237 ArkUINativeModuleValue VideoBridge::ResetVideoSurfaceBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
238 {
239 EcmaVM* vm = runtimeCallInfo->GetVM();
240 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
241 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
242 if (!firstArg->IsNativePointer(vm)) {
243 return panda::JSValueRef::Undefined(vm);
244 }
245 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
246
247 GetArkUINodeModifiers()->getVideoModifier()->resetVideoSurfaceBackgroundColor(nativeNode);
248 return panda::JSValueRef::Undefined(vm);
249 }
250
SetShortcutKeyEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)251 ArkUINativeModuleValue VideoBridge::SetShortcutKeyEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
252 {
253 EcmaVM* vm = runtimeCallInfo->GetVM();
254 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
255 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
256 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
257 if (!firstArg->IsNativePointer(vm)) {
258 return panda::JSValueRef::Undefined(vm);
259 }
260 auto* nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
261 if (secondArg->IsBoolean()) {
262 uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
263 GetArkUINodeModifiers()->getVideoModifier()->setVideoShortcutKeyEnabled(nativeNode, value);
264 } else {
265 GetArkUINodeModifiers()->getVideoModifier()->resetVideoShortcutKeyEnabled(nativeNode);
266 }
267 return panda::JSValueRef::Undefined(vm);
268 }
269
ResetShortcutKeyEnabled(ArkUIRuntimeCallInfo * runtimeCallInfo)270 ArkUINativeModuleValue VideoBridge::ResetShortcutKeyEnabled(ArkUIRuntimeCallInfo* runtimeCallInfo)
271 {
272 EcmaVM* vm = runtimeCallInfo->GetVM();
273 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
274 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
275 if (!firstArg->IsNativePointer(vm)) {
276 return panda::JSValueRef::Undefined(vm);
277 }
278 auto* nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
279 GetArkUINodeModifiers()->getVideoModifier()->resetVideoShortcutKeyEnabled(nativeNode);
280 return panda::JSValueRef::Undefined(vm);
281 }
282
SetOnStart(ArkUIRuntimeCallInfo * runtimeCallInfo)283 ArkUINativeModuleValue VideoBridge::SetOnStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
284 {
285 EcmaVM* vm = runtimeCallInfo->GetVM();
286 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
287 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
288 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
289 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
290 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
291 GetArkUINodeModifiers()->getVideoModifier()->resetOnStart(nativeNode);
292 return panda::JSValueRef::Undefined(vm);
293 }
294 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
295 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
296 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
297 std::function<void(std::string&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
298 std::string& value) {
299 panda::LocalScope pandaScope(vm);
300 panda::TryCatch trycatch(vm);
301 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
302 const char* keys[] = { "start" };
303 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(value);
304 CHECK_NULL_VOID(argsPtr);
305 Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, argsPtr->GetString(keys[0]).c_str()) };
306 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
307 eventObject->SetNativePointerFieldCount(vm, 1);
308 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
309 panda::Local<panda::JSValueRef> params[1] = { eventObject };
310 func->Call(vm, func.ToLocal(), params, 1);
311 };
312 GetArkUINodeModifiers()->getVideoModifier()->setOnStart(nativeNode, reinterpret_cast<void*>(&callback));
313 return panda::JSValueRef::Undefined(vm);
314 }
315
ResetOnStart(ArkUIRuntimeCallInfo * runtimeCallInfo)316 ArkUINativeModuleValue VideoBridge::ResetOnStart(ArkUIRuntimeCallInfo* runtimeCallInfo)
317 {
318 EcmaVM* vm = runtimeCallInfo->GetVM();
319 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
320 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
321 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
322 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
323 GetArkUINodeModifiers()->getVideoModifier()->resetOnStart(nativeNode);
324 return panda::JSValueRef::Undefined(vm);
325 }
326
SetOnPause(ArkUIRuntimeCallInfo * runtimeCallInfo)327 ArkUINativeModuleValue VideoBridge::SetOnPause(ArkUIRuntimeCallInfo* runtimeCallInfo)
328 {
329 EcmaVM* vm = runtimeCallInfo->GetVM();
330 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
331 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
332 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
333 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
334 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
335 GetArkUINodeModifiers()->getVideoModifier()->resetOnPause(nativeNode);
336 return panda::JSValueRef::Undefined(vm);
337 }
338 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
339 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
340 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
341 std::function<void(std::string&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
342 std::string& value) {
343 panda::LocalScope pandaScope(vm);
344 panda::TryCatch trycatch(vm);
345 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
346 const char* keys[] = { "pause" };
347 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(value);
348 CHECK_NULL_VOID(argsPtr);
349 Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, argsPtr->GetString(keys[0]).c_str()) };
350 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
351 eventObject->SetNativePointerFieldCount(vm, 1);
352 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
353 panda::Local<panda::JSValueRef> params[1] = { eventObject };
354 func->Call(vm, func.ToLocal(), params, 1);
355 };
356 GetArkUINodeModifiers()->getVideoModifier()->setOnPause(nativeNode, reinterpret_cast<void*>(&callback));
357 return panda::JSValueRef::Undefined(vm);
358 }
359
ResetOnPause(ArkUIRuntimeCallInfo * runtimeCallInfo)360 ArkUINativeModuleValue VideoBridge::ResetOnPause(ArkUIRuntimeCallInfo* runtimeCallInfo)
361 {
362 EcmaVM* vm = runtimeCallInfo->GetVM();
363 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
364 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
365 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
366 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
367 GetArkUINodeModifiers()->getVideoModifier()->resetOnPause(nativeNode);
368 return panda::JSValueRef::Undefined(vm);
369 }
370
SetOnFinish(ArkUIRuntimeCallInfo * runtimeCallInfo)371 ArkUINativeModuleValue VideoBridge::SetOnFinish(ArkUIRuntimeCallInfo* runtimeCallInfo)
372 {
373 EcmaVM* vm = runtimeCallInfo->GetVM();
374 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
375 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
376 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
377 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
378 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
379 GetArkUINodeModifiers()->getVideoModifier()->resetOnFinish(nativeNode);
380 return panda::JSValueRef::Undefined(vm);
381 }
382 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
383 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
384 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
385 std::function<void(std::string&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
386 std::string& value) {
387 panda::LocalScope pandaScope(vm);
388 panda::TryCatch trycatch(vm);
389 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
390 const char* keys[] = { "finish" };
391 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(value);
392 CHECK_NULL_VOID(argsPtr);
393 Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, argsPtr->GetString(keys[0]).c_str()) };
394 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
395 eventObject->SetNativePointerFieldCount(vm, 1);
396 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
397 panda::Local<panda::JSValueRef> params[1] = { eventObject };
398 func->Call(vm, func.ToLocal(), params, 1);
399 };
400 GetArkUINodeModifiers()->getVideoModifier()->setOnFinish(nativeNode, reinterpret_cast<void*>(&callback));
401 return panda::JSValueRef::Undefined(vm);
402 }
403
ResetOnFinish(ArkUIRuntimeCallInfo * runtimeCallInfo)404 ArkUINativeModuleValue VideoBridge::ResetOnFinish(ArkUIRuntimeCallInfo* runtimeCallInfo)
405 {
406 EcmaVM* vm = runtimeCallInfo->GetVM();
407 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
408 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
409 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
410 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
411 GetArkUINodeModifiers()->getVideoModifier()->resetOnFinish(nativeNode);
412 return panda::JSValueRef::Undefined(vm);
413 }
414
SetOnFullscreenChange(ArkUIRuntimeCallInfo * runtimeCallInfo)415 ArkUINativeModuleValue VideoBridge::SetOnFullscreenChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
416 {
417 EcmaVM* vm = runtimeCallInfo->GetVM();
418 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
419 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
420 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
421 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
422 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
423 GetArkUINodeModifiers()->getVideoModifier()->resetOnFullscreenChange(nativeNode);
424 return panda::JSValueRef::Undefined(vm);
425 }
426 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
427 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
428 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
429 std::function<void(std::string&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
430 std::string& value) {
431 panda::LocalScope pandaScope(vm);
432 panda::TryCatch trycatch(vm);
433 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
434 const char* keys[] = { "fullscreen" };
435 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(value);
436 CHECK_NULL_VOID(argsPtr);
437 Local<JSValueRef> values[] = { panda::BooleanRef::New(vm, argsPtr->GetBool(keys[0])) };
438 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
439 eventObject->SetNativePointerFieldCount(vm, 1);
440 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
441 panda::Local<panda::JSValueRef> params[1] = { eventObject };
442 func->Call(vm, func.ToLocal(), params, 1);
443 };
444 GetArkUINodeModifiers()->getVideoModifier()->setOnFullscreenChange(nativeNode, reinterpret_cast<void*>(&callback));
445 return panda::JSValueRef::Undefined(vm);
446 }
447
ResetOnFullscreenChange(ArkUIRuntimeCallInfo * runtimeCallInfo)448 ArkUINativeModuleValue VideoBridge::ResetOnFullscreenChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
449 {
450 EcmaVM* vm = runtimeCallInfo->GetVM();
451 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
452 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
453 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
454 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
455 GetArkUINodeModifiers()->getVideoModifier()->resetOnFullscreenChange(nativeNode);
456 return panda::JSValueRef::Undefined(vm);
457 }
458
SetOnPrepared(ArkUIRuntimeCallInfo * runtimeCallInfo)459 ArkUINativeModuleValue VideoBridge::SetOnPrepared(ArkUIRuntimeCallInfo* runtimeCallInfo)
460 {
461 EcmaVM* vm = runtimeCallInfo->GetVM();
462 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
463 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
464 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
465 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
466 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
467 GetArkUINodeModifiers()->getVideoModifier()->resetOnPrepared(nativeNode);
468 return panda::JSValueRef::Undefined(vm);
469 }
470 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
471 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
472 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
473 std::function<void(std::string&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
474 std::string& value) {
475 panda::LocalScope pandaScope(vm);
476 panda::TryCatch trycatch(vm);
477 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
478 const char* keys[] = { "duration" };
479 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(value);
480 CHECK_NULL_VOID(argsPtr);
481 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, argsPtr->GetInt(keys[0])) };
482 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
483 eventObject->SetNativePointerFieldCount(vm, 1);
484 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
485 panda::Local<panda::JSValueRef> params[1] = { eventObject };
486 func->Call(vm, func.ToLocal(), params, 1);
487 };
488 GetArkUINodeModifiers()->getVideoModifier()->setOnPrepared(nativeNode, reinterpret_cast<void*>(&callback));
489 return panda::JSValueRef::Undefined(vm);
490 }
491
ResetOnPrepared(ArkUIRuntimeCallInfo * runtimeCallInfo)492 ArkUINativeModuleValue VideoBridge::ResetOnPrepared(ArkUIRuntimeCallInfo* runtimeCallInfo)
493 {
494 EcmaVM* vm = runtimeCallInfo->GetVM();
495 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
496 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
497 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
498 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
499 GetArkUINodeModifiers()->getVideoModifier()->resetOnPrepared(nativeNode);
500 return panda::JSValueRef::Undefined(vm);
501 }
502
SetOnSeeking(ArkUIRuntimeCallInfo * runtimeCallInfo)503 ArkUINativeModuleValue VideoBridge::SetOnSeeking(ArkUIRuntimeCallInfo* runtimeCallInfo)
504 {
505 EcmaVM* vm = runtimeCallInfo->GetVM();
506 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
507 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
508 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
509 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
510 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
511 GetArkUINodeModifiers()->getVideoModifier()->resetOnSeeking(nativeNode);
512 return panda::JSValueRef::Undefined(vm);
513 }
514 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
515 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
516 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
517 std::function<void(std::string&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
518 std::string& value) {
519 panda::LocalScope pandaScope(vm);
520 panda::TryCatch trycatch(vm);
521 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
522 const char* keys[] = { "time" };
523 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(value);
524 CHECK_NULL_VOID(argsPtr);
525 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, argsPtr->GetInt(keys[0])) };
526 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
527 eventObject->SetNativePointerFieldCount(vm, 1);
528 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
529 panda::Local<panda::JSValueRef> params[1] = { eventObject };
530 func->Call(vm, func.ToLocal(), params, 1);
531 };
532 GetArkUINodeModifiers()->getVideoModifier()->setOnSeeking(nativeNode, reinterpret_cast<void*>(&callback));
533 return panda::JSValueRef::Undefined(vm);
534 }
535
ResetOnSeeking(ArkUIRuntimeCallInfo * runtimeCallInfo)536 ArkUINativeModuleValue VideoBridge::ResetOnSeeking(ArkUIRuntimeCallInfo* runtimeCallInfo)
537 {
538 EcmaVM* vm = runtimeCallInfo->GetVM();
539 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
540 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
541 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
542 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
543 GetArkUINodeModifiers()->getVideoModifier()->resetOnSeeking(nativeNode);
544 return panda::JSValueRef::Undefined(vm);
545 }
546
SetOnSeeked(ArkUIRuntimeCallInfo * runtimeCallInfo)547 ArkUINativeModuleValue VideoBridge::SetOnSeeked(ArkUIRuntimeCallInfo* runtimeCallInfo)
548 {
549 EcmaVM* vm = runtimeCallInfo->GetVM();
550 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
551 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
552 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
553 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
554 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
555 GetArkUINodeModifiers()->getVideoModifier()->resetOnSeeked(nativeNode);
556 return panda::JSValueRef::Undefined(vm);
557 }
558 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
559 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
560 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
561 std::function<void(std::string&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
562 std::string& value) {
563 panda::LocalScope pandaScope(vm);
564 panda::TryCatch trycatch(vm);
565 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
566 const char* keys[] = { "time" };
567 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(value);
568 CHECK_NULL_VOID(argsPtr);
569 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, argsPtr->GetInt(keys[0])) };
570 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
571 eventObject->SetNativePointerFieldCount(vm, 1);
572 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
573 panda::Local<panda::JSValueRef> params[1] = { eventObject };
574 func->Call(vm, func.ToLocal(), params, 1);
575 };
576 GetArkUINodeModifiers()->getVideoModifier()->setOnSeeked(nativeNode, reinterpret_cast<void*>(&callback));
577 return panda::JSValueRef::Undefined(vm);
578 }
579
ResetOnSeeked(ArkUIRuntimeCallInfo * runtimeCallInfo)580 ArkUINativeModuleValue VideoBridge::ResetOnSeeked(ArkUIRuntimeCallInfo* runtimeCallInfo)
581 {
582 EcmaVM* vm = runtimeCallInfo->GetVM();
583 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
584 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
585 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
586 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
587 GetArkUINodeModifiers()->getVideoModifier()->resetOnSeeked(nativeNode);
588 return panda::JSValueRef::Undefined(vm);
589 }
590
SetOnUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)591 ArkUINativeModuleValue VideoBridge::SetOnUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
592 {
593 EcmaVM* vm = runtimeCallInfo->GetVM();
594 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
595 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
596 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
597 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
598 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
599 GetArkUINodeModifiers()->getVideoModifier()->resetOnUpdate(nativeNode);
600 return panda::JSValueRef::Undefined(vm);
601 }
602 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
603 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
604 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
605 std::function<void(std::string&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
606 std::string& value) {
607 panda::LocalScope pandaScope(vm);
608 panda::TryCatch trycatch(vm);
609 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
610 const char* keys[] = { "time" };
611 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(value);
612 CHECK_NULL_VOID(argsPtr);
613 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, argsPtr->GetInt(keys[0])) };
614 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
615 eventObject->SetNativePointerFieldCount(vm, 1);
616 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
617 panda::Local<panda::JSValueRef> params[1] = { eventObject };
618 func->Call(vm, func.ToLocal(), params, 1);
619 };
620 GetArkUINodeModifiers()->getVideoModifier()->setOnUpdate(nativeNode, reinterpret_cast<void*>(&callback));
621 return panda::JSValueRef::Undefined(vm);
622 }
623
ResetOnUpdate(ArkUIRuntimeCallInfo * runtimeCallInfo)624 ArkUINativeModuleValue VideoBridge::ResetOnUpdate(ArkUIRuntimeCallInfo* runtimeCallInfo)
625 {
626 EcmaVM* vm = runtimeCallInfo->GetVM();
627 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
628 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
629 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
630 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
631 GetArkUINodeModifiers()->getVideoModifier()->resetOnUpdate(nativeNode);
632 return panda::JSValueRef::Undefined(vm);
633 }
634
SetOnError(ArkUIRuntimeCallInfo * runtimeCallInfo)635 ArkUINativeModuleValue VideoBridge::SetOnError(ArkUIRuntimeCallInfo* runtimeCallInfo)
636 {
637 EcmaVM* vm = runtimeCallInfo->GetVM();
638 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
639 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
640 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
641 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
642 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
643 GetArkUINodeModifiers()->getVideoModifier()->resetOnError(nativeNode);
644 return panda::JSValueRef::Undefined(vm);
645 }
646 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
647 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
648 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
649 std::function<void(std::string&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
650 std::string& value) {
651 panda::LocalScope pandaScope(vm);
652 panda::TryCatch trycatch(vm);
653 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
654 const char* keys[] = { "code", "name", "message" };
655 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(value);
656 CHECK_NULL_VOID(argsPtr);
657 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, argsPtr->GetInt(keys[0])),
658 panda::StringRef::NewFromUtf8(vm, argsPtr->GetString(keys[1]).c_str()),
659 panda::StringRef::NewFromUtf8(vm, argsPtr->GetString(keys[2]).c_str()) };
660 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
661 eventObject->SetNativePointerFieldCount(vm, 1);
662 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
663 panda::Local<panda::JSValueRef> params[1] = { eventObject };
664 func->Call(vm, func.ToLocal(), params, 1);
665 };
666 GetArkUINodeModifiers()->getVideoModifier()->setOnError(nativeNode, reinterpret_cast<void*>(&callback));
667 return panda::JSValueRef::Undefined(vm);
668 }
669
ResetOnError(ArkUIRuntimeCallInfo * runtimeCallInfo)670 ArkUINativeModuleValue VideoBridge::ResetOnError(ArkUIRuntimeCallInfo* runtimeCallInfo)
671 {
672 EcmaVM* vm = runtimeCallInfo->GetVM();
673 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
674 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
675 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
676 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
677 GetArkUINodeModifiers()->getVideoModifier()->resetOnError(nativeNode);
678 return panda::JSValueRef::Undefined(vm);
679 }
680
SetOnStop(ArkUIRuntimeCallInfo * runtimeCallInfo)681 ArkUINativeModuleValue VideoBridge::SetOnStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
682 {
683 EcmaVM* vm = runtimeCallInfo->GetVM();
684 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
685 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
686 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
687 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
688 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
689 GetArkUINodeModifiers()->getVideoModifier()->resetOnStop(nativeNode);
690 return panda::JSValueRef::Undefined(vm);
691 }
692 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
693 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
694 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
695 std::function<void(std::string&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
696 std::string& value) {
697 panda::LocalScope pandaScope(vm);
698 panda::TryCatch trycatch(vm);
699 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
700 const char* keys[] = { "stop" };
701 std::unique_ptr<JsonValue> argsPtr = JsonUtil::ParseJsonString(value);
702 CHECK_NULL_VOID(argsPtr);
703 Local<JSValueRef> values[] = { panda::StringRef::NewFromUtf8(vm, argsPtr->GetString(keys[0]).c_str()) };
704 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
705 eventObject->SetNativePointerFieldCount(vm, 1);
706 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
707 panda::Local<panda::JSValueRef> params[1] = { eventObject };
708 func->Call(vm, func.ToLocal(), params, 1);
709 };
710 GetArkUINodeModifiers()->getVideoModifier()->setOnStop(nativeNode, reinterpret_cast<void*>(&callback));
711 return panda::JSValueRef::Undefined(vm);
712 }
713
ResetOnStop(ArkUIRuntimeCallInfo * runtimeCallInfo)714 ArkUINativeModuleValue VideoBridge::ResetOnStop(ArkUIRuntimeCallInfo* runtimeCallInfo)
715 {
716 EcmaVM* vm = runtimeCallInfo->GetVM();
717 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
718 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
719 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
720 CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm));
721 GetArkUINodeModifiers()->getVideoModifier()->resetOnStop(nativeNode);
722 return panda::JSValueRef::Undefined(vm);
723 }
724
SetEnableAnalyzer(ArkUIRuntimeCallInfo * runtimeCallInfo)725 ArkUINativeModuleValue VideoBridge::SetEnableAnalyzer(ArkUIRuntimeCallInfo* runtimeCallInfo)
726 {
727 EcmaVM* vm = runtimeCallInfo->GetVM();
728 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
729 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
730 Local<JSValueRef> flagArg = runtimeCallInfo->GetCallArgRef(1);
731 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
732 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
733 if (flagArg->IsUndefined() || !flagArg->IsBoolean()) {
734 GetArkUINodeModifiers()->getVideoModifier()->resetEnableAnalyzer(nativeNode);
735 return panda::JSValueRef::Undefined(vm);
736 }
737 bool flag = flagArg->ToBoolean(vm)->Value();
738 GetArkUINodeModifiers()->getVideoModifier()->setEnableAnalyzer(nativeNode, flag);
739 return panda::JSValueRef::Undefined(vm);
740 }
741
ResetEnableAnalyzer(ArkUIRuntimeCallInfo * runtimeCallInfo)742 ArkUINativeModuleValue VideoBridge::ResetEnableAnalyzer(ArkUIRuntimeCallInfo* runtimeCallInfo)
743 {
744 EcmaVM* vm = runtimeCallInfo->GetVM();
745 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
746 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
747 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
748 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
749 GetArkUINodeModifiers()->getVideoModifier()->resetEnableAnalyzer(nativeNode);
750 return panda::JSValueRef::Undefined(vm);
751 }
752
SetAnalyzerConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)753 ArkUINativeModuleValue VideoBridge::SetAnalyzerConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
754 {
755 EcmaVM* vm = runtimeCallInfo->GetVM();
756 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
757 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
758 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
759 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
760 Local<JSValueRef> configValue = runtimeCallInfo->GetCallArgRef(1);
761 JSValueWrapper valueWrapper = configValue;
762 auto engine = EngineHelper::GetCurrentEngine();
763 CHECK_NULL_RETURN(engine, panda::NativePointerRef::New(vm, nullptr));
764 NativeEngine* nativeEngine = engine->GetNativeEngine();
765 Framework::ScopeRAII scope(reinterpret_cast<napi_env>(nativeEngine));
766 napi_value nativeValue = nativeEngine->ValueToNapiValue(valueWrapper);
767 GetArkUINodeModifiers()->getVideoModifier()->setAnalyzerConfig(nativeNode, nativeValue);
768 return panda::JSValueRef::Undefined(vm);
769 }
770
ResetAnalyzerConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)771 ArkUINativeModuleValue VideoBridge::ResetAnalyzerConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
772 {
773 EcmaVM* vm = runtimeCallInfo->GetVM();
774 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
775 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
776 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
777 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
778 GetArkUINodeModifiers()->getVideoModifier()->resetAnalyzerConfig(nativeNode);
779 return panda::JSValueRef::Undefined(vm);
780 }
781 } // namespace OHOS::Ace::NG
782