• 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 #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