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 <cstdint>
17 #include <string>
18 #include "webview_javascript_execute_callback.h"
19 #include "webview_javascript_result_callback.h"
20 #include "native_arkweb_utils.h"
21 #include "native_interface_arkweb.h"
22 #include "cj_common_ffi.h"
23 #include "ffi_remote_data.h"
24 #include "application_context.h"
25 #include "webview_log.h"
26 #include "webview_utils.h"
27 #include "nweb_store_web_archive_callback.h"
28 #include "web_native_media_player.h"
29 #include "web_runtime_delegate.h"
30
31 namespace OHOS::Webview {
32
NativeMediaPlayerHandlerImpl(int32_t nwebId,std::shared_ptr<NWeb::NWebNativeMediaPlayerHandler> handler)33 NativeMediaPlayerHandlerImpl::NativeMediaPlayerHandlerImpl(
34 int32_t nwebId, std::shared_ptr<NWeb::NWebNativeMediaPlayerHandler> handler)
35 : nwebId_(nwebId), handler_(handler) {}
36
HandleVideoSizeChanged(double width,double height)37 void NativeMediaPlayerHandlerImpl::HandleVideoSizeChanged(double width, double height)
38 {
39 if (handler_) {
40 handler_->HandleVideoSizeChanged(width, height);
41 } else {
42 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleVideoSizeChanged is null");
43 }
44 }
45
HandleError(NWeb::MediaError error,const char * errorMessage)46 void NativeMediaPlayerHandlerImpl::HandleError(NWeb::MediaError error, const char* errorMessage)
47 {
48 if (handler_) {
49 handler_->HandleError(error, errorMessage);
50 } else {
51 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleError is null");
52 }
53 }
54
HandleSeekFinished()55 void NativeMediaPlayerHandlerImpl::HandleSeekFinished()
56 {
57 if (handler_) {
58 handler_->HandleSeekFinished();
59 } else {
60 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleSeekFinished is null");
61 }
62 }
63
HandleSeeking()64 void NativeMediaPlayerHandlerImpl::HandleSeeking()
65 {
66 if (handler_) {
67 handler_->HandleSeeking();
68 } else {
69 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleSeeking is null");
70 }
71 }
72
HandleFullScreenChanged(bool fullscreen)73 void NativeMediaPlayerHandlerImpl::HandleFullScreenChanged(bool fullscreen)
74 {
75 if (handler_) {
76 handler_->HandleFullScreenChanged(fullscreen);
77 } else {
78 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleFullScreenChanged is null");
79 }
80 }
81
HandleReadyStateChanged(NWeb::ReadyState state)82 void NativeMediaPlayerHandlerImpl::HandleReadyStateChanged(NWeb::ReadyState state)
83 {
84 if (handler_) {
85 handler_->HandleReadyStateChanged(state);
86 } else {
87 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleReadyStateChanged is null");
88 }
89 }
90
HandleNetworkStateChanged(NWeb::NetworkState state)91 void NativeMediaPlayerHandlerImpl::HandleNetworkStateChanged(NWeb::NetworkState state)
92 {
93 if (handler_) {
94 handler_->HandleNetworkStateChanged(state);
95 } else {
96 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleNetworkStateChanged is null");
97 }
98 }
99
HandleEnded()100 void NativeMediaPlayerHandlerImpl::HandleEnded()
101 {
102 if (handler_) {
103 handler_->HandleEnded();
104 } else {
105 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleEnded is null");
106 }
107 }
108
HandleBufferedEndTimeChanged(double bufferedEndTime)109 void NativeMediaPlayerHandlerImpl::HandleBufferedEndTimeChanged(double bufferedEndTime)
110 {
111 if (handler_) {
112 handler_->HandleBufferedEndTimeChanged(bufferedEndTime);
113 } else {
114 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleBufferedEndTimeChanged is null");
115 }
116 }
117
HandleTimeUpdate(double playTime)118 void NativeMediaPlayerHandlerImpl::NativeMediaPlayerHandlerImpl::HandleTimeUpdate(double playTime)
119 {
120 if (handler_) {
121 handler_->HandleTimeUpdate(playTime);
122 } else {
123 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleTimeUpdate is null");
124 }
125 }
126
HandleDurationChanged(double duration)127 void NativeMediaPlayerHandlerImpl::HandleDurationChanged(double duration)
128 {
129 if (handler_) {
130 handler_->HandleDurationChanged(duration);
131 } else {
132 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleDurationChanged is null");
133 }
134 }
135
HandlePlaybackRateChanged(double playbackRate)136 void NativeMediaPlayerHandlerImpl::HandlePlaybackRateChanged(double playbackRate)
137 {
138 if (handler_) {
139 handler_->HandlePlaybackRateChanged(playbackRate);
140 } else {
141 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandlePlaybackRateChanged is null");
142 }
143 }
144
HandleMutedChanged(bool muted)145 void NativeMediaPlayerHandlerImpl::HandleMutedChanged(bool muted)
146 {
147 if (handler_) {
148 handler_->HandleMutedChanged(muted);
149 } else {
150 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleMutedChanged is null");
151 }
152 }
153
HandleVolumeChanged(double volume)154 void NativeMediaPlayerHandlerImpl::HandleVolumeChanged(double volume)
155 {
156 if (handler_) {
157 handler_->HandleVolumeChanged(volume);
158 } else {
159 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleVolumeChanged is null");
160 }
161 }
162
HandleStatusChanged(NWeb::PlaybackStatus status)163 void NativeMediaPlayerHandlerImpl::HandleStatusChanged(NWeb::PlaybackStatus status)
164 {
165 if (handler_) {
166 handler_->HandleStatusChanged(status);
167 } else {
168 WEBVIEWLOGE("NativeMediaPlayerHandlerImpl::HandleStatusChanged is null");
169 }
170 }
171
172 // RemoteMediaPlayer
ExitFullScreen(int64_t id)173 void RemoteMediaPlayer::ExitFullScreen(int64_t id)
174 {
175 auto exitFullscreen = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgeExitFullscreen;
176 if (!exitFullscreen) {
177 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::ExitFullScreen is empty.");
178 return;
179 }
180 exitFullscreen(id);
181 }
182
EnterFullScreen(int64_t id)183 void RemoteMediaPlayer::EnterFullScreen(int64_t id)
184 {
185 auto enterFullscreen = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgeEnterFullscreen;
186 if (!enterFullscreen) {
187 WEBVIEWLOGE("RemoteMediaPlayer::EnterFullScreen is empty.");
188 return;
189 }
190 enterFullscreen(id);
191 }
192
Release(int64_t id)193 void RemoteMediaPlayer::Release(int64_t id)
194 {
195 auto release = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgeRelease;
196 if (!release) {
197 WEBVIEWLOGE("RemoteMediaPlayer::Release is empty.");
198 return;
199 }
200 release(id);
201 }
202
SetPlaybackRate(int64_t id,double playbackRate)203 void RemoteMediaPlayer::SetPlaybackRate(int64_t id, double playbackRate)
204 {
205 auto setPlaybackRate = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgeSetPlaybackRate;
206 if (!setPlaybackRate) {
207 WEBVIEWLOGE("RemoteMediaPlayer::SetPlaybackRate is empty.");
208 return;
209 }
210 setPlaybackRate(id, playbackRate);
211 }
212
SetMuted(int64_t id,bool isMuted)213 void RemoteMediaPlayer::SetMuted(int64_t id, bool isMuted)
214 {
215 auto setMuted = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgeSetMuted;
216 if (!setMuted) {
217 WEBVIEWLOGE("RemoteMediaPlayer::setMuted is empty.");
218 return;
219 }
220 setMuted(id, isMuted);
221 }
222
SetVolume(int64_t id,double volume)223 void RemoteMediaPlayer::SetVolume(int64_t id, double volume)
224 {
225 auto setVolume = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgeSetVolume;
226 if (!setVolume) {
227 WEBVIEWLOGE("RemoteMediaPlayer::SetVolume is empty.");
228 return;
229 }
230 setVolume(id, volume);
231 }
232
Seek(int64_t id,double time)233 void RemoteMediaPlayer::Seek(int64_t id, double time)
234 {
235 auto seek = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgeSeek;
236 if (!seek) {
237 WEBVIEWLOGE("RemoteMediaPlayer::Seek is empty.");
238 return;
239 }
240 seek(id, time);
241 }
242
Pause(int64_t id)243 void RemoteMediaPlayer::Pause(int64_t id)
244 {
245 auto pause = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgePause;
246 if (!pause) {
247 WEBVIEWLOGE("RemoteMediaPlayer::Pause is empty.");
248 return;
249 }
250 pause(id);
251 }
252
Play(int64_t id)253 void RemoteMediaPlayer::Play(int64_t id)
254 {
255 auto play = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgePlay;
256 if (!play) {
257 WEBVIEWLOGE("RemoteMediaPlayer::Play is empty.");
258 return;
259 }
260 play(id);
261 }
262
UpdateRect(int64_t id,double x,double y,double width,double height)263 void RemoteMediaPlayer::UpdateRect(int64_t id, double x, double y, double width, double height)
264 {
265 auto updateRect = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgeUpdateRect;
266 if (!updateRect) {
267 WEBVIEWLOGE("RemoteMediaPlayer::UpdateRect is empty.");
268 return;
269 }
270 CRectEvent rectEvent = { x, y, width, height };
271 updateRect(id, rectEvent);
272 }
273
ResumeMediaPlayer(int64_t id)274 void RemoteMediaPlayer::ResumeMediaPlayer(int64_t id)
275 {
276 auto resumePlayer = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgeResumePlayer;
277 if (!resumePlayer) {
278 WEBVIEWLOGE("RemoteMediaPlayer::ResumeMediaPlayer is empty.");
279 return;
280 }
281 resumePlayer(id);
282 }
283
SuspendMediaPlayer(int64_t id,NWeb::SuspendType type)284 void RemoteMediaPlayer::SuspendMediaPlayer(int64_t id, NWeb::SuspendType type)
285 {
286 auto suspendPlayer = WebRuntimeDelegate::GetInstance().GetCJFuncs().atCOHOSNativeMediaPlayerBridgeSuspendPlayer;
287 if (!suspendPlayer) {
288 WEBVIEWLOGE("RemoteMediaPlayer::SuspendMediaPlayer is empty.");
289 return;
290 }
291 suspendPlayer(id, static_cast<int32_t>(type));
292 }
293
294 //NWebNativeMediaPlayerBridgeImpl
NWebNativeMediaPlayerBridgeImpl(int64_t nwebId,sptr<RemoteMediaPlayer> remoteMediaPlayer)295 NWebNativeMediaPlayerBridgeImpl::NWebNativeMediaPlayerBridgeImpl(int64_t nwebId,
296 sptr<RemoteMediaPlayer> remoteMediaPlayer) : nwebId_(nwebId), remoteMediaPlayer_(remoteMediaPlayer) {}
297
ExitFullScreen()298 void NWebNativeMediaPlayerBridgeImpl::ExitFullScreen()
299 {
300 if (remoteMediaPlayer_ == nullptr) {
301 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::ExitFullScreen is nullptr.");
302 return;
303 }
304 remoteMediaPlayer_->ExitFullScreen(nwebId_);
305 }
306
EnterFullScreen()307 void NWebNativeMediaPlayerBridgeImpl::EnterFullScreen()
308 {
309 if (remoteMediaPlayer_ == nullptr) {
310 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::EnterFullScreen is nullptr.");
311 return;
312 }
313 remoteMediaPlayer_->EnterFullScreen(nwebId_);
314 }
315
Release()316 void NWebNativeMediaPlayerBridgeImpl::Release()
317 {
318 if (remoteMediaPlayer_ == nullptr) {
319 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::Release is nullptr.");
320 return;
321 }
322 remoteMediaPlayer_->Release(nwebId_);
323 }
324
SetPlaybackRate(double playbackRate)325 void NWebNativeMediaPlayerBridgeImpl::SetPlaybackRate(double playbackRate)
326 {
327 if (remoteMediaPlayer_ == nullptr) {
328 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::SetPlaybackRate is nullptr.");
329 return;
330 }
331 remoteMediaPlayer_->SetPlaybackRate(nwebId_, playbackRate);
332 }
333
SetMuted(bool isMuted)334 void NWebNativeMediaPlayerBridgeImpl::SetMuted(bool isMuted)
335 {
336 if (remoteMediaPlayer_ == nullptr) {
337 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::SetMuted is nullptr.");
338 return;
339 }
340 remoteMediaPlayer_->SetMuted(nwebId_, isMuted);
341 }
342
SetVolume(double volume)343 void NWebNativeMediaPlayerBridgeImpl::SetVolume(double volume)
344 {
345 if (remoteMediaPlayer_ == nullptr) {
346 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::SetVolume is nullptr.");
347 return;
348 }
349 remoteMediaPlayer_->SetVolume(nwebId_, volume);
350 }
351
Seek(double time)352 void NWebNativeMediaPlayerBridgeImpl::Seek(double time)
353 {
354 if (remoteMediaPlayer_ == nullptr) {
355 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::Seek is nullptr.");
356 return;
357 }
358 remoteMediaPlayer_->Seek(nwebId_, time);
359 }
360
Pause()361 void NWebNativeMediaPlayerBridgeImpl::Pause()
362 {
363 if (remoteMediaPlayer_ == nullptr) {
364 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::Pause is nullptr.");
365 return;
366 }
367 remoteMediaPlayer_->Pause(nwebId_);
368 }
369
Play()370 void NWebNativeMediaPlayerBridgeImpl::Play()
371 {
372 if (remoteMediaPlayer_ == nullptr) {
373 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::Play is nullptr.");
374 return;
375 }
376 remoteMediaPlayer_->Play(nwebId_);
377 }
378
UpdateRect(double x,double y,double width,double height)379 void NWebNativeMediaPlayerBridgeImpl::UpdateRect(double x, double y, double width, double height)
380 {
381 if (remoteMediaPlayer_ == nullptr) {
382 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::UpdateRect is nullptr.");
383 return;
384 }
385 remoteMediaPlayer_->UpdateRect(nwebId_, x, y, width, height);
386 }
387
ResumeMediaPlayer()388 void NWebNativeMediaPlayerBridgeImpl::ResumeMediaPlayer()
389 {
390 if (remoteMediaPlayer_ == nullptr) {
391 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::ResumeMediaPlayer is nullptr.");
392 return;
393 }
394 remoteMediaPlayer_->ResumeMediaPlayer(nwebId_);
395 }
396
SuspendMediaPlayer(NWeb::SuspendType type)397 void NWebNativeMediaPlayerBridgeImpl::SuspendMediaPlayer(NWeb::SuspendType type)
398 {
399 if (remoteMediaPlayer_ == nullptr) {
400 WEBVIEWLOGE("NWebNativeMediaPlayerBridgeImpl::SuspendMediaPlayer is nullptr.");
401 return;
402 }
403 remoteMediaPlayer_->SuspendMediaPlayer(nwebId_, type);
404 }
405
NWebCreateNativeMediaPlayerCallbackImpl(int32_t nwebId,std::function<int64_t (int64_t,CMediaInfo)> callback)406 NWebCreateNativeMediaPlayerCallbackImpl::NWebCreateNativeMediaPlayerCallbackImpl(
407 int32_t nwebId, std::function<int64_t(int64_t, CMediaInfo)> callback)
408 : nwebId_(nwebId), callback_(callback)
409 {}
410
ConstructMediaSrcList(std::vector<std::shared_ptr<NWeb::NWebMediaSourceInfo>> mediaSrcList_)411 CArrMediaSourceInfo NWebCreateNativeMediaPlayerCallbackImpl::ConstructMediaSrcList(
412 std::vector<std::shared_ptr<NWeb::NWebMediaSourceInfo>> mediaSrcList_)
413 {
414 CMediaSourceInfo* result = static_cast<CMediaSourceInfo*>(malloc(sizeof(CMediaSourceInfo) * mediaSrcList_.size()));
415 if (result == nullptr) {
416 return {};
417 }
418 for (size_t i = 0; i < mediaSrcList_.size(); i++) {
419 const char* format = MallocCString(mediaSrcList_[i]->GetFormat());
420 const char* source = MallocCString(mediaSrcList_[i]->GetSource());
421 int32_t type = static_cast<int32_t>(mediaSrcList_[i]->GetType());
422 CMediaSourceInfo cMediaSourceInfo = {format, source, type};
423 result[i] = cMediaSourceInfo;
424 }
425 CArrMediaSourceInfo mediaSrcList = {result, mediaSrcList_.size()};
426 return mediaSrcList;
427 }
428
ConstructSurfaceInfo(std::shared_ptr<NWeb::NWebNativeMediaPlayerSurfaceInfo> surfaceInfo_)429 CNativeMediaPlayerSurfaceInfo NWebCreateNativeMediaPlayerCallbackImpl::ConstructSurfaceInfo(
430 std::shared_ptr<NWeb::NWebNativeMediaPlayerSurfaceInfo> surfaceInfo_)
431 {
432 CNativeMediaPlayerSurfaceInfo surfaceInfo;
433 CRectEvent event;
434 surfaceInfo.id = MallocCString(surfaceInfo_->GetId());
435 event.x = surfaceInfo_->GetX();
436 event.y = surfaceInfo_->GetY();
437 event.width = surfaceInfo_->GetWidth();
438 event.height = surfaceInfo_->GetHeight();
439 surfaceInfo.rect = event;
440 return surfaceInfo;
441 }
442
ConstructControlList(std::vector<std::string> controlList_)443 CArrString NWebCreateNativeMediaPlayerCallbackImpl::ConstructControlList(
444 std::vector<std::string> controlList_)
445 {
446 char** result = static_cast<char**>(malloc(sizeof(char *) * controlList_.size()));
447 if (result == nullptr) {
448 return {};
449 }
450 for (size_t i = 0; i < controlList_.size(); i++) {
451 result[i] = MallocCString(controlList_[i]);
452 }
453 CArrString controlList = {result, controlList_.size()};
454 return controlList;
455 }
456
ConstructMap(std::map<std::string,std::string> headers_)457 ArrMapItem NWebCreateNativeMediaPlayerCallbackImpl::ConstructMap(
458 std::map<std::string, std::string> headers_)
459 {
460 MapItem* result3 = static_cast<MapItem*>(malloc(sizeof(MapItem) * headers_.size()));
461 if (result3 == nullptr) {
462 return {};
463 }
464 size_t i = 0;
465 for (const auto& pair : headers_) {
466 MapItem mapItem = {MallocCString(pair.first), MallocCString(pair.second)};
467 result3[i] = mapItem;
468 i++;
469 }
470 ArrMapItem headers = {result3, headers_.size()};
471 return headers;
472 }
473
OnCreate(std::shared_ptr<NWeb::NWebNativeMediaPlayerHandler> handler,std::shared_ptr<NWeb::NWebMediaInfo> mediaInfo)474 std::shared_ptr<NWeb::NWebNativeMediaPlayerBridge> NWebCreateNativeMediaPlayerCallbackImpl::OnCreate(
475 std::shared_ptr<NWeb::NWebNativeMediaPlayerHandler> handler, std::shared_ptr<NWeb::NWebMediaInfo> mediaInfo)
476 {
477 WEBVIEWLOGD("begin to create native media player,nweb id is %{public}d", nwebId_);
478 if (!callback_) {
479 WEBVIEWLOGE("callback is null,nweb id is %{public}d", nwebId_);
480 return nullptr;
481 }
482 if (!handler || !mediaInfo) {
483 WEBVIEWLOGE("param is null,nweb id is %{public}d", nwebId_);
484 return nullptr;
485 }
486 auto handlerImpl = FFIData::Create<NativeMediaPlayerHandlerImpl>(nwebId_, handler);
487 if (!handlerImpl) {
488 WEBVIEWLOGE("Create handlerImpl failed, nweb id is %{public}d", nwebId_);
489 return nullptr;
490 }
491 int64_t handlerId = handlerImpl->GetID();
492 std::string embedID_ = mediaInfo->GetEmbedId();
493 const char* embedID = MallocCString(embedID_);
494 int32_t mediaType = static_cast<int32_t>(mediaInfo->GetMediaType());
495 CArrMediaSourceInfo mediaSrcList = ConstructMediaSrcList(mediaInfo->GetSourceInfos());
496 CNativeMediaPlayerSurfaceInfo surfaceInfo = ConstructSurfaceInfo(mediaInfo->GetSurfaceInfo());
497 bool controlsShown = mediaInfo->GetIsControlsShown();
498 CArrString controlList = ConstructControlList(mediaInfo->GetControls());
499 bool muted = mediaInfo->GetIsMuted();
500 std::string posterUrl_ = mediaInfo->GetPosterUrl();
501 const char* posterUrl = MallocCString(posterUrl_);
502 int32_t preload = static_cast<int32_t>(mediaInfo->GetPreload());
503 ArrMapItem headers = ConstructMap(mediaInfo->GetHeaders());
504 ArrMapItem attributes = ConstructMap(mediaInfo->GetAttributes());
505 CMediaInfo cMediaInfo = {embedID, mediaType, mediaSrcList, surfaceInfo,
506 controlsShown, controlList, muted, posterUrl, preload, headers, attributes};
507 int64_t nativeMediaPlayerBridgeId = callback_(handlerId, cMediaInfo);
508 auto remoteMediaPlayer = OHOS::FFI::RemoteData::Create<OHOS::Webview::RemoteMediaPlayer>(nativeMediaPlayerBridgeId);
509 return std::make_shared<NWebNativeMediaPlayerBridgeImpl>(nativeMediaPlayerBridgeId, remoteMediaPlayer);
510 }
511 } // namespace OHOS::Webview