From 142c92a44fae95e52a67d4a77a3648427e82fa7f Mon Sep 17 00:00:00 2001 From: "ayush.k123" Date: Tue, 21 Feb 2023 15:04:22 +0530 Subject: [PATCH 01/16] [M108 Migration][WCS] Bringup contents magnifier This patch brings up contents magnifier. Reference: https://review.tizen.org/gerrit/282646/ Change-Id: Ib4dcd1c5d22083c1a601f201989ce3b66eb262f4 Signed-off-by: Ayush Kumar --- .../rwhv_aura_offscreen_helper_efl.cc | 55 +++++++- .../renderer_host/rwhv_aura_offscreen_helper_efl.h | 14 ++ .../browser/selection/selection_controller_efl.cc | 21 +-- .../browser/selection/selection_controller_efl.h | 1 + .../browser/selection/selection_magnifier_efl.cc | 150 ++++++++++++--------- .../browser/selection/selection_magnifier_efl.h | 2 +- 6 files changed, 155 insertions(+), 88 deletions(-) diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc index a283e89..cf06dce 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc +++ b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc @@ -465,6 +465,12 @@ void RWHVAuraOffscreenHelperEfl::PaintTextureToSurface(GLuint texture_id) { // for snapshot frame_rendered_ = true; + + // Get snapshot for magnifier. + if (!magnifier_snapshot_request_.is_null()) { + std::move(magnifier_snapshot_request_).Run(); + magnifier_snapshot_request_.Reset(); + } } void RWHVAuraOffscreenHelperEfl::InitEvasGL() { @@ -1309,8 +1315,10 @@ void RWHVAuraOffscreenHelperEfl::SendGestureEvent( blink::WebGestureEvent& event) { HandleGesture(event); blink::WebInputEvent::Type event_type = event.GetType(); - if (event_type == blink::WebInputEvent::Type::kGestureScrollUpdate) + if (magnifier_ && + event_type == blink::WebInputEvent::Type::kGestureScrollUpdate) { return; + } if (event_type != blink::WebInputEvent::Type::kUndefined) { rwhv_aura_->host()->ForwardGestureEventWithLatencyInfo( @@ -1318,6 +1326,51 @@ void RWHVAuraOffscreenHelperEfl::SendGestureEvent( } } +void RWHVAuraOffscreenHelperEfl::set_magnifier(bool status) { + magnifier_ = status; +} + +void RWHVAuraOffscreenHelperEfl::GetMagnifierSnapshot( + gfx::Rect snapshot_area, + float scale_factor, + std::unique_ptr cb) { +#if defined(USE_TTRACE) + TTRACE(TTRACE_TAG_WEB, + "RenderWidgetHostViewAuraHelperEfl::GetMagnifierSnapshot"); +#endif + // GetSnapshot might be replaced with something designed for magnifier. + Evas_Object* image = GetSnapshot(snapshot_area, scale_factor, true); + + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&ScreenshotCapturedCallback::Run, + base::Owned(cb.release()), base::Unretained(image))); +} + +void RWHVAuraOffscreenHelperEfl::RequestMagnifierSnapshotAsync( + const Eina_Rectangle rect, + Screenshot_Captured_Callback callback, + void* user_data, + float scale_factor) { + gfx::Rect snapshot_area(rect.x, rect.y, rect.w, rect.h); + gfx::Rect view_rect = GetViewBoundsInPix(); + + // Adjust snapshot rect for email app + auto visible_viewport_rect = selection_controller_->GetVisibleViewportRect(); + int hidden_view_width = visible_viewport_rect.x() - view_rect.x(); + int hidden_view_height = visible_viewport_rect.y() - view_rect.y(); + if (hidden_view_height || hidden_view_width) { + snapshot_area.set_x(snapshot_area.x() + hidden_view_width); + snapshot_area.set_y(snapshot_area.y() + hidden_view_height); + } + + magnifier_snapshot_request_ = + base::BindOnce(&RWHVAuraOffscreenHelperEfl::GetMagnifierSnapshot, + base::Unretained(this), snapshot_area, scale_factor, + std::move(std::unique_ptr( + new ScreenshotCapturedCallback(callback, user_data)))); +} + void RWHVAuraOffscreenHelperEfl::HandleGesture(blink::WebGestureEvent& event) { SelectionControllerEfl* controller = GetSelectionController(); if (controller) diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h index e195e6b..d462660 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h +++ b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h @@ -165,6 +165,11 @@ class CONTENT_EXPORT RWHVAuraOffscreenHelperEfl { void MoveCaret(const gfx::Point& point); void SelectClosestWord(const gfx::Point& touch_point); bool HasSelectableText(); + void set_magnifier(bool status); + void RequestMagnifierSnapshotAsync(const Eina_Rectangle rect, + Screenshot_Captured_Callback callback, + void* user_data, + float scale_factor = 1.0f); private: static void OnParentViewResize(void* data, Evas*, Evas_Object*, void*); @@ -191,6 +196,9 @@ class CONTENT_EXPORT RWHVAuraOffscreenHelperEfl { void RunGetSnapshotOnMainThread(const gfx::Rect snapshot_area, int request_id, float scale_factor); + void GetMagnifierSnapshot(gfx::Rect snapshot_area, + float scale_factor, + std::unique_ptr cb); ui::EflEventHandler* GetEventHandler(); ui::IMContextEfl* GetIMContextEfl(); @@ -245,11 +253,17 @@ class CONTENT_EXPORT RWHVAuraOffscreenHelperEfl { bool horizontal_panning_hold_ = false; bool vertical_panning_hold_ = false; + bool magnifier_ = false; + OnFocusCallback on_focus_in_callback_; OnFocusCallback on_focus_out_callback_; bool is_content_editable_ = false; std::unique_ptr edge_effect_; + // Magnifier snapshot requests are not added to snapshot_task_list_, because + // we only care about the last one if they piled up - we can only display + // one anyway. + SnapshotTask magnifier_snapshot_request_; }; } // namespace content diff --git a/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.cc b/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.cc index ae22b6f..d6e172f 100644 --- a/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.cc +++ b/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.cc @@ -518,17 +518,6 @@ void SelectionControllerEfl::HandleDragBeginNotification( handle_being_dragged_ = true; - Evas_Coord x, y; - evas_object_geometry_get(rwhva_->offscreen_helper()->content_image(), &x, &y, - 0, 0); - gfx::Point magnifier_point( - handle->GetBasePosition().x() + x, - handle->GetBasePosition().y() + y); - - magnifier_->UpdateLocation(magnifier_point); - magnifier_->Move(magnifier_point); - magnifier_->Show(); - if (handle == input_handle_.get()) return; @@ -572,12 +561,6 @@ void SelectionControllerEfl::HandleDragUpdateNotification(SelectionHandleEfl* ha gfx::Rect view_bounds = rwhva_->offscreen_helper()->GetViewBoundsInPix(); selection_change_reason_ = Reason::HandleDragged; - gfx::Point magnifier_point; - magnifier_point.set_x(handle->GetBasePosition().x() + view_bounds.x()); - magnifier_point.set_y(handle->GetBasePosition().y() + view_bounds.y()); - magnifier_->UpdateLocation(magnifier_point); - magnifier_->Move(magnifier_point); - switch (handle->Type()) { case SelectionHandleEfl::HANDLE_TYPE_INPUT: { rwhva_->offscreen_helper()->MoveCaret(handle->GetBasePosition()); @@ -611,7 +594,6 @@ void SelectionControllerEfl::HandleDragEndNotification() { ecore_events_filter_ = nullptr; selection_change_reason_ = Reason::Irrelevant; - magnifier_->Hide(); start_handle_->SetBasePosition(selection_data_->GetLeftRect().bottom_left()); end_handle_->SetBasePosition(selection_data_->GetRightRect().bottom_right()); handle_being_dragged_ = false; @@ -750,7 +732,8 @@ void SelectionControllerEfl::HandleLongPressEventPrivate( gfx::Rect view_bounds = rwhva_->offscreen_helper()->GetViewBoundsInPix(); magnifier_->HandleLongPress(gfx::Point(touch_point.x() + view_bounds.x(), - touch_point.y() + view_bounds.y())); + touch_point.y() + view_bounds.y()), + selection_data_->IsInEditField()); } void SelectionControllerEfl::HandleLongPressMoveEvent(const gfx::Point& touch_point) { diff --git a/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.h b/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.h index fcf9eff..8247b16 100644 --- a/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.h +++ b/tizen_src/chromium_impl/content/browser/selection/selection_controller_efl.h @@ -49,6 +49,7 @@ class CONTENT_EXPORT SelectionControllerEfl { const content::ContextMenuParams& params); void HandleLongPressMoveEvent(const gfx::Point& touch_point); void HandleLongPressEndEvent(); + bool HandleBeingDragged() const { return handle_being_dragged_; } void PostHandleTapGesture(bool is_content_editable); diff --git a/tizen_src/chromium_impl/content/browser/selection/selection_magnifier_efl.cc b/tizen_src/chromium_impl/content/browser/selection/selection_magnifier_efl.cc index 388e19c..3e863e6 100644 --- a/tizen_src/chromium_impl/content/browser/selection/selection_magnifier_efl.cc +++ b/tizen_src/chromium_impl/content/browser/selection/selection_magnifier_efl.cc @@ -45,7 +45,8 @@ SelectionMagnifierEfl::~SelectionMagnifierEfl() { evas_object_del(container_); } -void SelectionMagnifierEfl::HandleLongPress(const gfx::Point& touch_point) { +void SelectionMagnifierEfl::HandleLongPress(const gfx::Point& touch_point, + bool is_in_edit_field) { evas_object_event_callback_add( controller_->rwhva()->offscreen_helper()->content_image(), EVAS_CALLBACK_MOUSE_MOVE, OnAnimatorMove, this); @@ -55,8 +56,10 @@ void SelectionMagnifierEfl::HandleLongPress(const gfx::Point& touch_point) { // Call OnAnimatorMove here, so that the magnifier widget // gets properly placed. Other calls to it are expected to // happen as a react to finger/mouse movements. - OnAnimatorMove(); - Show(); + if (!is_in_edit_field && !controller_->HandleBeingDragged()) { + OnAnimatorMove(); + Show(); + } } void SelectionMagnifierEfl::DisconnectCallbacks() { @@ -68,8 +71,11 @@ void SelectionMagnifierEfl::DisconnectCallbacks() { EVAS_CALLBACK_MOUSE_UP, OnAnimatorUp); } -void SelectionMagnifierEfl::OnAnimatorMove(void* data, Evas*, Evas_Object*, void*) { - SelectionMagnifierEfl* magnifier_data = static_cast(data); +void SelectionMagnifierEfl::OnAnimatorMove(void* data, + Evas*, + Evas_Object*, + void*) { + auto* magnifier_data = static_cast(data); DCHECK(magnifier_data); if (magnifier_data) @@ -84,12 +90,18 @@ void SelectionMagnifierEfl::OnAnimatorMove() { &point.x, &point.y); gfx::Point display_point(point.x, point.y); controller_->HandleLongPressMoveEvent(display_point); - UpdateLocation(display_point); - Move(display_point); + + if (controller_->GetVisibleViewportRect().Contains(display_point)) { + UpdateLocation(display_point); + Move(display_point); + } } -void SelectionMagnifierEfl::OnAnimatorUp(void* data, Evas*, Evas_Object*, void*) { - SelectionMagnifierEfl* magnifier_data = static_cast(data); +void SelectionMagnifierEfl::OnAnimatorUp(void* data, + Evas*, + Evas_Object*, + void*) { + auto* magnifier_data = static_cast(data); DCHECK(magnifier_data); if (magnifier_data) @@ -103,10 +115,8 @@ void SelectionMagnifierEfl::OnAnimatorUp() { } void SelectionMagnifierEfl::MagnifierGetSnapshotCb(Evas_Object* image, - void* user_data) -{ - SelectionMagnifierEfl* selection_magnifier = - static_cast(user_data); + void* user_data) { + auto* selection_magnifier = static_cast(user_data); if (selection_magnifier->content_image_) { evas_object_del(selection_magnifier->content_image_); @@ -116,8 +126,8 @@ void SelectionMagnifierEfl::MagnifierGetSnapshotCb(Evas_Object* image, selection_magnifier->content_image_ = image; evas_object_show(selection_magnifier->content_image_); - elm_object_part_content_set(selection_magnifier->container_, - "swallow", selection_magnifier->content_image_); + elm_object_part_content_set(selection_magnifier->container_, "swallow", + selection_magnifier->content_image_); evas_object_pass_events_set(selection_magnifier->content_image_, EINA_TRUE); evas_object_clip_set(selection_magnifier->content_image_, selection_magnifier->container_); @@ -127,65 +137,78 @@ void SelectionMagnifierEfl::MagnifierGetSnapshotCb(Evas_Object* image, } void SelectionMagnifierEfl::UpdateLocation(const gfx::Point& location) { - int device_x, device_y, device_width, device_height; - evas_object_geometry_get( - controller_->rwhva()->offscreen_helper()->content_image(), &device_x, - &device_y, &device_width, &device_height); + auto visible_viewport_rect = controller_->GetVisibleViewportRect(); + int visible_viewport_x = visible_viewport_rect.x(); + int visible_viewport_y = visible_viewport_rect.y(); + int visible_viewport_width = visible_viewport_rect.width(); + int visible_viewport_height = visible_viewport_rect.height(); int zoomedWidth = width_ * kZoomScale; int zoomedHeight = height_ * kZoomScale; - if (zoomedWidth > device_width) - zoomedWidth = device_width; + if (zoomedWidth > visible_viewport_width) + zoomedWidth = visible_viewport_width; - if (zoomedHeight > device_height) - zoomedHeight = device_height; + if (zoomedHeight > visible_viewport_height) + zoomedHeight = visible_viewport_height; - gfx::Rect content_rect(location.x() - zoomedWidth/2, - location.y() - zoomedHeight/2, zoomedWidth, zoomedHeight); + // Place screenshot area center on touch point + gfx::Rect content_rect(location.x() - zoomedWidth / 2, + location.y() - zoomedHeight / 2, zoomedWidth, + zoomedHeight); - // Adjustments for boundry conditions - if (content_rect.x() < device_x) - content_rect.set_x(device_x); - else if ((content_rect.x() + zoomedWidth) > device_x + device_width) - content_rect.set_x(device_x + device_width - zoomedWidth); + // Move magnifier rect so it stays inside webview area + if (content_rect.x() < visible_viewport_x) { + content_rect.set_x(visible_viewport_x); + } else if ((content_rect.x() + zoomedWidth) >= + visible_viewport_x + visible_viewport_width) { + content_rect.set_x(visible_viewport_x + visible_viewport_width - + zoomedWidth - 1); + } - if (content_rect.y() < device_y) // Do not let location to be less then magnifier y value - content_rect.set_y(device_y); - else if (content_rect.y() > device_y + device_height - zoomedHeight) - content_rect.set_y(device_y + device_height - zoomedHeight); + if (content_rect.y() < visible_viewport_y) { + content_rect.set_y(visible_viewport_y); + } else if ((content_rect.y() + zoomedHeight) >= + visible_viewport_y + visible_viewport_height) { + content_rect.set_y(visible_viewport_y + visible_viewport_height - + zoomedHeight - 1); + } + // Convert to webview parameter space Eina_Rectangle rect; - rect.x = content_rect.x(); - rect.y = content_rect.y(); + rect.x = content_rect.x() - visible_viewport_x; + rect.y = content_rect.y() - visible_viewport_y; rect.w = content_rect.width(); rect.h = content_rect.height(); -#if !defined(USE_AURA) - RenderWidgetHostViewEfl* rwhv = - static_cast(web_contents_.GetRenderWidgetHostView()); - if (rwhv) - rwhv->RequestSnapshotAsync(rect, MagnifierGetSnapshotCb, this); -#endif + + controller_->rwhva()->offscreen_helper()->RequestMagnifierSnapshotAsync( + rect, MagnifierGetSnapshotCb, this); } void SelectionMagnifierEfl::Move(const gfx::Point& location) { - int device_x, device_y, device_width, device_height; - evas_object_geometry_get( - controller_->rwhva()->offscreen_helper()->content_image(), &device_x, - &device_y, &device_width, &device_height); + auto visible_viewport_rect = controller_->GetVisibleViewportRect(); + int visible_viewport_x = visible_viewport_rect.x(); + int visible_viewport_y = visible_viewport_rect.y(); + int visible_viewport_width = visible_viewport_rect.width(); + int visible_viewport_height = visible_viewport_rect.height(); int magnifier_x = location.x(); int magnifier_y = location.y() - height_ - kHeightOffset; - if (magnifier_y < device_y) // Do not let location to be out of screen - magnifier_y = device_y; - else if (magnifier_y > device_height + device_y - height_) - magnifier_y = device_height + device_y - height_; - - if (magnifier_x < device_x + width_/2) // Do not let location to be out of screen - magnifier_x = device_x + width_/2; - else if (magnifier_x > device_width + device_x - width_/2) - magnifier_x = device_width + device_x - width_/2; + // Do not let location to be out of screen + if (magnifier_y < visible_viewport_y) { + magnifier_y = visible_viewport_y; + } else if (magnifier_y > + visible_viewport_height + visible_viewport_y - height_) { + magnifier_y = visible_viewport_height + visible_viewport_y - height_; + } + // Do not let location to be out of screen + if (magnifier_x < visible_viewport_x + width_ / 2) { + magnifier_x = visible_viewport_x + width_ / 2; + } else if (magnifier_x > + visible_viewport_width + visible_viewport_x - width_ / 2) { + magnifier_x = visible_viewport_width + visible_viewport_x - width_ / 2; + } evas_object_move(container_, magnifier_x, magnifier_y); } @@ -200,12 +223,7 @@ void SelectionMagnifierEfl::Show() { shown_ = true; evas_object_show(container_); -#if !defined(USE_AURA) - RenderWidgetHostViewEfl* rwhv = - static_cast(web_contents_.GetRenderWidgetHostView()); - if (rwhv) - rwhv->set_magnifier(true); -#endif + controller_->rwhva()->offscreen_helper()->set_magnifier(true); if (controller_->rwhva()->offscreen_helper()->ewk_view()) { evas_object_smart_callback_call( controller_->rwhva()->offscreen_helper()->ewk_view(), "magnifier,show", @@ -214,15 +232,13 @@ void SelectionMagnifierEfl::Show() { } void SelectionMagnifierEfl::Hide() { + if (!shown_) + return; + shown_ = false; evas_object_hide(content_image_); evas_object_hide(container_); -#if !defined(USE_AURA) - RenderWidgetHostViewEfl* rwhv = - static_cast(web_contents_.GetRenderWidgetHostView()); - if (rwhv) - rwhv->set_magnifier(false); -#endif + controller_->rwhva()->offscreen_helper()->set_magnifier(false); if (controller_->rwhva()->offscreen_helper()->ewk_view()) { evas_object_smart_callback_call( controller_->rwhva()->offscreen_helper()->ewk_view(), "magnifier,hide", diff --git a/tizen_src/chromium_impl/content/browser/selection/selection_magnifier_efl.h b/tizen_src/chromium_impl/content/browser/selection/selection_magnifier_efl.h index 53cf98e..a693783 100644 --- a/tizen_src/chromium_impl/content/browser/selection/selection_magnifier_efl.h +++ b/tizen_src/chromium_impl/content/browser/selection/selection_magnifier_efl.h @@ -22,7 +22,7 @@ class SelectionMagnifierEfl { SelectionMagnifierEfl(content::SelectionControllerEfl* controller); ~SelectionMagnifierEfl(); - void HandleLongPress(const gfx::Point& touch_point); + void HandleLongPress(const gfx::Point& touch_point, bool is_in_edit_field); void UpdateLocation(const gfx::Point& location); void Move(const gfx::Point& location); void Show(); -- 2.7.4 From 8a9f1476e67548fb103b51b30d4f0753554285d2 Mon Sep 17 00:00:00 2001 From: Gajendra N Date: Wed, 22 Feb 2023 11:11:09 +0530 Subject: [PATCH 02/16] Fix multiwindow event handling issue ParentWindowWithContext is used to maintain hierarchy of aura windows, however it is not suitable for offscreen rendering mode where Native Window is not yet available at the ozone layer during child aura window creation in case of 'CreateNewWindow'. Enabling ParentWindowWithContext causes event handling issue during multiple windows (tabs) scenario, hence it disabling for offscreen case. Change-Id: Iae0f471768b498b1dc1eff5e1e1d15b80f356834 Signed-off-by: Gajendra N --- .../browser/web_contents/web_contents_view_aura.cc | 35 ++++++++++++++-------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index fb2b9db..f371758 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc @@ -1017,19 +1017,30 @@ void WebContentsViewAura::CreateAuraWindow(aura::Window* context) { window_->set_owned_by_parent(false); window_->SetName("WebContentsViewAura"); window_->Init(ui::LAYER_NOT_DRAWN); - aura::Window* root_window = context ? context->GetRootWindow() : nullptr; - if (root_window) { - // There are places where there is no context currently because object - // hierarchies are built before they're attached to a Widget. (See - // views::WebView as an example; GetWidget() returns NULL at the point - // where we are created.) - // - // It should be OK to not set a default parent since such users will - // explicitly add this WebContentsViewAura to their tree after they create - // us. - aura::client::ParentWindowWithContext(window_.get(), root_window, - root_window->GetBoundsInScreen()); +#if BUILDFLAG(IS_EFL) + // ParentWindowWithContext is not suitable for offscreen rendering mode where + // Native Window is not yet available at the ozone layer during child aura + // window creation in case of 'CreateNewWindow'. Enabling below code causes + // event handling issue during multiple windows (tabs) scenario, hence + // disabling it for offscreen case. + if (!base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableOffscreenRendering)) { + aura::Window* root_window = context ? context->GetRootWindow() : nullptr; + if (root_window) { + // There are places where there is no context currently because object + // hierarchies are built before they're attached to a Widget. (See + // views::WebView as an example; GetWidget() returns NULL at the point + // where we are created.) + // + // It should be OK to not set a default parent since such users will + // explicitly add this WebContentsViewAura to their tree after they create + // us. + aura::client::ParentWindowWithContext(window_.get(), root_window, + root_window->GetBoundsInScreen()); + } } +#endif + window_->layer()->SetMasksToBounds(true); window_->TrackOcclusionState(); -- 2.7.4 From cd97a838b15c5bbfe2f3714aaffa5cfe2d5a4ae3 Mon Sep 17 00:00:00 2001 From: lizhifan Date: Tue, 21 Feb 2023 10:38:15 +0800 Subject: [PATCH 03/16] [M108 Migration][VD] Avoid pending frame counter becoming negative There should be only one frame rendering at one time, this counter help scheduler accomplish this task. But sometimes this counter could be notified to decrease more times than it should be, so it becomes negative, then scheduler is not working properly, the FPS will go sky high. From: https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/262951/ Change-Id: Icb7ef4ae0c206a8764581cccb078bb57bbc0c432 Signed-off-by: lizhifan --- cc/scheduler/scheduler_state_machine.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index 35692af..6a1dd9f 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc @@ -1465,7 +1465,8 @@ void SchedulerStateMachine::DidReceiveCompositorFrameAck() { TRACE_EVENT_NESTABLE_ASYNC_END1("cc", "Scheduler:pending_submit_frames", TRACE_ID_LOCAL(this), "pending_frames", pending_submit_frames_); - pending_submit_frames_--; + if (pending_submit_frames_ > 0) + pending_submit_frames_--; } void SchedulerStateMachine::SetTreePrioritiesAndScrollState( -- 2.7.4 From dfeeefc6f3364ef28e076c2ec9b10686d615f72a Mon Sep 17 00:00:00 2001 From: Chandan Padhi Date: Thu, 16 Feb 2023 21:03:24 +0530 Subject: [PATCH 04/16] Shorten NotifySwap path for offscreen rendering This commit shortens NotifySwap path by removing some of the changes in upstream code. w/o patch: SkiaOutputSurfaceImpl->Display(OutputSurfaceClient)-> RootCompositorFrameSinkImpl(DisplayClient)->FrameSinkManagerImpl-> HostFrameSinkManager(FrameSinkManagerClient)-> DelegatedFrameHost(HostFrameSinkClient)-> DelegatedFrameHostClientAura(DelegatedFrameHostClient)-> RenderWidgetHostViewAura->RWHVAuraOffscreenHelperEfl with patch: SkiaOutputSurfaceImpl->Display(OutputSurfaceClient)-> RootCompositorFrameSinkImpl(DisplayClient)-> HostDisplayClient(mojom::DisplayClient)->Compositor-> CompositorObserverEfl(CompositorObserver)-> RWHVAuraOffscreenHelperEfl Reference: https://review.tizen.org/gerrit/287806/ Change-Id: I5dbfad3a6bb8460804045c6a8b66bae1f74130ac Signed-off-by: Chandan Padhi --- components/viz/host/host_frame_sink_client.h | 3 -- components/viz/host/host_frame_sink_manager.cc | 12 ------- components/viz/host/host_frame_sink_manager.h | 5 --- .../service/frame_sinks/frame_sink_manager_impl.cc | 8 ----- .../service/frame_sinks/frame_sink_manager_impl.h | 4 --- .../frame_sinks/root_compositor_frame_sink_impl.cc | 4 +-- .../compositor/viz_process_transport_factory.cc | 6 ++++ .../browser/renderer_host/delegated_frame_host.cc | 6 ---- .../browser/renderer_host/delegated_frame_host.h | 7 ---- .../delegated_frame_host_client_aura.cc | 6 ---- .../delegated_frame_host_client_aura.h | 3 -- .../renderer_host/render_widget_host_view_aura.cc | 5 --- .../renderer_host/render_widget_host_view_aura.h | 1 - services/viz/privileged/mojom/compositing/BUILD.gn | 2 +- .../mojom/compositing/display_private.mojom | 3 ++ .../mojom/compositing/frame_sink_manager.mojom | 3 -- .../rwhv_aura_offscreen_helper_efl.cc | 1 + .../renderer_host/rwhv_aura_offscreen_helper_efl.h | 1 - .../ui/compositor/compositor_observer_efl.cc | 39 ++++++++++++++++++++ .../ui/compositor/compositor_observer_efl.h | 42 ++++++++++++++++++++++ tizen_src/chromium_impl/ui/ui_efl.gni | 7 +++- tizen_src/ewk/efl_integration/eweb_view.cc | 5 +++ tizen_src/ewk/efl_integration/eweb_view.h | 1 + ui/compositor/BUILD.gn | 8 +++++ ui/compositor/compositor.cc | 7 ++++ ui/compositor/compositor.h | 4 +++ ui/compositor/compositor_observer.h | 4 +++ 27 files changed, 129 insertions(+), 68 deletions(-) create mode 100644 tizen_src/chromium_impl/ui/compositor/compositor_observer_efl.cc create mode 100644 tizen_src/chromium_impl/ui/compositor/compositor_observer_efl.h diff --git a/components/viz/host/host_frame_sink_client.h b/components/viz/host/host_frame_sink_client.h index 9e04e64..288cf89 100644 --- a/components/viz/host/host_frame_sink_client.h +++ b/components/viz/host/host_frame_sink_client.h @@ -22,9 +22,6 @@ class HostFrameSinkClient { // Called when a CompositorFrame with a new frame token is provided. virtual void OnFrameTokenChanged(uint32_t frame_token, base::TimeTicks activation_time) = 0; -#if BUILDFLAG(IS_EFL) - virtual void NotifySwap(const uint32_t texture_id) {} -#endif protected: virtual ~HostFrameSinkClient() {} diff --git a/components/viz/host/host_frame_sink_manager.cc b/components/viz/host/host_frame_sink_manager.cc index 2e759a3..8d724ed 100644 --- a/components/viz/host/host_frame_sink_manager.cc +++ b/components/viz/host/host_frame_sink_manager.cc @@ -441,16 +441,4 @@ HostFrameSinkManager::FrameSinkData::~FrameSinkData() = default; HostFrameSinkManager::FrameSinkData& HostFrameSinkManager::FrameSinkData:: operator=(FrameSinkData&& other) = default; -#if BUILDFLAG(IS_EFL) -void HostFrameSinkManager::NotifySwap(const uint32_t texture_id, - const FrameSinkId& frame_sink_id) { - auto iter = frame_sink_data_map_.find(frame_sink_id); - if (iter != frame_sink_data_map_.end()) { - const FrameSinkData& data = iter->second; - if (data.client) - data.client->NotifySwap(texture_id); - } -} -#endif - } // namespace viz diff --git a/components/viz/host/host_frame_sink_manager.h b/components/viz/host/host_frame_sink_manager.h index b0cada9..0c8c1a6 100644 --- a/components/viz/host/host_frame_sink_manager.h +++ b/components/viz/host/host_frame_sink_manager.h @@ -295,11 +295,6 @@ class VIZ_HOST_EXPORT HostFrameSinkManager const bool enable_sync_window_destruction_; -#if BUILDFLAG(IS_EFL) - void NotifySwap(const uint32_t texture_id, - const FrameSinkId& frame_sink_id) override; -#endif - // Connections to/from FrameSinkManagerImpl. mojo::Remote frame_sink_manager_remote_; // This will point to |frame_sink_manager_remote_| if using mojo or it may diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc index b95e558..7c25edc 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc @@ -808,12 +808,4 @@ void FrameSinkManagerImpl::ClearThrottling(const FrameSinkId& id) { UpdateThrottlingRecursively(id, base::TimeDelta()); } -#if BUILDFLAG(IS_EFL) -void FrameSinkManagerImpl::NotifySwap(const uint32_t texture_id, - const FrameSinkId& id) { - for (auto child : GetChildrenByParent(id)) - client_->NotifySwap(texture_id, child); -} -#endif - } // namespace viz diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.h b/components/viz/service/frame_sinks/frame_sink_manager_impl.h index 418747b..aae01af 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h @@ -257,10 +257,6 @@ class VIZ_SERVICE_EXPORT FrameSinkManagerImpl bool VerifySandboxedThreadIds( base::flat_set thread_ids); -#if BUILDFLAG(IS_EFL) - void NotifySwap(const uint32_t texture_id, const FrameSinkId& id); -#endif - private: friend class FrameSinkManagerTest; diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc index 0b6f3f8..821d45b 100644 --- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc +++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc @@ -625,8 +625,8 @@ BeginFrameSource* RootCompositorFrameSinkImpl::begin_frame_source() { #if BUILDFLAG(IS_EFL) void RootCompositorFrameSinkImpl::NotifySwap(const uint32_t texture_id) { - support_->frame_sink_manager()->NotifySwap(texture_id, - support_->frame_sink_id()); + if (display_client_) + display_client_->NotifySwap(texture_id); } #endif diff --git a/content/browser/compositor/viz_process_transport_factory.cc b/content/browser/compositor/viz_process_transport_factory.cc index 4c5bf12..5855d1e 100644 --- a/content/browser/compositor/viz_process_transport_factory.cc +++ b/content/browser/compositor/viz_process_transport_factory.cc @@ -124,6 +124,12 @@ class HostDisplayClient : public viz::HostDisplayClient { } #endif +#if BUILDFLAG(IS_EFL) + void NotifySwap(const uint32_t texture_id) override { + compositor_->NotifySwap(texture_id); + } +#endif + private: [[maybe_unused]] const raw_ptr compositor_; }; diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc index 2f07bdb..b089659 100644 --- a/content/browser/renderer_host/delegated_frame_host.cc +++ b/content/browser/renderer_host/delegated_frame_host.cc @@ -329,12 +329,6 @@ void DelegatedFrameHost::OnFrameTokenChanged(uint32_t frame_token, client_->OnFrameTokenChanged(frame_token, activation_time); } -#if BUILDFLAG(IS_EFL) -void DelegatedFrameHost::NotifySwap(const uint32_t texture_id) { - client_->NotifySwap(texture_id); -} -#endif - // CommitPending without a target for TakeFallbackContentFrom. Since we cannot // guarantee that Navigation will complete, evict our surfaces which are from // a previous Navigation. diff --git a/content/browser/renderer_host/delegated_frame_host.h b/content/browser/renderer_host/delegated_frame_host.h index 85e3aa2..7d55757 100644 --- a/content/browser/renderer_host/delegated_frame_host.h +++ b/content/browser/renderer_host/delegated_frame_host.h @@ -54,9 +54,6 @@ class CONTENT_EXPORT DelegatedFrameHostClient { virtual void InvalidateLocalSurfaceIdOnEviction() = 0; virtual std::vector CollectSurfaceIdsForEviction() = 0; virtual bool ShouldShowStaleContentOnEviction() = 0; -#if BUILDFLAG(IS_EFL) - virtual void NotifySwap(const uint32_t texture_id) {} -#endif }; // The DelegatedFrameHost is used to host all of the RenderWidgetHostView state @@ -108,10 +105,6 @@ class CONTENT_EXPORT DelegatedFrameHost void OnFrameTokenChanged(uint32_t frame_token, base::TimeTicks activation_time) override; -#if BUILDFLAG(IS_EFL) - void NotifySwap(const uint32_t texture_id) override; -#endif - // Public interface exposed to RenderWidgetHostView. // kOccluded means the native window for the host was diff --git a/content/browser/renderer_host/delegated_frame_host_client_aura.cc b/content/browser/renderer_host/delegated_frame_host_client_aura.cc index d667785..6e1b082 100644 --- a/content/browser/renderer_host/delegated_frame_host_client_aura.cc +++ b/content/browser/renderer_host/delegated_frame_host_client_aura.cc @@ -64,10 +64,4 @@ bool DelegatedFrameHostClientAura::ShouldShowStaleContentOnEviction() { return render_widget_host_view_->ShouldShowStaleContentOnEviction(); } -#if BUILDFLAG(IS_EFL) -void DelegatedFrameHostClientAura::NotifySwap(const uint32_t texture_id) { - render_widget_host_view_->NotifySwap(texture_id); -} -#endif - } // namespace content diff --git a/content/browser/renderer_host/delegated_frame_host_client_aura.h b/content/browser/renderer_host/delegated_frame_host_client_aura.h index 074e6e2..87a23e8 100644 --- a/content/browser/renderer_host/delegated_frame_host_client_aura.h +++ b/content/browser/renderer_host/delegated_frame_host_client_aura.h @@ -42,9 +42,6 @@ class CONTENT_EXPORT DelegatedFrameHostClientAura void InvalidateLocalSurfaceIdOnEviction() override; std::vector CollectSurfaceIdsForEviction() override; bool ShouldShowStaleContentOnEviction() override; -#if BUILDFLAG(IS_EFL) - void NotifySwap(const uint32_t texture_id) override; -#endif private: raw_ptr render_widget_host_view_; diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index 133558d..21d097e 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc @@ -564,11 +564,6 @@ void RenderWidgetHostViewAura::BackgroundColorReceived(int callback_id, offscreen_helper_->BackgroundColorReceived(callback_id, bg_color); } -void RenderWidgetHostViewAura::NotifySwap(const uint32_t texture_id) { - if (offscreen_helper_) - offscreen_helper_->NotifySwap(texture_id); -} - void RenderWidgetHostViewAura::DidGetContentSnapshot(const SkBitmap& bitmap, int request_id) { if (offscreen_helper_) diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h index 014d829..701f9a2 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.h +++ b/content/browser/renderer_host/render_widget_host_view_aura.h @@ -422,7 +422,6 @@ class CONTENT_EXPORT RenderWidgetHostViewAura RWHVAuraOffscreenHelperEfl* offscreen_helper() { return offscreen_helper_.get(); } - void NotifySwap(const uint32_t texture_id); void DidGetContentSnapshot(const SkBitmap& bitmap, int request_id) override; void DidHandleKeyEvent(blink::WebInputEvent::Type input_event, bool processed) override; diff --git a/services/viz/privileged/mojom/compositing/BUILD.gn b/services/viz/privileged/mojom/compositing/BUILD.gn index 8a28eee..a7fe718 100644 --- a/services/viz/privileged/mojom/compositing/BUILD.gn +++ b/services/viz/privileged/mojom/compositing/BUILD.gn @@ -44,7 +44,7 @@ mojom("compositing") { enabled_features += [ "enable_cast_overlay_strategy" ] } if (use_efl) { - enabled_features += [ "use_efl" ] + enabled_features += [ "is_efl" ] } cpp_typemaps = [ diff --git a/services/viz/privileged/mojom/compositing/display_private.mojom b/services/viz/privileged/mojom/compositing/display_private.mojom index 44e7dde..116905f 100644 --- a/services/viz/privileged/mojom/compositing/display_private.mojom +++ b/services/viz/privileged/mojom/compositing/display_private.mojom @@ -125,4 +125,7 @@ interface DisplayClient { [EnableIf=is_android] SetPreferredRefreshRate(float refresh_rate); + + [EnableIf=is_efl] + NotifySwap(uint32 texture_id); }; diff --git a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom index 2ac593f..5776b0b 100644 --- a/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom +++ b/services/viz/privileged/mojom/compositing/frame_sink_manager.mojom @@ -192,7 +192,4 @@ interface FrameSinkManagerClient { // when a surface of the provided |frame_sink_id| activates. OnFrameTokenChanged(FrameSinkId frame_sink_id, uint32 frame_token, mojo_base.mojom.TimeTicks activation_time); - - [EnableIf=use_efl] - NotifySwap(uint32 texture_id, FrameSinkId frame_sink_id); }; diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc index cf06dce..ee3e3f8 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc +++ b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.cc @@ -14,6 +14,7 @@ #include "content/browser/web_contents/web_contents_view_aura.h" #include "content/public/browser/render_widget_host_helper.h" #include "content/public/browser/web_contents_delegate.h" +#include "ecore_x_wayland_wrapper.h" #include "gpu/command_buffer/service/texture_base.h" #include "skia/ext/image_operations.h" #include "tizen/system_info.h" diff --git a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h index d462660..42ad061 100644 --- a/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h +++ b/tizen_src/chromium_impl/content/browser/renderer_host/rwhv_aura_offscreen_helper_efl.h @@ -14,7 +14,6 @@ #include #include #include -#include "ecore_x_wayland_wrapper.h" #include "base/callback.h" #include "base/containers/id_map.h" diff --git a/tizen_src/chromium_impl/ui/compositor/compositor_observer_efl.cc b/tizen_src/chromium_impl/ui/compositor/compositor_observer_efl.cc new file mode 100644 index 0000000..52dcb89 --- /dev/null +++ b/tizen_src/chromium_impl/ui/compositor/compositor_observer_efl.cc @@ -0,0 +1,39 @@ +// Copyright 2023 Samsung Electronics. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/compositor/compositor_observer_efl.h" + +#include "content/browser/renderer_host/render_widget_host_view_aura.h" +#include "content/public/browser/web_contents.h" +#include "ui/compositor/compositor.h" + +namespace ui { + +CompositorObserverEfl::CompositorObserverEfl(ui::Compositor* compositor, + content::WebContents* web_contents) + : compositor_(compositor), web_contents_(web_contents) { + compositor_->AddObserver(this); +} + +CompositorObserverEfl::~CompositorObserverEfl() { + if (compositor_) + compositor_->RemoveObserver(this); +} + +void CompositorObserverEfl::NotifySwap(const uint32_t texture_id) { + auto* rwhva = static_cast( + web_contents_->GetRenderWidgetHostView()); + if (!rwhva || !rwhva->offscreen_helper()) + return; + + rwhva->offscreen_helper()->NotifySwap(texture_id); +} + +void CompositorObserverEfl::OnCompositingShuttingDown( + ui::Compositor* compositor) { + DCHECK_EQ(compositor, compositor_); + compositor_->RemoveObserver(this); + compositor_ = nullptr; +} +} // namespace ui diff --git a/tizen_src/chromium_impl/ui/compositor/compositor_observer_efl.h b/tizen_src/chromium_impl/ui/compositor/compositor_observer_efl.h new file mode 100644 index 0000000..2bf46b7 --- /dev/null +++ b/tizen_src/chromium_impl/ui/compositor/compositor_observer_efl.h @@ -0,0 +1,42 @@ +// Copyright 2023 Samsung Electronics. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_COMPOSITOR_COMPOSITOR_OBSERVER_EFL_H_ +#define UI_COMPOSITOR_COMPOSITOR_OBSERVER_EFL_H_ + +#include "ui/compositor/compositor_export.h" +#include "ui/compositor/compositor_observer.h" + +namespace content { +class WebContents; +} // namespace content + +namespace ui { + +class Compositor; + +class COMPOSITOR_EXPORT CompositorObserverEfl : public CompositorObserver { + public: + CompositorObserverEfl(Compositor* compositor, + content::WebContents* web_contents); + + CompositorObserverEfl(const CompositorObserverEfl&) = delete; + CompositorObserverEfl& operator=(const CompositorObserverEfl&) = delete; + + ~CompositorObserverEfl() override; + + ui::Compositor* compositor() { return compositor_; } + + private: + // ui::CompositorObserver implementation: + void NotifySwap(const uint32_t texture_id) override; + void OnCompositingShuttingDown(Compositor* compositor) override; + + Compositor* compositor_; + content::WebContents* web_contents_; +}; + +} // namespace ui + +#endif // UI_COMPOSITOR_COMPOSITOR_OBSERVER_EFL_H_ diff --git a/tizen_src/chromium_impl/ui/ui_efl.gni b/tizen_src/chromium_impl/ui/ui_efl.gni index 1a0117f..7e08db0 100644 --- a/tizen_src/chromium_impl/ui/ui_efl.gni +++ b/tizen_src/chromium_impl/ui/ui_efl.gni @@ -134,4 +134,9 @@ if (!use_aura) { external_ui_accessiblility_platform_sources = [ "//tizen_src/chromium_impl/ui/accessibility/platform/ax_platform_node_efl.cc", "//tizen_src/chromium_impl/ui/accessibility/platform/ax_platform_node_efl.h", -] \ No newline at end of file +] + +external_ui_compositor_sources = [ + "//tizen_src/chromium_impl/ui/compositor/compositor_observer_efl.cc", + "//tizen_src/chromium_impl/ui/compositor/compositor_observer_efl.h", +] diff --git a/tizen_src/ewk/efl_integration/eweb_view.cc b/tizen_src/ewk/efl_integration/eweb_view.cc index 5d6f3a4..76e4b48 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.cc +++ b/tizen_src/ewk/efl_integration/eweb_view.cc @@ -77,6 +77,7 @@ #include "ui/aura/window.h" #include "ui/base/clipboard/clipboard_helper_efl.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/compositor/compositor_observer_efl.h" #include "ui/display/screen.h" #include "ui/events/event_switches.h" #include "ui/gfx/geometry/dip_util.h" @@ -435,6 +436,8 @@ EWebView::~EWebView() { context_menu_.reset(); mhtml_callback_map_.Clear(); + compositor_observer_.reset(); + // Release manually those scoped pointers to // make sure they are released in correct order web_contents_.reset(); @@ -2498,6 +2501,8 @@ void EWebView::InitializeWindowTreeHost() { std::make_unique(host_->window()); window_parenting_client_ = std::make_unique(host_->window()); + compositor_observer_ = std::make_unique( + host_->compositor(), web_contents_.get()); aura::Window* content = web_contents_->GetNativeView(); aura::Window* parent = host_->window(); diff --git a/tizen_src/ewk/efl_integration/eweb_view.h b/tizen_src/ewk/efl_integration/eweb_view.h index 17cb0c3..571af8c 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.h +++ b/tizen_src/ewk/efl_integration/eweb_view.h @@ -864,6 +864,7 @@ class EWebView { std::unique_ptr host_; std::unique_ptr focus_client_; std::unique_ptr window_parenting_client_; + std::unique_ptr compositor_observer_; content::DateTimeChooserEfl* date_time_chooser_ = nullptr; #if defined(TIZEN_ATK_SUPPORT) diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn index d42dd37..cdf5544 100644 --- a/ui/compositor/BUILD.gn +++ b/ui/compositor/BUILD.gn @@ -5,6 +5,10 @@ import("//build/config/ui.gni") import("//testing/test.gni") +if (use_efl) { + import("//tizen_src/chromium_impl/ui/ui_efl.gni") +} + component("compositor") { sources = [ "animation_throughput_reporter.cc", @@ -87,6 +91,10 @@ component("compositor") { ] } + if (use_efl) { + sources += external_ui_compositor_sources + } + defines = [ "COMPOSITOR_IMPLEMENTATION" ] public_deps = [ "//cc" ] diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc index ea97a5f..16177cf 100644 --- a/ui/compositor/compositor.cc +++ b/ui/compositor/compositor.cc @@ -875,6 +875,13 @@ void Compositor::OnCompleteSwapWithNewSize(const gfx::Size& size) { } #endif +#if BUILDFLAG(IS_EFL) +void Compositor::NotifySwap(const uint32_t texture_id) { + for (auto& observer : observer_list_) + observer.NotifySwap(texture_id); +} +#endif + void Compositor::SetOutputIsSecure(bool output_is_secure) { output_is_secure_ = output_is_secure; if (display_private_) diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h index ad691e7..1fedaa1 100644 --- a/ui/compositor/compositor.h +++ b/ui/compositor/compositor.h @@ -424,6 +424,10 @@ class COMPOSITOR_EXPORT Compositor : public base::PowerSuspendObserver, void OnCompleteSwapWithNewSize(const gfx::Size& size); #endif +#if BUILDFLAG(IS_EFL) + void NotifySwap(const uint32_t texture_id); +#endif + bool IsLocked() { return lock_manager_.IsLocked(); } void SetOutputIsSecure(bool output_is_secure); diff --git a/ui/compositor/compositor_observer.h b/ui/compositor/compositor_observer.h index 8e00a18..1814689 100644 --- a/ui/compositor/compositor_observer.h +++ b/ui/compositor/compositor_observer.h @@ -54,6 +54,10 @@ class COMPOSITOR_EXPORT CompositorObserver { const gfx::Size& size) {} #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_EFL) + virtual void NotifySwap(const uint32_t texture_id) {} +#endif + // Called at the top of the compositor's destructor, to give observers a // chance to remove themselves. virtual void OnCompositingShuttingDown(Compositor* compositor) {} -- 2.7.4 From 0d0b696d2e76bca0989dbae216e55cee71565f7d Mon Sep 17 00:00:00 2001 From: "yh106.jung" Date: Wed, 22 Feb 2023 19:29:13 -0800 Subject: [PATCH 05/16] Do not include chromium internal headers in ewk header This patch does not include build_config.h to ewk headers, but to ewk sources in order to resolve build breaks that occur in modules that reference chromium-efl. Change-Id: Ic683dfce4c3e516a00121e005bdf1bb34516171f Signed-off-by: yh106.jung --- .../ewk/efl_integration/public/ewk_context_menu.cc | 13 +++++++++++-- .../public/ewk_context_menu_product.h | 4 ---- .../public/ewk_media_playback_info.cc | 19 +++++++++++++++++-- .../public/ewk_media_playback_info_product.h | 4 ---- .../public/ewk_media_subtitle_info.cc | 22 ++++++++++++++++++++-- .../public/ewk_media_subtitle_info_product.h | 4 ---- 6 files changed, 48 insertions(+), 18 deletions(-) diff --git a/tizen_src/ewk/efl_integration/public/ewk_context_menu.cc b/tizen_src/ewk/efl_integration/public/ewk_context_menu.cc index 6347a38..3b8e6ae 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_context_menu.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_context_menu.cc @@ -5,6 +5,7 @@ #include "ewk_context_menu_product.h" #include +#include "build/build_config.h" #include "private/ewk_private.h" #include "private/ewk_context_menu_private.h" #include "context_menu_controller_efl.h" @@ -144,16 +145,24 @@ Eina_Bool ewk_context_menu_hide(Ewk_Context_Menu* menu) return false; } -#if BUILDFLAG(IS_TIZEN_TV) int ewk_context_menu_pos_x_get(Ewk_Context_Menu* menu) { +#if BUILDFLAG(IS_TIZEN_TV) LOG_EWK_API_MOCKUP(); return 0; +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV."); + return 0; +#endif } int ewk_context_menu_pos_y_get(Ewk_Context_Menu* menu) { +#if BUILDFLAG(IS_TIZEN_TV) LOG_EWK_API_MOCKUP(); return 0; +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV."); + return 0; +#endif } -#endif // IS_TIZEN_TV diff --git a/tizen_src/ewk/efl_integration/public/ewk_context_menu_product.h b/tizen_src/ewk/efl_integration/public/ewk_context_menu_product.h index 4d5ba0a..dd7fdc4 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_context_menu_product.h +++ b/tizen_src/ewk/efl_integration/public/ewk_context_menu_product.h @@ -33,8 +33,6 @@ #include "ewk_context_menu_internal.h" -#include "build/build_config.h" - #ifdef __cplusplus extern "C" { #endif @@ -111,7 +109,6 @@ EXPORT_API Eina_Bool ewk_context_menu_item_select(Ewk_Context_Menu *menu, Ewk_Co */ EXPORT_API Eina_Bool ewk_context_menu_hide(Ewk_Context_Menu *menu); -#if BUILDFLAG(IS_TIZEN_TV) /** * Gets the x_position of context menu. * @@ -127,7 +124,6 @@ EXPORT_API int ewk_context_menu_pos_x_get(Ewk_Context_Menu* menu); * @return the y_position of context menu on success or @c 0 on failure */ EXPORT_API int ewk_context_menu_pos_y_get(Ewk_Context_Menu* menu); -#endif // IS_TIZEN_TV #ifdef __cplusplus } diff --git a/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.cc b/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.cc index 980cc50..b7baf7e 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_media_playback_info.cc @@ -24,6 +24,8 @@ */ #include "ewk_media_playback_info_product.h" + +#include "build/build_config.h" #include "private/ewk_private.h" const char* ewk_media_playback_info_media_url_get( @@ -71,24 +73,37 @@ const int ewk_media_playback_info_video_id_get(Ewk_Media_Playback_Info* data) LOG_EWK_API_MOCKUP(); } -#if BUILDFLAG(IS_TIZEN_TV) Ewk_Media_Playback_Info* ewkMediaPlaybackInfoCreate(const int player_id, const char* url, const char* mime_type) { +#if BUILDFLAG(IS_TIZEN_TV) LOG_EWK_API_MOCKUP(); return NULL; +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV."); + return NULL; +#endif + } Eina_Bool ewk_media_playback_info_media_resource_acquired_get( Ewk_Media_Playback_Info* data) { +#if BUILDFLAG(IS_TIZEN_TV) LOG_EWK_API_MOCKUP(); return EINA_FALSE; +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV."); + return EINA_FALSE; +#endif } void ewkMediaPlaybackInfoDelete(Ewk_Media_Playback_Info* data) { +#if BUILDFLAG(IS_TIZEN_TV) LOG_EWK_API_MOCKUP(); -} +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV."); #endif +} diff --git a/tizen_src/ewk/efl_integration/public/ewk_media_playback_info_product.h b/tizen_src/ewk/efl_integration/public/ewk_media_playback_info_product.h index 895c9e0..a7689d5 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_media_playback_info_product.h +++ b/tizen_src/ewk/efl_integration/public/ewk_media_playback_info_product.h @@ -35,8 +35,6 @@ #include #include -#include "build/build_config.h" - #ifdef __cplusplus extern "C" { #endif @@ -120,14 +118,12 @@ EXPORT_API void ewk_media_playback_info_drm_info_set( Ewk_Media_Playback_Info* data, const char* drm_info); -#if BUILDFLAG(IS_TIZEN_TV) Ewk_Media_Playback_Info* ewkMediaPlaybackInfoCreate(const int player_id, const char* url, const char* mime_type); Eina_Bool ewk_media_playback_info_media_resource_acquired_get( Ewk_Media_Playback_Info* data); void ewkMediaPlaybackInfoDelete(Ewk_Media_Playback_Info* data); -#endif #ifdef __cplusplus } diff --git a/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info.cc b/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info.cc index 3a681da..7c0cb73 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info.cc @@ -3,6 +3,8 @@ // found in the LICENSE file. #include "ewk_media_subtitle_info_product.h" + +#include "build/build_config.h" #include "private/ewk_private.h" int ewk_media_subtitle_info_id_get(Ewk_Media_Subtitle_Info *data) @@ -53,26 +55,42 @@ const void* ewk_media_subtitle_data_get(Ewk_Media_Subtitle_Data *data) return NULL; } -#if BUILDFLAG(IS_TIZEN_TV) Ewk_Media_Subtitle_Info* ewkMediaSubtitleInfoCreate(int id, const char* url, const char* lang, const char* label) { +#if BUILDFLAG(IS_TIZEN_TV) LOG_EWK_API_MOCKUP(); return NULL; +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV."); + return NULL; +#endif } void ewkMediaSubtitleInfoDelete(Ewk_Media_Subtitle_Info* data) { +#if BUILDFLAG(IS_TIZEN_TV) LOG_EWK_API_MOCKUP(); +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV."); +#endif } Ewk_Media_Subtitle_Data* ewkMediaSubtitleDataCreate(int id, double timestamp, const void* data, unsigned size) { +#if BUILDFLAG(IS_TIZEN_TV) LOG_EWK_API_MOCKUP(); return NULL; +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV."); + return NULL; +#endif } void ewkMediaSubtitleDataDelete(Ewk_Media_Subtitle_Data* data) { +#if BUILDFLAG(IS_TIZEN_TV) LOG_EWK_API_MOCKUP(); -} +#else + LOG_EWK_API_MOCKUP("Only for Tizen TV."); #endif +} diff --git a/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info_product.h b/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info_product.h index 678eb2d..6036ad8 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info_product.h +++ b/tizen_src/ewk/efl_integration/public/ewk_media_subtitle_info_product.h @@ -35,8 +35,6 @@ #include #include -#include "build/build_config.h" - #ifdef __cplusplus extern "C" { #endif @@ -117,7 +115,6 @@ EXPORT_API unsigned ewk_media_subtitle_data_size_get(Ewk_Media_Subtitle_Data *da */ EXPORT_API const void* ewk_media_subtitle_data_get(Ewk_Media_Subtitle_Data *data); -#if BUILDFLAG(IS_TIZEN_TV) Ewk_Media_Subtitle_Info* ewkMediaSubtitleInfoCreate(int id, const char* url, const char* lang, const char* label); @@ -127,7 +124,6 @@ Ewk_Media_Subtitle_Data* ewkMediaSubtitleDataCreate(int id, double timestamp, const void* data, unsigned size); void ewkMediaSubtitleDataDelete(Ewk_Media_Subtitle_Data* data); -#endif #ifdef __cplusplus } -- 2.7.4 From f8847dea5cdadcb4eefe5202cd811d74abb26a6c Mon Sep 17 00:00:00 2001 From: "fr.fang" Date: Wed, 22 Feb 2023 09:24:18 +0800 Subject: [PATCH 06/16] [M108 Migration][HBBTV] Implement new ewk context api Support incognito mode in Injected bundle, implement the api of ewk_context_new_with_injected_bundle_path_in_incognito_mode for the request from hbbtv. Reference: https://review.tizen.org/gerrit/#/c/281230 Change-Id: I4f5153f0a88b2fbd655f8a597ba8d78955b122d4 Signed-off-by: fr.fang --- tizen_src/ewk/efl_integration/eweb_context.cc | 6 ------ tizen_src/ewk/efl_integration/eweb_context.h | 2 -- .../ewk/efl_integration/private/ewk_context_private.cc | 17 +++++++++-------- .../ewk/efl_integration/private/ewk_context_private.h | 5 +++-- tizen_src/ewk/efl_integration/public/ewk_context.cc | 7 ++++--- 5 files changed, 16 insertions(+), 21 deletions(-) diff --git a/tizen_src/ewk/efl_integration/eweb_context.cc b/tizen_src/ewk/efl_integration/eweb_context.cc index 47e9c4c..b2c3b7d 100644 --- a/tizen_src/ewk/efl_integration/eweb_context.cc +++ b/tizen_src/ewk/efl_integration/eweb_context.cc @@ -305,12 +305,6 @@ bool EWebContext::OverrideMimeForURL(const std::string& url_spec, return false; } -EWebContext::EWebContext(bool incognito) - : EWebContext(incognito, std::string()) {} - -EWebContext::EWebContext(const std::string& injectedBundlePath) - : EWebContext(false, injectedBundlePath) {} - EWebContext::EWebContext(bool incognito, const std::string& injectedBundlePath) : injected_bundle_path_(injectedBundlePath), #if BUILDFLAG(IS_TIZEN) diff --git a/tizen_src/ewk/efl_integration/eweb_context.h b/tizen_src/ewk/efl_integration/eweb_context.h index 3e6cdf0..bb51d19 100644 --- a/tizen_src/ewk/efl_integration/eweb_context.h +++ b/tizen_src/ewk/efl_integration/eweb_context.h @@ -206,8 +206,6 @@ class EWebContext { void SetMaxRefreshRate(int max_refresh_rate); private: - EWebContext(bool incognito); - EWebContext(const std::string& injectedBundlePath); EWebContext(bool incognito, const std::string& injectedBundlePath); ~EWebContext(); friend class Ewk_Context; diff --git a/tizen_src/ewk/efl_integration/private/ewk_context_private.cc b/tizen_src/ewk/efl_integration/private/ewk_context_private.cc index 9cc1f2d..be871bd 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_context_private.cc +++ b/tizen_src/ewk/efl_integration/private/ewk_context_private.cc @@ -60,8 +60,9 @@ Ewk_Context* Ewk_Context::Create(bool incognito) { } // static -Ewk_Context* Ewk_Context::Create(const std::string& injectedBundlePath) { - Ewk_Context* context = new Ewk_Context(injectedBundlePath); +Ewk_Context* Ewk_Context::Create(bool incognito, + const std::string& injected_bundle_path) { + Ewk_Context* context = new Ewk_Context(incognito, injected_bundle_path); context->AddRef(); return context; } @@ -80,12 +81,12 @@ void Ewk_Context::Delete(Ewk_Context* context) { } } -Ewk_Context::Ewk_Context(bool incognito) : impl(new EWebContext(incognito)) { -} +Ewk_Context::Ewk_Context(bool incognito) + : impl(new EWebContext(incognito, std::string())) {} -Ewk_Context::Ewk_Context(const std::string& injectedBundlePath) - : impl(new EWebContext(injectedBundlePath)) { -} +Ewk_Context::Ewk_Context(bool incognito, + const std::string& injected_bundle_path) + : impl(new EWebContext(incognito, injected_bundle_path)) {} Ewk_Context::~Ewk_Context() { if (this == default_context_) @@ -341,4 +342,4 @@ Ewk_Application_Type Ewk_Context::GetApplicationType() const { void Ewk_Context::SetMaxRefreshRate(int max_refresh_rate) { impl->SetMaxRefreshRate(max_refresh_rate); -} \ No newline at end of file +} diff --git a/tizen_src/ewk/efl_integration/private/ewk_context_private.h b/tizen_src/ewk/efl_integration/private/ewk_context_private.h index a7af91a..fc39ea3 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_context_private.h +++ b/tizen_src/ewk/efl_integration/private/ewk_context_private.h @@ -28,7 +28,8 @@ struct Ewk_Context : public base::RefCounted { static Ewk_Context* IncognitoContext(); static void DefaultContextRelease(); static Ewk_Context* Create(bool incognito = false); - static Ewk_Context* Create(const std::string& injectedBundlePath); + static Ewk_Context* Create(bool incognito, + const std::string& injected_bundle_path); static void Delete(Ewk_Context*); // Get related class @@ -169,7 +170,7 @@ struct Ewk_Context : public base::RefCounted { EWebContext* impl; Ewk_Context(bool incognito); - Ewk_Context(const std::string& injectedBundlePath); + Ewk_Context(bool incognito, const std::string& injected_bundle_path); ~Ewk_Context(); Ewk_Context(const Ewk_Context&) = delete; diff --git a/tizen_src/ewk/efl_integration/public/ewk_context.cc b/tizen_src/ewk/efl_integration/public/ewk_context.cc index caa783f..95dd572 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_context.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_context.cc @@ -100,7 +100,8 @@ Ewk_Context* ewk_context_new() Ewk_Context *ewk_context_new_with_injected_bundle_path(const char *path) { EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL); - return Ewk_Context::Create(std::string(path)); + // To create new Ewk_Context with default incognito = false. + return Ewk_Context::Create(false,std::string(path)); } void ewk_context_delete(Ewk_Context* context) @@ -742,8 +743,8 @@ void ewk_context_compression_proxy_data_size_reset(Ewk_Context* context) Ewk_Context *ewk_context_new_with_injected_bundle_path_in_incognito_mode(const char *path) { - LOG_EWK_API_MOCKUP(); - return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL); + return Ewk_Context::Create(true, std::string(path)); } Eina_Bool ewk_context_audio_latency_mode_set(Ewk_Context* context, Ewk_Audio_Latency_Mode latency_mode) -- 2.7.4 From 3f2a40a8e27c70187d9a766ee6239f802256d4a8 Mon Sep 17 00:00:00 2001 From: uzair Date: Thu, 23 Feb 2023 09:28:56 +0530 Subject: [PATCH 07/16] Compiler error fixes for supporting VD QB Below change fixes compiler errors by partially migrating [1] and [2] for supporting VD QB. [1] https://review.tizen.org/gerrit/c/271760 [2] https://review.tizen.org/gerrit/c/271757 Change-Id: Iabea727eefc8c7e03fa01a6f529f9b1ed613b931 Signed-off-by: uzair --- tizen_src/ewk/efl_integration/public/ewk_view.cc | 31 ++++++++++- tizen_src/ewk/efl_integration/public/ewk_view.h | 2 +- .../ewk/efl_integration/public/ewk_view_internal.h | 65 ++++++++++++++++++++++ .../ewk/efl_integration/public/ewk_view_product.h | 5 +- 4 files changed, 100 insertions(+), 3 deletions(-) diff --git a/tizen_src/ewk/efl_integration/public/ewk_view.cc b/tizen_src/ewk/efl_integration/public/ewk_view.cc index c3407d8..dc263e2 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_view.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_view.cc @@ -1425,7 +1425,10 @@ void ewk_view_clear_all_tiles_resources(Evas_Object* ewkView) { LOG_EWK_API_MOCKUP(); } -Eina_Bool ewk_view_set_support_video_hole(Evas_Object* ewkView, Evas_Object* window, Eina_Bool enable, Eina_Bool isVideoWindow) { +Eina_Bool ewk_view_set_support_video_hole(Evas_Object* ewkView, + void* window, + Eina_Bool enable, + Eina_Bool isVideoWindow) { LOG_EWK_API_MOCKUP(); #if defined(TIZEN_VIDEO_HOLE) EWK_VIEW_IMPL_GET_OR_RETURN(ewkView, impl, EINA_FALSE); @@ -1570,6 +1573,32 @@ void ewk_view_floating_window_state_changed(const Evas_Object *o, Eina_Bool stat LOG_EWK_API_MOCKUP(); } +void ewk_view_feed_mouse_down(Evas_Object* view, + Ewk_Mouse_Button_Type button, + int x, + int y) { + LOG_EWK_API_MOCKUP("NUI feature is not enabled"); +} + +void ewk_view_feed_mouse_up(Evas_Object* view, + Ewk_Mouse_Button_Type button, + int x, + int y) { + LOG_EWK_API_MOCKUP("NUI feature is not enabled"); +} + +void ewk_view_feed_mouse_move(Evas_Object* view, int x, int y) { + LOG_EWK_API_MOCKUP("NUI feature is not enabled"); +} + +void ewk_view_feed_mouse_wheel(Evas_Object* view, + Eina_Bool y_direction, + int step, + int x, + int y) { + LOG_EWK_API_MOCKUP("NUI feature is not enabled"); +} + void ewk_view_auto_login(Evas_Object *view, const char* user_name, const char* password) { LOG_EWK_API_MOCKUP(); diff --git a/tizen_src/ewk/efl_integration/public/ewk_view.h b/tizen_src/ewk/efl_integration/public/ewk_view.h index 77e8c36..91ec416 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_view.h +++ b/tizen_src/ewk/efl_integration/public/ewk_view.h @@ -769,7 +769,7 @@ EXPORT_API void ewk_view_request_manifest(Evas_Object* o, Ewk_View_Request_Manif * @return return @c EINA_TRUE on success or @c EINA_FALSE on failure */ EXPORT_API Eina_Bool ewk_view_set_support_video_hole(Evas_Object* ewkView, - Evas_Object* window, + void* window, Eina_Bool enable, Eina_Bool isVideoWindow); #endif diff --git a/tizen_src/ewk/efl_integration/public/ewk_view_internal.h b/tizen_src/ewk/efl_integration/public/ewk_view_internal.h index f7a8de7842..986e3ef 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_view_internal.h +++ b/tizen_src/ewk/efl_integration/public/ewk_view_internal.h @@ -150,6 +150,13 @@ enum Ewk_Top_Control_State { }; typedef enum Ewk_Top_Control_State Ewk_Top_Control_State; +enum Ewk_Mouse_Button_Type { + EWK_Mouse_Button_Left = 1, + EWK_Mouse_Button_Middle = 2, + EWK_Mouse_Button_Right = 3 +}; +typedef enum Ewk_Mouse_Button_Type Ewk_Mouse_Button_Type; + /// Ewk view's class, to be overridden by sub-classes. struct Ewk_View_Smart_Class { Evas_Smart_Class sc; /**< all but 'data' is free to be changed. */ @@ -1422,6 +1429,64 @@ EXPORT_API void ewk_view_offscreen_rendering_enabled_set(Evas_Object* o, Eina_Bo */ EXPORT_API void ewk_view_ime_window_set(Evas_Object* o, void* window); +/** + * Sends mouse down event. + * + * @since_tizen 6.0 + * + * @param[in] o view object + * @param[in] button button type + * @param[in] x horizontal position of mouse event + * @param[in] y vertical position of mouse event + */ +EXPORT_API void ewk_view_feed_mouse_down(Evas_Object* o, + Ewk_Mouse_Button_Type button, + int x, + int y); + +/** + * Sends mouse up event. + * + * @since_tizen 6.0 + * + * @param[in] o view object + * @param[in] button button type + * @param[in] x horizontal position of mouse event + * @param[in] y vertical position of mouse event + */ +EXPORT_API void ewk_view_feed_mouse_up(Evas_Object* o, + Ewk_Mouse_Button_Type button, + int x, + int y); + +/** + * Sends mouse move event. + * + * @since_tizen 6.0 + * + * @param[in] o view object + * @param[in] x horizontal position of mouse event + * @param[in] y vertical position of mouse event + */ +EXPORT_API void ewk_view_feed_mouse_move(Evas_Object* o, int x, int y); + +/** + * Sends mouse wheel event. + * + * @since_tizen 6.0 + * + * @param[in] o view object + * @param[in] y_direction wheel mouse direction + * @param[in] step how much mouse wheel was scrolled up or down + * @param[in] x horizontal position of mouse event + * @param[in] y vertical position of mouse event + */ +EXPORT_API void ewk_view_feed_mouse_wheel(Evas_Object* o, + Eina_Bool y_direction, + int step, + int x, + int y); + #ifdef __cplusplus } #endif diff --git a/tizen_src/ewk/efl_integration/public/ewk_view_product.h b/tizen_src/ewk/efl_integration/public/ewk_view_product.h index cd9ceae..18b8752 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_view_product.h +++ b/tizen_src/ewk/efl_integration/public/ewk_view_product.h @@ -628,7 +628,10 @@ EXPORT_API Eina_Bool ewk_view_stop_video(Evas_Object* o, Ewk_Stop_Video_Callback * * @return return @c EINA_TRUE on success or @c EINA_FALSE on failure */ -EXPORT_API Eina_Bool ewk_view_set_support_video_hole(Evas_Object* ewkView, Evas_Object* window, Eina_Bool enable, Eina_Bool isVideoWindow); +EXPORT_API Eina_Bool ewk_view_set_support_video_hole(Evas_Object* ewkView, + void* window, + Eina_Bool enable, + Eina_Bool isVideoWindow); /** * @brief Sets the support of canvas hole, Use H/W overlay for video quality of WebGL 360 degree. -- 2.7.4 From 54f93930479e5cad88a19ee820a547e58c404614 Mon Sep 17 00:00:00 2001 From: "ayush.k123" Date: Wed, 22 Feb 2023 08:38:59 +0530 Subject: [PATCH 08/16] [M108 Migration] Support encoding property for WRT config.xml ewk_settings_default_text_encoding_name_set() was not affected due to |usesEncodingDetector| in TextResourceDecoder. If |defaultTextEncodingName| is changed by ewk_settings API, |usesEncodingDetector| will be disabled. References: https://review.tizen.org/gerrit/280599/ Change-Id: Ib1295cd52b07cdf5fa6284e706d46a70d10448c8 Signed-off-by: Ayush Kumar --- .../web_preferences_mojom_traits.cc | 5 ++-- .../common/web_preferences/web_preferences.h | 1 + .../web_preferences/web_preferences_mojom_traits.h | 4 ++++ .../mojom/webpreferences/web_preferences.mojom | 3 +++ third_party/blink/public/web/web_settings.h | 5 ++-- .../renderer/core/exported/web_settings_impl.cc | 8 +++++++ .../renderer/core/exported/web_settings_impl.h | 2 ++ .../blink/renderer/core/exported/web_view_impl.cc | 1 + .../blink/renderer/core/frame/settings.json5 | 5 ++++ .../html/parser/text_resource_decoder_builder.cc | 27 +++++++++++++++------- .../private/ewk_settings_private.cc | 1 + wrt/src/browser/wrt_browser_client.cc | 2 +- 12 files changed, 49 insertions(+), 15 deletions(-) diff --git a/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc b/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc index acbc8b2..7bb384f 100644 --- a/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc +++ b/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc @@ -180,13 +180,12 @@ bool StructTraitsforce_enable_zoom = data.force_enable_zoom(); out->link_effect_enabled = data.link_effect_enabled(); + out->uses_encoding_detector = data.uses_encoding_detector(); + out->atk_enabled = data.atk_enabled(); #endif #if BUILDFLAG(IS_TIZEN) out->max_refresh_rate = data.max_refresh_rate(); #endif -#if BUILDFLAG(IS_EFL) - out->atk_enabled = data.atk_enabled(); -#endif #if BUILDFLAG(IS_ANDROID) out->font_scale_factor = data.font_scale_factor(); out->device_scale_adjustment = data.device_scale_adjustment(); diff --git a/third_party/blink/public/common/web_preferences/web_preferences.h b/third_party/blink/public/common/web_preferences/web_preferences.h index b8115fb..0b1b1e8 100644 --- a/third_party/blink/public/common/web_preferences/web_preferences.h +++ b/third_party/blink/public/common/web_preferences/web_preferences.h @@ -238,6 +238,7 @@ struct BLINK_COMMON_EXPORT WebPreferences { bool text_zoom_enabled = false; bool selection_magnifier_enabled = false; bool long_press_enabled = false; + bool uses_encoding_detector = true; #endif bool double_tap_to_zoom_enabled; diff --git a/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h b/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h index b004407..f63111c 100644 --- a/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h +++ b/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h @@ -595,6 +595,10 @@ struct BLINK_COMMON_EXPORT StructTraitsTizenCompatibilityModeEnabled(); } + +void WebSettingsImpl::SetUsesEncodingDetector(bool uses_encoding_detector) { + settings_->SetUsesEncodingDetector(uses_encoding_detector); +} + +bool WebSettingsImpl::UsesEncodingDetector() const { + return settings_->GetUsesEncodingDetector(); +} #endif #if defined(TIZEN_ATK_SUPPORT) diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.h b/third_party/blink/renderer/core/exported/web_settings_impl.h index f316fa7..3d896b7 100644 --- a/third_party/blink/renderer/core/exported/web_settings_impl.h +++ b/third_party/blink/renderer/core/exported/web_settings_impl.h @@ -230,6 +230,8 @@ class CORE_EXPORT WebSettingsImpl final : public WebSettings { void SetLinkEffectEnabled(bool) override; bool LinkEffectEnabled() const override; bool TizenCompatibilityModeEnabled() const override; + void SetUsesEncodingDetector(bool) override; + bool UsesEncodingDetector() const override; #endif #if defined(TIZEN_ATK_SUPPORT) diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index b2d3d6c..06b1fac 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc @@ -1709,6 +1709,7 @@ void WebView::ApplyWebPreferences(const web_pref::WebPreferences& prefs, prefs.tizen_version_release); web_view_impl->SetIgnoreViewportTagScaleLimits(prefs.force_enable_zoom); settings->SetLoadWithOverviewMode(prefs.shrinks_viewport_contents_to_fit); + settings->SetUsesEncodingDetector(prefs.uses_encoding_detector); #endif #if BUILDFLAG(IS_TIZEN) diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5 index 0025005..5331ed9 100644 --- a/third_party/blink/renderer/core/frame/settings.json5 +++ b/third_party/blink/renderer/core/frame/settings.json5 @@ -223,6 +223,11 @@ }, { + name: "usesEncodingDetector", + initial: false, + }, + + { name: "presentationRequiresUserGesture", initial: true, }, diff --git a/third_party/blink/renderer/core/html/parser/text_resource_decoder_builder.cc b/third_party/blink/renderer/core/html/parser/text_resource_decoder_builder.cc index 006d0cb..d789152 100644 --- a/third_party/blink/renderer/core/html/parser/text_resource_decoder_builder.cc +++ b/third_party/blink/renderer/core/html/parser/text_resource_decoder_builder.cc @@ -142,14 +142,25 @@ std::unique_ptr BuildTextResourceDecoder( TextResourceDecoderOptions::kJSONContent, default_encoding)); use_hint_encoding = false; } else { - WTF::TextEncoding hint_encoding; - if (use_hint_encoding && - parent_frame->GetDocument()->EncodingWasDetectedHeuristically()) - hint_encoding = parent_frame->GetDocument()->Encoding(); - decoder = std::make_unique( - TextResourceDecoderOptions::CreateWithAutoDetection( - DetermineContentType(mime_type), default_encoding, hint_encoding, - url)); +#if BUILDFLAG(IS_EFL) + if (!encoding_from_domain.IsValid() && + !frame->GetSettings()->GetUsesEncodingDetector()) { + decoder = + std::make_unique(TextResourceDecoderOptions( + DetermineContentType(mime_type), default_encoding)); + } else { +#endif + WTF::TextEncoding hint_encoding; + if (use_hint_encoding && + parent_frame->GetDocument()->EncodingWasDetectedHeuristically()) + hint_encoding = parent_frame->GetDocument()->Encoding(); + decoder = std::make_unique( + TextResourceDecoderOptions::CreateWithAutoDetection( + DetermineContentType(mime_type), default_encoding, hint_encoding, + url)); +#if BUILDFLAG(IS_EFL) + } +#endif } } else { decoder = std::make_unique(TextResourceDecoderOptions( diff --git a/tizen_src/ewk/efl_integration/private/ewk_settings_private.cc b/tizen_src/ewk/efl_integration/private/ewk_settings_private.cc index 6112948..607544f 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_settings_private.cc +++ b/tizen_src/ewk/efl_integration/private/ewk_settings_private.cc @@ -18,6 +18,7 @@ void Ewk_Settings::setCurrentLegacyFontSizeMode(Ewk_Legacy_Font_Size_Mode mode) } void Ewk_Settings::setDefaultTextEncoding(const char* encoding) { + m_preferences.uses_encoding_detector = !(encoding && *encoding); if (encoding) m_preferences.default_encoding = encoding; } diff --git a/wrt/src/browser/wrt_browser_client.cc b/wrt/src/browser/wrt_browser_client.cc index 0bdee4c..0cf861c 100755 --- a/wrt/src/browser/wrt_browser_client.cc +++ b/wrt/src/browser/wrt_browser_client.cc @@ -236,9 +236,9 @@ void WRTBrowserClient::OverrideWebkitPrefs( auto& runtime = NativeWebRuntime::GetInstance(); prefs->default_encoding = runtime.GetEncodingType(); -#if !defined(WRT_JS_BRINGUP) prefs->uses_encoding_detector = false; +#if !defined(WRT_JS_BRINGUP) if (IsWearableProfile() && WRTNativeWindow::GetWindowShape() == WRTNativeWindow::Shape::SQUARE) { prefs->mirror_blur_enabled = true; -- 2.7.4 From 58a4432927bffadb30177dd0da32bc762d190c52 Mon Sep 17 00:00:00 2001 From: "ayush.k123" Date: Tue, 21 Feb 2023 14:40:32 +0530 Subject: [PATCH 09/16] [M108 Migration] Remove EWK_BRINGUP from ewk_settings.cc This patch removes EWK_BRINGUP and unused code from ewk_settings.cc. References: https://review.tizen.org/gerrit/280785/ Change-Id: I7950338a8fb06b8d07e82f991d81f72185227cec Signed-off-by: Ayush Kumar --- .../ewk/efl_integration/public/ewk_settings.cc | 112 ++------------------- 1 file changed, 9 insertions(+), 103 deletions(-) diff --git a/tizen_src/ewk/efl_integration/public/ewk_settings.cc b/tizen_src/ewk/efl_integration/public/ewk_settings.cc index ea62255..d406e3fd 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_settings.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_settings.cc @@ -40,18 +40,6 @@ void ewkUpdateWebkitPreferences(Evas_Object *ewkView) EWebView* impl = EWebView::FromEvasObject(ewkView); assert(impl); - bool autoSelectWord = ewk_settings_select_word_automatically_get(impl->GetSettings()); - // TODO(sns.park) : remove dependency to chromium internals - if(autoSelectWord){ -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - ui::GestureConfiguration::set_double_tap_to_zoom_enabled(false); -#endif - } - else{ -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - ui::GestureConfiguration::set_double_tap_to_zoom_enabled(true); -#endif - } impl->UpdateWebKitPreferences(); } @@ -59,26 +47,14 @@ void ewkUpdateWebkitPreferences(Evas_Object *ewkView) Eina_Bool ewk_settings_fullscreen_enabled_set(Ewk_Settings* settings, Eina_Bool enable) { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup -#pragma message "[M38] fullscreen_enabled flag has been deleted from webpreference.h" - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); - settings->getPreferences().fullscreen_enabled = enable; - ewkUpdateWebkitPreferences(settings->getEvasObject()); - return EINA_TRUE; -#else + LOG_EWK_API_MOCKUP("Not Supported by chromium"); return EINA_FALSE; -#endif } Eina_Bool ewk_settings_fullscreen_enabled_get(const Ewk_Settings* settings) { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup -#pragma message "[M38] fullscreen_enabled flag has been deleted from webpreference.h" - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); - return settings->getPreferences().fullscreen_enabled; -#else + LOG_EWK_API_MOCKUP("Not Supported by chromium"); return EINA_FALSE; -#endif } Eina_Bool ewk_settings_javascript_enabled_set(Ewk_Settings* settings, Eina_Bool enable) @@ -242,12 +218,8 @@ Eina_Bool ewk_settings_private_browsing_enabled_get(const Ewk_Settings* settings Eina_Bool ewk_settings_editable_link_behavior_set(Ewk_Settings* settings, Ewk_Editable_Link_Behavior behavior) { - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - settings->getPreferences().editable_link_behavior = static_cast(behavior); -#endif - ewkUpdateWebkitPreferences(settings->getEvasObject()); - return EINA_TRUE; + LOG_EWK_API_MOCKUP("Not Supported by chromium"); + return EINA_FALSE; } Eina_Bool ewk_settings_load_remote_images_set(Ewk_Settings* settings, Eina_Bool loadRemoteImages) @@ -335,9 +307,7 @@ Eina_Bool ewk_settings_link_effect_enabled_get(const Ewk_Settings* settings) Eina_Bool ewk_settings_uses_encoding_detector_set(Ewk_Settings* settings, Eina_Bool use) { EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup settings->getPreferences().uses_encoding_detector = use; -#endif ewkUpdateWebkitPreferences(settings->getEvasObject()); return EINA_TRUE; } @@ -345,11 +315,7 @@ Eina_Bool ewk_settings_uses_encoding_detector_set(Ewk_Settings* settings, Eina_B Eina_Bool ewk_settings_uses_encoding_detector_get(const Ewk_Settings* settings) { EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup return settings->getPreferences().uses_encoding_detector; -#else - return EINA_FALSE; -#endif } Eina_Bool ewk_settings_default_keypad_enabled_set(Ewk_Settings* settings, Eina_Bool enable) @@ -566,22 +532,14 @@ Eina_Bool ewk_settings_select_word_automatically_get(const Ewk_Settings* setting Ewk_List_Style_Position ewk_settings_initial_list_style_position_get(const Ewk_Settings* settings) { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EWK_LIST_STYLE_POSITION_OUTSIDE); - return static_cast(settings->getPreferences().initial_list_style_position); -#else + LOG_EWK_API_MOCKUP("Not Supported by chromium"); return EWK_LIST_STYLE_POSITION_OUTSIDE; -#endif } Eina_Bool ewk_settings_initial_list_style_position_set(Ewk_Settings* settings, Ewk_List_Style_Position style) { - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EINA_FALSE); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - settings->getPreferences().initial_list_style_position = static_cast(style); -#endif - ewkUpdateWebkitPreferences(settings->getEvasObject()); - return EINA_TRUE; + LOG_EWK_API_MOCKUP("Not Supported by chromium"); + return EINA_FALSE; } Eina_Bool ewk_settings_webkit_text_size_adjust_enabled_set(Ewk_Settings* settings, Eina_Bool enabled) @@ -596,20 +554,13 @@ Eina_Bool ewk_settings_webkit_text_size_adjust_enabled_set(Ewk_Settings* setting // TODO: this API is gone in newer versions of webkit-efl void ewk_settings_detect_contents_automatically_set(Ewk_Settings* settings, Eina_Bool enable) { - EINA_SAFETY_ON_NULL_RETURN(settings); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - settings->setDetectContentsEnabled(enable); -#endif + LOG_EWK_API_MOCKUP("Not Supported by chromium"); } Eina_Bool ewk_settings_detect_contents_automatically_get(const Ewk_Settings* settings) { - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - return settings->getDetectContentsEnabled(); -#else + LOG_EWK_API_MOCKUP("Not Supported by chromium"); return EINA_FALSE; -#endif } void ewk_settings_cache_builder_enabled_set(Ewk_Settings *settings, Eina_Bool enabled) @@ -671,51 +622,6 @@ Eina_Bool ewk_settings_encoding_detector_enabled_set(Ewk_Settings* settings, Ein return EINA_FALSE; } -namespace { -#define EXTRA_FEATURE_FUNCTIONS(VALNAME) \ - void Ewk_Extra_Feature_Set_ ## VALNAME(Ewk_Settings* settings, Eina_Bool value) \ - { \ - EINA_SAFETY_ON_NULL_RETURN(settings); \ - settings->set ## VALNAME ## Enabled(value == EINA_TRUE); \ - } \ - Eina_Bool Ewk_Extra_Feature_Get_ ## VALNAME(const Ewk_Settings* settings) \ - { \ - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EINA_FALSE); \ - return settings->get ## VALNAME ## Enabled() ? EINA_TRUE : EINA_FALSE; \ - } - -#define EWK_EXTRA_FEATURE(NAME, VALNAME) {NAME, Ewk_Extra_Feature_Set_## VALNAME, Ewk_Extra_Feature_Get_ ## VALNAME} - - EXTRA_FEATURE_FUNCTIONS(LongPress) - EXTRA_FEATURE_FUNCTIONS(LinkMagnifier) - EXTRA_FEATURE_FUNCTIONS(DetectContents) - EXTRA_FEATURE_FUNCTIONS(WebLogin) - EXTRA_FEATURE_FUNCTIONS(DoubleTap) - EXTRA_FEATURE_FUNCTIONS(Zoom) - EXTRA_FEATURE_FUNCTIONS(OpenPanel) - EXTRA_FEATURE_FUNCTIONS(AllowRestrictedURL) - EXTRA_FEATURE_FUNCTIONS(URLBarHide) - - void Ewk_Extra_Feature_Set_ViewportQuirk(Ewk_Settings* settings, Eina_Bool value) - { - EINA_SAFETY_ON_NULL_RETURN(settings); -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - settings->getPreferences().viewport_meta_non_user_scalable_quirk = value; -#endif - ewkUpdateWebkitPreferences(settings->getEvasObject()); - } - - Eina_Bool Ewk_Extra_Feature_Get_ViewportQuirk(const Ewk_Settings* settings) - { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); - return settings->getPreferences().viewport_meta_non_user_scalable_quirk; -#else - return EINA_FALSE; -#endif - } -} - Eina_Bool ewk_settings_extra_feature_get(const Ewk_Settings* settings, const char* feature) { EINA_SAFETY_ON_NULL_RETURN_VAL(settings, EINA_FALSE); -- 2.7.4 From 348206f00fe6f075a97c3a3599fa63070c39b8f0 Mon Sep 17 00:00:00 2001 From: Venugopal S M Date: Mon, 20 Feb 2023 18:34:15 +0530 Subject: [PATCH 10/16] fixup! [MM] Implement MMPlayer(CAPI) path to support HBBTV. Notify the completion of playback(EOS) to the pipeline Reference: https://review.tizen.org/gerrit/288026 Change-Id: I74172a7d406d64b8c0868443acc02428ce040621 Signed-off-by: Sun-woo Nam --- tizen_src/chromium_impl/media/base/efl/media_player_manager_efl.h | 1 + tizen_src/chromium_impl/media/base/tizen/media_player_bridge_capi.cc | 1 + .../chromium_impl/media/filters/media_player_bridge_capi_adapter.cc | 4 ++++ .../chromium_impl/media/filters/media_player_bridge_capi_adapter.h | 1 + 4 files changed, 7 insertions(+) diff --git a/tizen_src/chromium_impl/media/base/efl/media_player_manager_efl.h b/tizen_src/chromium_impl/media/base/efl/media_player_manager_efl.h index b670084..90b05fc 100644 --- a/tizen_src/chromium_impl/media/base/efl/media_player_manager_efl.h +++ b/tizen_src/chromium_impl/media/base/efl/media_player_manager_efl.h @@ -25,6 +25,7 @@ class MEDIA_EXPORT MediaPlayerManager { virtual ~MediaPlayerManager() {} virtual MediaPlayerEfl* GetPlayer(int player_id) = 0; + virtual void OnEnded() = 0; virtual void OnTimeChanged(int player_id) = 0; virtual void OnTimeUpdate(int player_id, double current_time) = 0; virtual void OnRequestSeek(int player_id, double seek_time) = 0; diff --git a/tizen_src/chromium_impl/media/base/tizen/media_player_bridge_capi.cc b/tizen_src/chromium_impl/media/base/tizen/media_player_bridge_capi.cc index 9eefb6aa..4e37d58 100644 --- a/tizen_src/chromium_impl/media/base/tizen/media_player_bridge_capi.cc +++ b/tizen_src/chromium_impl/media/base/tizen/media_player_bridge_capi.cc @@ -597,6 +597,7 @@ void MediaPlayerBridgeCapi::PlaybackCompleteUpdate() { StopCurrentTimeUpdateTimer(); manager()->OnTimeUpdate(GetPlayerId(), GetCurrentTime()); manager()->OnTimeChanged(GetPlayerId()); + manager()->OnEnded(); } void MediaPlayerBridgeCapi::SeekCompleteUpdate() { diff --git a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc index a4aa284..97f1fbe 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc +++ b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.cc @@ -114,6 +114,10 @@ MediaPlayerEfl* MediaPlayerBridgeCapiAdapter::GetPlayer(int player_id) { return media_player_; } +void MediaPlayerBridgeCapiAdapter::OnEnded() { + renderer_client_->OnEnded(); +} + void MediaPlayerBridgeCapiAdapter::OnTimeChanged(int player_id) {} void MediaPlayerBridgeCapiAdapter::OnTimeUpdate(int player_id, diff --git a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h index 26df8d0..c93a172 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h +++ b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_adapter.h @@ -69,6 +69,7 @@ class MEDIA_EXPORT MediaPlayerBridgeCapiAdapter : public MediaPlayerTizen, // MediaPlayerManager MediaPlayerEfl* GetPlayer(int player_id) override; + void OnEnded() override; void OnTimeChanged(int player_id) override; void OnTimeUpdate(int player_id, double current_time) override; void OnRequestSeek(int player_id, double seek_time) override; -- 2.7.4 From af9df69141def45bdfb8caf79219ffde03266f50 Mon Sep 17 00:00:00 2001 From: Bakka Uday Kiran Date: Fri, 10 Feb 2023 15:02:59 +0530 Subject: [PATCH 11/16] [M108 Migration] Bringup Drag and Drop (DnD) This patch brings up DnD feature to M108. Between M85 and M94, due to upstream refactoring, the DragEnter notification IPC call is done through mojom::blink::PageBroadcast (WebViewImpl). Reference: https://review.tizen.org/gerrit/c/278386 Change-Id: I9aeb92ad80485f28434065c3cd582e9468497991 Signed-off-by: Bakka Uday Kiran --- content/browser/web_contents/web_contents_impl.cc | 9 +++ content/browser/web_contents/web_contents_impl.h | 5 ++ .../browser/web_contents/web_contents_view_aura.cc | 20 +++++ content/public/browser/web_contents.h | 4 + content/test/test_page_broadcast.cc | 4 + content/test/test_page_broadcast.h | 5 ++ packaging/chromium-efl.spec | 4 + .../context_menu_data/context_menu_mojom_traits.cc | 5 ++ .../context_menu_params_builder.cc | 5 ++ .../untrustworthy_context_menu_params.cc | 5 ++ .../common/context_menu_data/context_menu_data.h | 5 ++ .../context_menu_data/context_menu_mojom_traits.h | 6 ++ .../untrustworthy_context_menu_params.h | 5 ++ third_party/blink/public/mojom/BUILD.gn | 5 ++ .../public/mojom/context_menu/context_menu.mojom | 4 + third_party/blink/public/mojom/page/page.mojom | 4 + third_party/blink/public/web/web_frame.h | 5 ++ .../blink/renderer/core/exported/web_view_impl.cc | 7 ++ .../blink/renderer/core/exported/web_view_impl.h | 3 + .../renderer/core/frame/web_local_frame_impl.cc | 5 ++ .../renderer/core/frame/web_local_frame_impl.h | 4 + .../blink/renderer/core/input/event_handler.cc | 6 ++ .../blink/renderer/core/input/event_handler.h | 4 + .../blink/renderer/core/input/gesture_manager.cc | 10 +++ .../blink/renderer/core/input/gesture_manager.h | 8 ++ .../renderer/core/input/mouse_event_manager.cc | 36 +++++++++ .../renderer/core/input/mouse_event_manager.h | 4 + .../renderer/core/page/context_menu_controller.cc | 3 + tizen_src/build/config/tizen_features.gni | 1 + .../web_contents_view_aura_helper_efl.cc | 16 +++- .../web_contents_view_aura_helper_efl.h | 3 + .../browser/web_contents/web_drag_dest_efl.cc | 88 ++++++++------------- .../browser/web_contents/web_drag_dest_efl.h | 8 +- .../browser/web_contents/web_drag_source_efl.cc | 66 ++++++++++++---- .../browser/web_contents/web_drag_source_efl.h | 7 +- tizen_src/chromium_impl/content/common/BUILD.gn | 1 + .../chromium_impl/content/common/paths_efl.cc | 13 +++ tizen_src/ewk/efl_integration/BUILD.gn | 6 ++ tizen_src/ewk/efl_integration/command_line_efl.cc | 3 + .../efl_integration/context_menu_controller_efl.cc | 29 ++++--- tizen_src/ewk/efl_integration/eweb_view.cc | 9 +++ tizen_src/ewk/efl_integration/eweb_view.h | 3 + .../resource/images/broken_image.png | Bin 0 -> 810 bytes 43 files changed, 345 insertions(+), 98 deletions(-) create mode 100644 tizen_src/ewk/efl_integration/resource/images/broken_image.png diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 9818f54..b8dbef7 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -4833,6 +4833,15 @@ void WebContentsImpl::SetHistoryOffsetAndLengthForView( broadcast->SetHistoryOffsetAndLength(history_offset, history_length); } +#if BUILDFLAG(IS_TIZEN) +void WebContentsImpl::EnterDragState(RenderViewHost* render_view_host) { + if (auto& broadcast = static_cast(render_view_host) + ->GetAssociatedPageBroadcast()) { + broadcast->EnterDragState(); + } +} +#endif + void WebContentsImpl::ReloadFocusedFrame() { OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::ReloadFocusedFrame"); RenderFrameHost* focused_frame = GetFocusedFrame(); diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index c9399b5..1c2f209 100755 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -1763,6 +1763,11 @@ class CONTENT_EXPORT WebContentsImpl : public WebContents, void LoadingStateChanged(bool should_show_loading_ui, LoadNotificationDetails* details); +#if BUILDFLAG(IS_TIZEN) + // Notifes the delegate to enter into drag state. + void EnterDragState(RenderViewHost* render_view_host); +#endif + // Misc non-view stuff ------------------------------------------------------- // Sets the history for a specified RenderViewHost to |history_length| diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index f371758..0d13728 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc @@ -720,6 +720,8 @@ WebContentsViewAura::WebContentsViewAura( wcva_helper_ = std::make_unique( this, web_contents_, delegate_.get()); + if (wcva_helper_) + wcva_helper_->SetViewDelegate(delegate_.get()); #endif } @@ -1002,6 +1004,10 @@ void WebContentsViewAura::FocusThroughTabTraversal(bool reverse) { } DropData* WebContentsViewAura::GetDropData() const { +#if BUILDFLAG(IS_EFL) + if (wcva_helper()) + return wcva_helper()->GetDropData(); +#endif return current_drop_data_.get(); } @@ -1119,6 +1125,13 @@ RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget( InstallOverscrollControllerDelegate(view); } +#if BUILDFLAG(IS_EFL) + if (wcva_helper()) { + RenderViewHost* render_view_host = web_contents_->GetRenderViewHost(); + wcva_helper()->UpdateDragDest(render_view_host); + } +#endif + return view; } @@ -1187,6 +1200,13 @@ void WebContentsViewAura::StartDragging( const gfx::Rect& drag_obj_rect, const blink::mojom::DragEventSourceInfo& event_info, RenderWidgetHostImpl* source_rwh) { +#if BUILDFLAG(IS_EFL) + if (wcva_helper()) { + wcva_helper()->StartDragging(drop_data, operations, image, cursor_offset, + event_info, source_rwh); + return; + } +#endif aura::Window* root_window = GetNativeView()->GetRootWindow(); if (!aura::client::GetDragDropClient(root_window)) { web_contents_->SystemDragEnded(source_rwh); diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h index 273d548..bbb8bca 100755 --- a/content/public/browser/web_contents.h +++ b/content/public/browser/web_contents.h @@ -921,6 +921,10 @@ class WebContents : public PageNavigator, // Returns the current drop data, if any. virtual DropData* GetDropData() = 0; +#if BUILDFLAG(IS_TIZEN) + virtual void EnterDragState(RenderViewHost* render_view_host) = 0; +#endif + // Sets focus to the native widget for this tab. virtual void Focus() = 0; diff --git a/content/test/test_page_broadcast.cc b/content/test/test_page_broadcast.cc index 57fad67..c74ac78 100644 --- a/content/test/test_page_broadcast.cc +++ b/content/test/test_page_broadcast.cc @@ -51,6 +51,10 @@ void TestPageBroadcast::ScrollFocusedNodeIntoView() {} void TestPageBroadcast::SetScrollOffset(float x, float y) {} #endif +#if BUILDFLAG(IS_TIZEN) +void TestPageBroadcast::EnterDragState() {} +#endif + void TestPageBroadcast::SetPageBaseBackgroundColor( absl::optional color) {} diff --git a/content/test/test_page_broadcast.h b/content/test/test_page_broadcast.h index c501cfc..2058bdc 100644 --- a/content/test/test_page_broadcast.h +++ b/content/test/test_page_broadcast.h @@ -37,6 +37,11 @@ class TestPageBroadcast : public blink::mojom::PageBroadcast { void ScrollFocusedNodeIntoView() override; void SetScrollOffset(float x, float y) override; #endif + +#if BUILDFLAG(IS_TIZEN) + void EnterDragState() override; +#endif + void SetPageBaseBackgroundColor(absl::optional color) override; void CreateRemoteMainFrame( const blink::RemoteFrameToken& token, diff --git a/packaging/chromium-efl.spec b/packaging/chromium-efl.spec index 04fa71a..e8e97a4 100644 --- a/packaging/chromium-efl.spec +++ b/packaging/chromium-efl.spec @@ -351,6 +351,7 @@ fi "is_tizen=true" \ "data_dir=\"%{CHROMIUM_DATA_DIR}\"" \ "edje_dir=\"%{CHROMIUM_DATA_DIR}/themes\"" \ + "image_dir=\"%{CHROMIUM_DATA_DIR}/images\"" \ "exe_dir=\"%{CHROMIUM_EXE_DIR}\"" \ "tizen_version=%{tizen_version}" \ "tizen_version_major=%{tizen_version_major}" \ @@ -455,6 +456,7 @@ install -d "%{buildroot}"%{_includedir}/v8 install -d "%{buildroot}%{CHROMIUM_EXE_DIR}" install -d "%{buildroot}%{CHROMIUM_EXE_DIR}"/locales install -d "%{buildroot}%{CHROMIUM_DATA_DIR}"/themes +install -d "%{buildroot}"%{CHROMIUM_DATA_DIR}/images install -d "%{buildroot}"%{_libdir}/../local/lib/ %if %{__use_clang} == 1 @@ -465,6 +467,7 @@ install -m 0755 "%{OUTPUT_FOLDER}"/icudtl.dat "%{buildroot}%{CHROMIUM_EXE_DIR install -m 0755 "%{OUTPUT_FOLDER}"/snapshot_blob.bin "%{buildroot}%{CHROMIUM_EXE_DIR}" install -m 0644 "%{OUTPUT_FOLDER}"/content_shell.pak "%{buildroot}%{CHROMIUM_EXE_DIR}" install -m 0644 "%{OUTPUT_FOLDER}"/resources/*.edj "%{buildroot}%{CHROMIUM_DATA_DIR}"/themes +install -m 0644 "%{OUTPUT_FOLDER}"/images/*.png "%{buildroot}%{CHROMIUM_DATA_DIR}"/images/ install -d "%{OUTPUT_FOLDER}"/packages install -d %{buildroot}%{_xmldir} @@ -651,6 +654,7 @@ setcap cap_mac_admin=eip %{_bindir}/wrt-service %{CHROMIUM_EXE_DIR}/content_shell.pak %{CHROMIUM_EXE_DIR}/locales/*.pak %{CHROMIUM_DATA_DIR}/themes/*.edj +%{CHROMIUM_DATA_DIR}/images/*.png %if %{__build_chrome} == 1 %{CHROMIUM_EXE_DIR}/chrome_100_percent.pak diff --git a/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc b/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc index a26b986..4a34262 100644 --- a/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc +++ b/third_party/blink/common/context_menu_data/context_menu_mojom_traits.cc @@ -62,6 +62,11 @@ bool StructTraitsis_text_node = data.is_text_node(); #endif + +#if BUILDFLAG(IS_TIZEN) + out->is_draggable = data.is_draggable(); +#endif + out->writing_direction_default = data.writing_direction_default(); out->writing_direction_left_to_right = data.writing_direction_left_to_right(); out->writing_direction_right_to_left = data.writing_direction_right_to_left(); diff --git a/third_party/blink/common/context_menu_data/context_menu_params_builder.cc b/third_party/blink/common/context_menu_data/context_menu_params_builder.cc index e257944..b9532c7 100644 --- a/third_party/blink/common/context_menu_data/context_menu_params_builder.cc +++ b/third_party/blink/common/context_menu_data/context_menu_params_builder.cc @@ -58,6 +58,11 @@ UntrustworthyContextMenuParams ContextMenuParamsBuilder::Build( #if BUILDFLAG(IS_EFL) params.is_text_node = data.is_text_node; #endif + +#if BUILDFLAG(IS_TIZEN) + params.is_draggable = data.is_draggable; +#endif + params.writing_direction_default = data.writing_direction_default; params.writing_direction_left_to_right = data.writing_direction_left_to_right; params.writing_direction_right_to_left = data.writing_direction_right_to_left; diff --git a/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc b/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc index 5ede70a..5e99669 100644 --- a/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc +++ b/third_party/blink/common/context_menu_data/untrustworthy_context_menu_params.cc @@ -65,6 +65,11 @@ void UntrustworthyContextMenuParams::Assign( #if BUILDFLAG(IS_EFL) is_text_node = other.is_text_node; #endif + +#if BUILDFLAG(IS_TIZEN) + is_draggable = other.is_draggable; +#endif + writing_direction_default = other.writing_direction_default; writing_direction_left_to_right = other.writing_direction_left_to_right; writing_direction_right_to_left = other.writing_direction_right_to_left; diff --git a/third_party/blink/public/common/context_menu_data/context_menu_data.h b/third_party/blink/public/common/context_menu_data/context_menu_data.h index 611b3a8..0168924 100644 --- a/third_party/blink/public/common/context_menu_data/context_menu_data.h +++ b/third_party/blink/public/common/context_menu_data/context_menu_data.h @@ -121,6 +121,11 @@ struct ContextMenuData { bool is_text_node; #endif +#if BUILDFLAG(IS_TIZEN) + // Whether element is draggable. + bool is_draggable; +#endif + // If this node is an input field, the type of that field. blink::mojom::ContextMenuDataInputFieldType input_field_type; diff --git a/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h b/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h index 40c94c4..3fc5f80 100644 --- a/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h +++ b/third_party/blink/public/common/context_menu_data/context_menu_mojom_traits.h @@ -121,6 +121,12 @@ struct BLINK_COMMON_EXPORT } #endif +#if BUILDFLAG(IS_TIZEN) + static bool is_draggable(const blink::UntrustworthyContextMenuParams& r) { + return r.is_draggable; + } +#endif + static int writing_direction_default( const blink::UntrustworthyContextMenuParams& r) { return r.writing_direction_default; diff --git a/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h b/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h index 99a5b3a..d1676b0 100644 --- a/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h +++ b/third_party/blink/public/common/context_menu_data/untrustworthy_context_menu_params.h @@ -108,6 +108,11 @@ struct BLINK_COMMON_EXPORT UntrustworthyContextMenuParams { bool is_text_node; #endif +#if BUILDFLAG(IS_TIZEN) + // Whether element is draggable. + bool is_draggable; +#endif + // Writing direction menu items. int writing_direction_default; int writing_direction_left_to_right; diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index da550e3..3d36e4a 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn @@ -1114,6 +1114,11 @@ mojom("mojom_core") { ] enabled_features = [] + + if (is_tizen) { + enabled_features += [ "is_tizen" ] + } + if (use_efl) { enabled_features += [ "is_efl" ] } diff --git a/third_party/blink/public/mojom/context_menu/context_menu.mojom b/third_party/blink/public/mojom/context_menu/context_menu.mojom index 0aaa56f..60259f1 100644 --- a/third_party/blink/public/mojom/context_menu/context_menu.mojom +++ b/third_party/blink/public/mojom/context_menu/context_menu.mojom @@ -171,6 +171,10 @@ struct UntrustworthyContextMenuParams { [EnableIf=is_efl] bool is_text_node; + // Whether element is draggable + [EnableIf=is_tizen] + bool is_draggable; + // Writing direction menu items. int32 writing_direction_default; int32 writing_direction_left_to_right; diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom index d48ab58..d8e81cc 100644 --- a/third_party/blink/public/mojom/page/page.mojom +++ b/third_party/blink/public/mojom/page/page.mojom @@ -110,6 +110,10 @@ interface PageBroadcast { [EnableIf=is_efl] SetScrollOffset(float x, float y); + // Notifies webivew to enter into drag state. + [EnableIf=is_tizen] + EnterDragState(); + // Sent to whole page, but should only be used by the main frame. SetPageBaseBackgroundColor(skia.mojom.SkColor? color); diff --git a/third_party/blink/public/web/web_frame.h b/third_party/blink/public/web/web_frame.h index b88fb1a..4c4121f 100644 --- a/third_party/blink/public/web/web_frame.h +++ b/third_party/blink/public/web/web_frame.h @@ -192,6 +192,11 @@ class BLINK_EXPORT WebFrame { // RemoteFrame <--> RenderFrameProxyHost in the browser process. const FrameToken& GetFrameToken() const { return frame_token_; } +#if BUILDFLAG(IS_TIZEN) + // Enters web drag and drop state. + virtual void EnterDragState() {} +#endif + #if INSIDE_BLINK static WebFrame* FromCoreFrame(Frame*); static Frame* ToCoreFrame(const WebFrame&); diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index 06b1fac..3f64b57 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc @@ -3550,6 +3550,13 @@ void WebViewImpl::UpdateWebPreferences( ApplyCommandLineToSettings(SettingsImpl()); } +#if BUILDFLAG(IS_TIZEN) +void WebViewImpl::EnterDragState() { + if (MainFrameImpl()) + MainFrameImpl()->EnterDragState(); +} +#endif + void WebViewImpl::AddObserver(WebViewObserver* observer) { observers_.AddObserver(observer); } diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h index f4a0b57..e0947c1 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.h +++ b/third_party/blink/renderer/core/exported/web_view_impl.h @@ -309,6 +309,9 @@ class CORE_EXPORT WebViewImpl final : public WebView, const RendererPreferences& preferences) override; void SetHistoryOffsetAndLength(int32_t history_offset, int32_t history_length) override; +#if BUILDFLAG(IS_TIZEN) + void EnterDragState() override; +#endif void SetPageBaseBackgroundColor(absl::optional color) override; void CreateRemoteMainFrame( const RemoteFrameToken& frame_token, diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index 5e4f00b..c041fe2 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc @@ -1729,6 +1729,11 @@ gfx::Size WebLocalFrameImpl::ScrollableContentSize() const { ToPixelSnappedRect(GetFrameView()->GetLayoutView()->DocumentRect()) .size()); } + +void WebLocalFrameImpl::EnterDragState() { + if (GetFrame()) + GetFrame()->GetEventHandler().EnterDragState(); +} #endif void WebLocalFrameImpl::DeleteSurroundingTextInCodePoints(int before, diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h index 6031575..b226256 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h @@ -367,6 +367,10 @@ class CORE_EXPORT WebLocalFrameImpl final gfx::Size ScrollableContentSize() const override; #endif +#if BUILDFLAG(IS_TIZEN) + void EnterDragState() override; +#endif + // WebNavigationControl overrides: bool DispatchBeforeUnloadEvent(bool) override; void CommitNavigation( diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc index 825d76e..d451ade 100644 --- a/third_party/blink/renderer/core/input/event_handler.cc +++ b/third_party/blink/renderer/core/input/event_handler.cc @@ -1388,6 +1388,12 @@ WebInputEventResult EventHandler::PerformDragAndDrop( return result; } +#if BUILDFLAG(IS_TIZEN) +void EventHandler::EnterDragState() { + gesture_manager_->EnterDragState(); +} +#endif + void EventHandler::ClearDragState() { scroll_manager_->StopAutoscroll(); drag_target_ = nullptr; diff --git a/third_party/blink/renderer/core/input/event_handler.h b/third_party/blink/renderer/core/input/event_handler.h index 325d6a7..6f7855e 100644 --- a/third_party/blink/renderer/core/input/event_handler.h +++ b/third_party/blink/renderer/core/input/event_handler.h @@ -261,6 +261,10 @@ class CORE_EXPORT EventHandler final : public GarbageCollected { void ContextMenuEventForWordOrLinkSelection(const WebGestureEvent&); #endif +#if BUILDFLAG(IS_TIZEN) + void EnterDragState(); +#endif + // Clears drag target and related states. It is called when drag is done or // canceled. void ClearDragState(); diff --git a/third_party/blink/renderer/core/input/gesture_manager.cc b/third_party/blink/renderer/core/input/gesture_manager.cc index dd71c13b..5c38e9a8 100644 --- a/third_party/blink/renderer/core/input/gesture_manager.cc +++ b/third_party/blink/renderer/core/input/gesture_manager.cc @@ -183,6 +183,12 @@ bool GestureManager::GestureContextMenuDeferred() const { return gesture_context_menu_deferred_; } +#if BUILDFLAG(IS_TIZEN) +void GestureManager::EnterDragState() { + mouse_event_manager_->EnterDragState(last_gesture_event_); +} +#endif + WebInputEventResult GestureManager::HandleGestureTapDown( const GestureEventWithHitTestResults& targeted_event) { suppress_mouse_events_from_gestures_ = @@ -398,6 +404,10 @@ WebInputEventResult GestureManager::HandleGestureLongPress( const GestureEventWithHitTestResults& targeted_event) { const WebGestureEvent& gesture_event = targeted_event.Event(); +#if BUILDFLAG(IS_TIZEN) + last_gesture_event_ = gesture_event; +#endif + // FIXME: Ideally we should try to remove the extra mouse-specific hit-tests // here (re-using the supplied HitTestResult), but that will require some // overhaul of the touch drag-and-drop code and LongPress is such a special diff --git a/third_party/blink/renderer/core/input/gesture_manager.h b/third_party/blink/renderer/core/input/gesture_manager.h index 2553a4a..3a4c62b 100644 --- a/third_party/blink/renderer/core/input/gesture_manager.h +++ b/third_party/blink/renderer/core/input/gesture_manager.h @@ -68,6 +68,10 @@ class CORE_EXPORT GestureManager final // This must be called from local root frame. void NotifyPointerEventHandled(const WebPointerEvent& web_pointer_event); +#if BUILDFLAG(IS_TIZEN) + void EnterDragState(); +#endif + private: WebInputEventResult HandleGestureShowPress(); WebInputEventResult HandleGestureTapDown( @@ -114,6 +118,10 @@ class CORE_EXPORT GestureManager final Member mouse_event_manager_; Member pointer_event_manager_; +#if BUILDFLAG(IS_TIZEN) + WebGestureEvent last_gesture_event_; +#endif + // Set on GestureTapDown if the |pointerdown| event corresponding to the // triggering |touchstart| event was canceled. This suppresses mouse event // firing for the current gesture sequence (i.e. until next GestureTapDown). diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.cc b/third_party/blink/renderer/core/input/mouse_event_manager.cc index e8cce48..18cc985 100644 --- a/third_party/blink/renderer/core/input/mouse_event_manager.cc +++ b/third_party/blink/renderer/core/input/mouse_event_manager.cc @@ -58,6 +58,10 @@ #include "ui/gfx/geometry/point_conversions.h" #include "ui/gfx/geometry/quad_f.h" +#if BUILDFLAG(IS_TIZEN) +#include "tizen/system_info.h" +#endif + namespace blink { namespace { @@ -745,6 +749,10 @@ void MouseEventManager::UpdateSelectionForMouseDrag() { bool MouseEventManager::HandleDragDropIfPossible( const GestureEventWithHitTestResults& targeted_event) { +#if BUILDFLAG(IS_TIZEN) + if (IsMobileProfile()) + return false; +#endif const WebGestureEvent& gesture_event = targeted_event.Event(); unsigned modifiers = gesture_event.GetModifiers(); @@ -772,6 +780,34 @@ bool MouseEventManager::HandleDragDropIfPossible( return HandleDrag(mev, DragInitiator::kTouch); } +#if BUILDFLAG(IS_TIZEN) +void MouseEventManager::EnterDragState( + const WebGestureEvent& last_gesture_event) { + if (frame_->GetSettings() && + frame_->GetSettings()->GetTouchDragDropEnabled() && frame_->View()) { + mouse_down_ = WebMouseEvent( + WebInputEvent::Type::kMouseDown, last_gesture_event, + WebPointerProperties::Button::kLeft, 1, + WebInputEvent::Modifiers::kLeftButtonDown, base::TimeTicks::Now()); + + WebMouseEvent mouse_drag_event( + WebInputEvent::Type::kMouseMove, last_gesture_event, + WebPointerProperties::Button::kLeft, 1, + WebInputEvent::Modifiers::kLeftButtonDown, base::TimeTicks::Now()); + + HitTestRequest request(HitTestRequest::kReadOnly); + MouseEventWithHitTestResults mev = + event_handling_util::PerformMouseEventHitTest(frame_, request, + mouse_drag_event); + mouse_down_may_start_drag_ = true; + ResetDragSource(); + mouse_down_pos_ = frame_->View()->ConvertFromRootFrame( + gfx::ToFlooredPoint(mouse_drag_event.PositionInRootFrame())); + HandleDrag(mev, DragInitiator::kTouch); + } +} +#endif + void MouseEventManager::FocusDocumentView() { Page* page = frame_->GetPage(); if (!page) diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.h b/third_party/blink/renderer/core/input/mouse_event_manager.h index bfd4d72..e153cfe 100644 --- a/third_party/blink/renderer/core/input/mouse_event_manager.h +++ b/third_party/blink/renderer/core/input/mouse_event_manager.h @@ -101,6 +101,10 @@ class CORE_EXPORT MouseEventManager final DragState& GetDragState(); +#if BUILDFLAG(IS_TIZEN) + void EnterDragState(const WebGestureEvent&); +#endif + void FocusDocumentView(); // Resets the state that indicates the next events could cause a drag. It is diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc index 27ec0bfb..854831a 100644 --- a/third_party/blink/renderer/core/page/context_menu_controller.cc +++ b/third_party/blink/renderer/core/page/context_menu_controller.cc @@ -508,6 +508,9 @@ bool ContextMenuController::ShowContextMenu(LocalFrame* frame, auto* html_element = DynamicTo(result.InnerNode()); if (html_element) { +#if BUILDFLAG(IS_TIZEN) + data.is_draggable = html_element->draggable(); +#endif data.title_text = html_element->title().Utf8(); data.alt_text = html_element->AltText().Utf8(); } diff --git a/tizen_src/build/config/tizen_features.gni b/tizen_src/build/config/tizen_features.gni index 3b91599..47b30e0 100644 --- a/tizen_src/build/config/tizen_features.gni +++ b/tizen_src/build/config/tizen_features.gni @@ -38,6 +38,7 @@ declare_args() { edje_dir = "/usr/share/chromium-efl/themes/" tizen_data_dir = "/usr/share/chromium-efl/" locale_dir = "/usr/share/chromium-efl/locale/" + image_dir = "/usr/share/chromium-efl/images/" chromium_impl_lib_name = "libchromium-ewk.so" tizen_version = 0 diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.cc b/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.cc index 8b2ea46..30584d7 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.cc +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.cc @@ -99,8 +99,10 @@ void WebContentsViewAuraHelperEfl::StartDragging( const blink::mojom::DragEventSourceInfo& event_info, RenderWidgetHostImpl* source_rwh) { if (drag_dest_) { - drag_dest_->SetDropData(drop_data); - drag_dest_->SetAction(allowed_ops); + if (drag_dest_.get()) { + drag_dest_->SetDropData(drop_data); + drag_dest_->SetAction(allowed_ops); + } } if (!drag_source_) { @@ -109,14 +111,15 @@ void WebContentsViewAuraHelperEfl::StartDragging( } if (!drag_source_->StartDragging(drop_data, allowed_ops, event_info.location, - *image.bitmap(), image_offset)) { + *image.bitmap(), image_offset, source_rwh)) { web_contents_->SystemDragEnded(source_rwh); } } DropData* WebContentsViewAuraHelperEfl::GetDropData() const { if (drag_dest_) - return drag_dest_->GetDropData(); + if (drag_dest_.get()) + return drag_dest_->GetDropData(); return nullptr; } @@ -175,4 +178,9 @@ void WebContentsViewAuraHelperEfl::OnOverscrolled( } } +void WebContentsViewAuraHelperEfl::SetViewDelegate( + WebContentsViewDelegate* delegate) { + delegate = view_delegate_; +} + } // namespace content diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.h b/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.h index a732c19..3639625 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.h +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_contents_view_aura_helper_efl.h @@ -17,6 +17,8 @@ #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/common/page/drag_operation.h" #include "third_party/blink/public/mojom/choosers/popup_menu.mojom.h" +#include "third_party/blink/public/mojom/drag/drag.mojom.h" +#include "tizen_src/chromium_impl/content/public/browser/web_contents_efl_delegate.h" #include "ui/gfx/image/image_skia.h" namespace content { @@ -58,6 +60,7 @@ class CONTENT_EXPORT WebContentsViewAuraHelperEfl { void SetEflDelegate(WebContentsEflDelegate*); WebContentsEflDelegate* GetEflDelegate(); + void SetViewDelegate(WebContentsViewDelegate* delegate); void UpdateDragDest(RenderViewHost* host); void StartDragging(const DropData& drop_data, blink::DragOperationsMask allowed_ops, diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.cc b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.cc index 75dc051..79d920c 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.cc +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.cc @@ -7,8 +7,9 @@ #include "build/tizen_version.h" #include "content/browser/web_contents/web_contents_impl.h" -#include "content/public/browser/web_drag_dest_delegate.h" #include "content/public/browser/render_view_host.h" +#include "content/public/browser/render_widget_host.h" +#include "content/public/browser/web_drag_dest_delegate.h" #include "ui/display/screen.h" namespace content { @@ -42,14 +43,12 @@ WebDragDestEfl::WebDragDestEfl(WebContents* web_contents) delegate_(nullptr), web_contents_(web_contents), page_scale_factor_(1.0f), + drag_action_(blink::kDragOperationNone), drag_initialized_(false) { -#if defined(USE_AURA) - parent_view_ = nullptr; -#else - parent_view_ = static_cast(web_contents->GetNativeView()); -#endif device_scale_factor_ = display::Screen::GetScreen()-> GetPrimaryDisplay().device_scale_factor(); + parent_view_ = + static_cast(web_contents)->GetEflNativeView(); SetDragCallbacks(); } @@ -85,32 +84,25 @@ void WebDragDestEfl::DragStateEnter() { } void WebDragDestEfl::DragStateLeave() { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - GetRenderViewHost()->DragTargetDragLeave(); -#endif // !defined(EWK_BRINGUP) if (delegate_) delegate_->OnDragLeave(); } void WebDragDestEfl::DragPos( Evas_Coord x, Evas_Coord y, Elm_Xdnd_Action action) { - gfx::Point screen_pt = gfx::Point(x / device_scale_factor_, - y / device_scale_factor_); + if (!drop_data_) + return; + + auto screen_pt = + gfx::PointF(x / device_scale_factor_, y / device_scale_factor_); last_pointer_pos_ = screen_pt; - gfx::Point client_pt = gfx::Point(screen_pt.x() / page_scale_factor_, - screen_pt.y() / page_scale_factor_); + auto client_pt = gfx::PointF(screen_pt.x() / page_scale_factor_, + screen_pt.y() / page_scale_factor_); if (!drag_initialized_) { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - GetRenderViewHost()->DragTargetDragEnter( - *drop_data_, - client_pt, - screen_pt, - drag_action_, - modifier_flags_); -#endif // !defined(EWK_BRINGUP) + GetRenderWidgetHost()->DragTargetDragEnter( + *drop_data_, client_pt, screen_pt, drag_action_, modifier_flags_, + base::DoNothing()); if (delegate_) delegate_->OnDragEnter(); @@ -118,14 +110,8 @@ void WebDragDestEfl::DragPos( drag_initialized_ = true; } -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - GetRenderViewHost()->DragTargetDragOver( - client_pt, - screen_pt, - drag_action_, - modifier_flags_); -#endif // !defined(EWK_BRINGUP) + GetRenderWidgetHost()->DragTargetDragOver(client_pt, screen_pt, drag_action_, + modifier_flags_, base::DoNothing()); if (!delegate_) return; @@ -133,41 +119,31 @@ void WebDragDestEfl::DragPos( } Eina_Bool WebDragDestEfl::DragDrop(Elm_Selection_Data* data) { - gfx::Point client_pt = - gfx::Point(last_pointer_pos_.x() / page_scale_factor_, - last_pointer_pos_.y() / page_scale_factor_); - -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - GetRenderViewHost()->FilterDropData(drop_data_.get()); - GetRenderViewHost()->DragTargetDrop( - *drop_data_, - client_pt, - last_pointer_pos_, - modifier_flags_); -#endif // !defined(EWK_BRINGUP) + if (!drag_initialized_) + return EINA_FALSE; + + auto client_pt = gfx::PointF(last_pointer_pos_.x() / page_scale_factor_, + last_pointer_pos_.y() / page_scale_factor_); + + GetRenderWidgetHost()->FilterDropData(drop_data_.get()); + GetRenderWidgetHost()->DragTargetDrop(*drop_data_, client_pt, + last_pointer_pos_, modifier_flags_, + base::DoNothing()); if (delegate_) delegate_->OnDrop(); drag_initialized_ = false; -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - // Invoking via message loop to not mess around with target - // from within one of its callbacks. - base::MessageLoop::current()->PostTask( + + base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&WebDragDestEfl::ResetDragCallbacks, base::Unretained(this))); -#endif // !defined(EWK_BRINGUP) return EINA_TRUE; } void WebDragDestEfl::DragLeave() { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - // FIXME: EWK_BRINGUP definition should be removed. - GetRenderViewHost()->DragTargetDragLeave(); -#endif // !defined(EWK_BRINGUP) + GetRenderWidgetHost()->DragTargetDragLeave(gfx::PointF(), gfx::PointF()); if (delegate_) delegate_->OnDragLeave(); @@ -182,8 +158,8 @@ void WebDragDestEfl::SetPageScaleFactor(float scale) { page_scale_factor_ = scale; } -RenderViewHost* WebDragDestEfl::GetRenderViewHost() const { - return web_contents_->GetRenderViewHost(); +RenderWidgetHost* WebDragDestEfl::GetRenderWidgetHost() const { + return web_contents_->GetRenderViewHost()->GetWidget(); } } // namespace content diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.h b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.h index 26efada..05e0714 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.h +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_dest_efl.h @@ -10,13 +10,13 @@ #include "content/public/common/drop_data.h" #include "third_party/blink/public/common/page/drag_operation.h" -#include "ui/gfx/geometry/point.h" +#include "ui/gfx/geometry/point_f.h" namespace content { class WebContents; class WebDragDestDelegate; -class RenderViewHost; +class RenderWidgetHost; class WebDragDestEfl { public: @@ -29,7 +29,7 @@ class WebDragDestEfl { blink::DragOperationsMask GetAction() { return drag_action_; } WebDragDestDelegate* GetDelegate() const { return delegate_; } DropData* GetDropData() { return drop_data_.get(); } - RenderViewHost* GetRenderViewHost() const; + RenderWidgetHost* GetRenderWidgetHost() const; WebContents* GetWebContents() { return web_contents_; } void ResetDropData() { drop_data_.reset(); } @@ -70,7 +70,7 @@ class WebDragDestEfl { float device_scale_factor_; float page_scale_factor_; - gfx::Point last_pointer_pos_; + gfx::PointF last_pointer_pos_; bool drag_initialized_; diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.cc b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.cc index 0e3182c..6bad9c0 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.cc +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.cc @@ -4,9 +4,13 @@ #include "content/browser/web_contents/web_drag_source_efl.h" +#include "base/files/file_path.h" +#include "base/path_service.h" +#include "base/strings/utf_string_conversions.h" #include "content/browser/download/drag_download_util.h" #include "content/browser/renderer_host/render_widget_host_impl.h" #include "content/browser/web_contents/web_contents_impl.h" +#include "content/common/paths_efl.h" #include "content/public/common/drop_data.h" #include "third_party/skia/include/core/SkPixelRef.h" #include "ui/base/dragdrop/drag_drop_types.h" @@ -23,6 +27,10 @@ namespace content { namespace { +const char* const kDefaultDragIcon = "broken_image.png"; +const int kDefaultDragIconWidth = 105; +const int kDefaultDragIconHeight = 120; + DragOperation GetDragOperationFromMask(blink::DragOperationsMask operations) { if (operations & ui::DragDropTypes::DRAG_COPY) return DragOperation::kCopy; @@ -61,12 +69,13 @@ void DragStateCb(void* data, Evas_Object* obj) { WebDragSourceEfl::WebDragSourceEfl(WebContents* web_contents) : web_contents_(static_cast(web_contents)), + source_rwh_(nullptr), drag_failed_(false), drag_started_(false), + drag_action_(blink::kDragOperationNone), page_scale_factor_(1.0f) { -#if !defined(USE_AURA) - parent_view_ = static_cast(web_contents->GetNativeView()); -#endif + parent_view_ = + static_cast(web_contents)->GetEflNativeView(); device_scale_factor_ = display::Screen::GetScreen()->GetPrimaryDisplay().device_scale_factor(); } @@ -77,38 +86,54 @@ bool WebDragSourceEfl::StartDragging(const DropData& drop_data, blink::DragOperationsMask allowed_ops, const gfx::Point& root_location, const SkBitmap& image, - const gfx::Vector2d& image_offset) { + const gfx::Vector2d& image_offset, + RenderWidgetHostImpl* source_rwh) { // Guard against re-starting before previous drag completed. if (drag_started_) { NOTREACHED(); return false; } + std::u16string elm_drag_data; int targets_mask = 0; - drop_data_.reset(new DropData(drop_data)); initial_position_ = root_location; - if (drop_data.text && !drop_data.text->empty()) + if (drop_data.text && !drop_data.text->empty()) { + elm_drag_data = *drop_data.text; targets_mask |= ELM_SEL_FORMAT_TEXT; - if (drop_data.url.is_valid()) + } + if (drop_data.url.is_valid()) { + elm_drag_data = base::UTF8ToUTF16(drop_data.url.spec()); targets_mask |= ELM_SEL_FORMAT_TEXT; - if (drop_data.html && !drop_data.html->empty()) + } + if (drop_data.html && !drop_data.html->empty()) { + elm_drag_data = *drop_data.html; targets_mask |= ELM_SEL_FORMAT_HTML; + } if (!drop_data.file_contents.empty()) { + GURL parsed_url; #if defined(ENABLE_WRT_JS) && !defined(WRT_JS_BRINGUP) - GURL parsed_url = wrt::ParseURL(drop_data.file_contents_source_url); + parsed_url = wrt::ParseURL(drop_data.file_contents_source_url); if ((parsed_url.is_valid() && !parsed_url.IsAboutBlank())) drop_data_.file_contents_source_url = parsed_url; #endif + elm_drag_data = + (parsed_url.is_valid() && !parsed_url.IsAboutBlank()) + ? base::UTF8ToUTF16(parsed_url.spec()) + : base::UTF8ToUTF16(drop_data.file_contents_source_url.spec()); targets_mask |= ELM_SEL_FORMAT_IMAGE; } if (!drop_data.download_metadata.empty() && ParseDownloadMetadata(drop_data.download_metadata, &wide_download_mime_type_, &download_file_name_, - &download_url_)) + &download_url_)) { + elm_drag_data = drop_data.download_metadata; targets_mask |= ELM_SEL_FORMAT_IMAGE; - if (!drop_data.custom_data.empty()) + } + if (!drop_data.custom_data.empty()) { + elm_drag_data = drop_data.custom_data.begin()->first; targets_mask |= ELM_SEL_FORMAT_NONE; + } int action = 0; @@ -125,10 +150,11 @@ bool WebDragSourceEfl::StartDragging(const DropData& drop_data, image_offset_ = image_offset; drag_action_ = allowed_ops; drag_failed_ = false; + source_rwh_ = source_rwh; drag_started_ = elm_drag_start( parent_view_, static_cast(targets_mask), - reinterpret_cast(drop_data_.get()), + base::UTF16ToUTF8(elm_drag_data).c_str(), static_cast(action), DragIconCreateCb, this, DragPosCb, this, DragAcceptCb, this, DragStateCb, this); @@ -137,7 +163,6 @@ bool WebDragSourceEfl::StartDragging(const DropData& drop_data, if (!drag_started_) { LOG(WARNING) << "Failed to start drag and drop"; drag_failed_ = true; - drop_data_.reset(); return false; } @@ -155,13 +180,22 @@ Evas_Object* WebDragSourceEfl::DragIconCreate(Evas_Object* win, *yoff = initial_position_.y(); Evas* evas = evas_object_evas_get(win); Evas_Object* icon = evas_object_image_add(evas); - evas_object_image_size_set(icon, w, h); + if (w > 0 && h > 0) { + evas_object_image_size_set(icon, w, h); + evas_object_image_data_copy_set(icon, image_.pixelRef()->pixels()); + } else { + w = kDefaultDragIconWidth; + h = kDefaultDragIconHeight; + base::FilePath path; + base::PathService::Get(PathsEfl::IMAGE_RESOURCE_DIR, &path); + path = path.Append(FILE_PATH_LITERAL(kDefaultDragIcon)); + evas_object_image_file_set(icon, path.AsUTF8Unsafe().c_str(), nullptr); + } + evas_object_image_fill_set(icon, 0, 0, w, h); evas_object_image_alpha_set(icon, EINA_TRUE); - evas_object_image_data_copy_set(icon, image_.pixelRef()->pixels()); evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_move(icon, initial_position_.x(), initial_position_.y()); - evas_object_image_fill_set(icon, 0, 0, w, h); evas_object_resize(icon, w, h); evas_object_show(icon); diff --git a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.h b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.h index da355cb..99eb872 100644 --- a/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.h +++ b/tizen_src/chromium_impl/content/browser/web_contents/web_drag_source_efl.h @@ -39,7 +39,8 @@ class WebDragSourceEfl { blink::DragOperationsMask allowed_ops, const gfx::Point& root_location, const SkBitmap& image, - const gfx::Vector2d& image_offset); + const gfx::Vector2d& image_offset, + RenderWidgetHostImpl* source_rwh); void Reset() { drag_started_ = false; } void SetLastPoint(gfx::Point point) { last_point_ = point; } @@ -62,10 +63,6 @@ class WebDragSourceEfl { // Browser side IPC handler. RenderWidgetHostImpl* source_rwh_; - // The drop data for the current drag (for drags that originate in the render - // view). Non-NULL iff there is a current drag. - std::unique_ptr drop_data_; - // The image used for depicting the drag, and the offset between the cursor // and the top left pixel. SkBitmap image_; diff --git a/tizen_src/chromium_impl/content/common/BUILD.gn b/tizen_src/chromium_impl/content/common/BUILD.gn index d1ffc54..85a125f 100644 --- a/tizen_src/chromium_impl/content/common/BUILD.gn +++ b/tizen_src/chromium_impl/content/common/BUILD.gn @@ -24,6 +24,7 @@ config("content_common_efl") { outdir = rebase_path("$root_out_dir") defines += [ "EDJE_DIR=\"$outdir/resources\"", + "IMAGE_DIR=\"$image_dir\"", "LOCALE_DIR=\"$outdir/locale\"", ] } diff --git a/tizen_src/chromium_impl/content/common/paths_efl.cc b/tizen_src/chromium_impl/content/common/paths_efl.cc index 174e2b1..7f1f716 100644 --- a/tizen_src/chromium_impl/content/common/paths_efl.cc +++ b/tizen_src/chromium_impl/content/common/paths_efl.cc @@ -32,6 +32,9 @@ const base::FilePath::CharType kApplicationCacheDir[] = FILE_PATH_LITERAL("cache const base::FilePath::CharType kChromiumLibPath[] = FILE_PATH_LITERAL("lib/" CHROMIUM_IMPL_LIB_FILE); const base::FilePath::CharType kNotificationIconDir[] = FILE_PATH_LITERAL("noti"); +const base::FilePath::CharType kImageDir[] = FILE_PATH_LITERAL("images"); +#else +const base::FilePath::CharType kImagePath[] = FILE_PATH_LITERAL(IMAGE_DIR); #endif #if !defined(EWK_BRINGUP) // FIXME: m67 bringup @@ -211,6 +214,16 @@ bool PathProvider(int key, base::FilePath* result) { cur = cur.Append(kNotificationIconDir); break; #endif + case IMAGE_RESOURCE_DIR: +#if BUILDFLAG(IS_TIZEN) + if (!base::PathService::Get(DIR_USER_DATA, &cur)) + return false; + cur = cur.Append(kImageDir); + break; +#else + *result = base::FilePath(kImagePath); + return true; +#endif default: return false; } diff --git a/tizen_src/ewk/efl_integration/BUILD.gn b/tizen_src/ewk/efl_integration/BUILD.gn index 3254f23..3e32f33 100755 --- a/tizen_src/ewk/efl_integration/BUILD.gn +++ b/tizen_src/ewk/efl_integration/BUILD.gn @@ -643,6 +643,7 @@ shared_library("chromium-ewk") { ] } deps += [ "resource:edje_resources_ewk" ] + deps += [ ":broken_image" ] } executable("efl_webprocess") { @@ -658,3 +659,8 @@ copy("launch_exec_script") { sources = [ "launch_exec.sh" ] outputs = [ "$root_out_dir/{{source_file_part}}" ] } + +copy("broken_image") { + sources = [ "./resource/images/broken_image.png" ] + outputs = [ "$root_out_dir/images/{{source_file_part}}" ] +} \ No newline at end of file diff --git a/tizen_src/ewk/efl_integration/command_line_efl.cc b/tizen_src/ewk/efl_integration/command_line_efl.cc index eddd778..de01912 100644 --- a/tizen_src/ewk/efl_integration/command_line_efl.cc +++ b/tizen_src/ewk/efl_integration/command_line_efl.cc @@ -103,6 +103,9 @@ content::MainFunctionParams CommandLineEfl::GetDefaultPortParams() { #endif } + if (IsMobileProfile()) + p_command_line->AppendSwitch(switches::kEnableTouchDragDrop); + #if !defined(EWK_BRINGUP) if (p_command_line->HasSwitch(switches::kDisableIpcSandbox)) p_command_line->AppendSwitch(switches::kDisableRendererZygote); diff --git a/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc b/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc index 2e33c0b..21aea88 100644 --- a/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc +++ b/tizen_src/ewk/efl_integration/context_menu_controller_efl.cc @@ -14,6 +14,7 @@ #include "common/web_contents_utils.h" #include "content/browser/renderer_host/render_widget_host_view_aura.h" #include "content/browser/selection/selection_controller_efl.h" +#include "content/browser/web_contents/web_contents_impl.h" #include "content/common/paths_efl.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/download_manager.h" @@ -62,14 +63,13 @@ std::vector ContextMenuControllerEfl::_context_menu_listdata ContextMenuControllerEfl::ContextMenuControllerEfl(EWebView* wv, WebContents& web_contents) : webview_(wv), -#if !defined(USE_AURA) - native_view_(static_cast(web_contents.GetNativeView())), -#endif popup_(nullptr), menu_items_(nullptr), web_contents_(web_contents), is_text_selection_(false), weak_ptr_factory_(this) { + native_view_ = + static_cast(&web_contents_)->GetEflNativeView(); } ContextMenuControllerEfl::~ContextMenuControllerEfl() { @@ -241,10 +241,12 @@ void ContextMenuControllerEfl::GetProposedContextMenu() { } #endif } -#if !defined(EWK_BRINGUP) - if (params_.is_draggable) { - AddItemToProposedList(EWK_CONTEXT_MENU_ITEM_TYPE_ACTION, EWK_CONTEXT_MENU_ITEM_TAG_DRAG, - std::string(dgettext("WebKit", "IDS_WEBVIEW_OPT_DRAG_AND_DROP"))); +#if BUILDFLAG(IS_TIZEN) + if (IsMobileProfile() && params_.is_draggable && + params_.media_type == ContextMenuDataMediaType::kImage) { + AddItemToProposedList( + EWK_CONTEXT_MENU_ITEM_TYPE_ACTION, EWK_CONTEXT_MENU_ITEM_TAG_DRAG, + std::string(dgettext("WebKit", "IDS_WEBVIEW_OPT_DRAG_AND_DROP_ABB"))); } #endif @@ -958,12 +960,13 @@ void ContextMenuControllerEfl::MenuItemSelected(ContextMenuItemEfl* menu_item) break; } case EWK_CONTEXT_MENU_ITEM_TAG_DRAG: { -#if !defined(EWK_BRINGUP) // FIXME: m67 bringup - RenderViewHost* rvh = web_contents_.GetRenderViewHost(); - rvh->StartDragging(); - context_menu_show_pos_.SetPoint(params_.x, params_.y); -#else - NOTIMPLEMENTED(); +#if BUILDFLAG(IS_TIZEN) + if (IsMobileProfile()) { + webview_->EnterDragState(); + context_menu_show_pos_.SetPoint(params_.x, params_.y); + } else { + NOTIMPLEMENTED(); + } #endif break; } diff --git a/tizen_src/ewk/efl_integration/eweb_view.cc b/tizen_src/ewk/efl_integration/eweb_view.cc index 76e4b48..a9a6708 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.cc +++ b/tizen_src/ewk/efl_integration/eweb_view.cc @@ -731,6 +731,15 @@ void EWebView::ExecuteEditCommand(const char* command, const char* value) { } } +#if BUILDFLAG(IS_TIZEN) +void EWebView::EnterDragState() { + if (IsMobileProfile()) { + if (RenderViewHost* render_view_host = web_contents_->GetRenderViewHost()) + web_contents_->EnterDragState(render_view_host); + } +} +#endif + void EWebView::SetOrientation(int orientation) { if (GetOrientation() == orientation) return; diff --git a/tizen_src/ewk/efl_integration/eweb_view.h b/tizen_src/ewk/efl_integration/eweb_view.h index 571af8c..601562e 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.h +++ b/tizen_src/ewk/efl_integration/eweb_view.h @@ -326,6 +326,9 @@ class EWebView { double GetPageZoomFactor() const; void SetPageZoomFactor(double page_zoom_factor); void ExecuteEditCommand(const char* command, const char* value); +#if BUILDFLAG(IS_TIZEN) + void EnterDragState(); +#endif void SetOrientation(int orientation); int GetOrientation(); bool TouchEventsEnabled() const; diff --git a/tizen_src/ewk/efl_integration/resource/images/broken_image.png b/tizen_src/ewk/efl_integration/resource/images/broken_image.png new file mode 100644 index 0000000000000000000000000000000000000000..45edebcd5150d522620aefa9e3fbb0f9b6755450 GIT binary patch literal 810 zcmV+_1J(SAP){PkE;hYNfp@?Q)ugb<^guz~uln#LatF2$yvi~ezGr+Y4GZgNslFhVa~|pZ0S?7N z5Lnl+E6B1{5%N^$C|?G_3%^RXkTKc1D!M_Kn$`LKwZcMxJ?wiwokqDJFw#3LCw5EO zN#&N=Ld*U?5{ea}S$?1RpDh(qOU-{W65{#{G$V$fuNrlMdMH9&RpxpuKqkD%m?=!g zBlwW$XPHG%sm9)#qu5_}3YETESDELrFg<+J+6ac`u0YGhTplEeiG>J0CZ6KZmJ8Uk z@rY9<4~_kM=*C#Q5B)#eC7GLeaPBgOqa6UqRR&@qaYEvRPV1XkHzpS!Vl7PO(-J`( ztZQ}k*$Ek1squyTEL#WS-C_ivmIhd17fZlGIKj8nD~!Z%txINYUPo_Y$@t}*7q_8F z7(ejh_f-J2UKwLh8ZYOs Date: Mon, 20 Feb 2023 15:27:19 +0800 Subject: [PATCH 12/16] [M108 Migration][API] Provide ewk_context_tizen_app_version_set api This patch is for the requirement: Provide ewk setting api for widget version which be used for html5 video. 1.Provide ewk_context_tizen_app_version_set api for HBBTV, to set the value of widget version. 2.This api must be used after ewk_context_tizen_app_id_set or ewk_send_widget_info beacuse need drop the process privillages and set dynamic plugin. Reference: - https://review.tizen.org/gerrit/283610/ Change-Id: I67f644d3455af3d1ac939bbe316d64ee347a9911 Signed-off-by: Jie Zhang --- .../ewk/efl_integration/common/content_switches_efl.cc | 1 + .../ewk/efl_integration/common/content_switches_efl.h | 1 + .../ewk/efl_integration/content_browser_client_efl.cc | 2 ++ tizen_src/ewk/efl_integration/eweb_context.cc | 18 ++++++++++++++++++ tizen_src/ewk/efl_integration/eweb_context.h | 3 +++ .../ewk/efl_integration/private/ewk_context_private.cc | 4 ++++ .../ewk/efl_integration/private/ewk_context_private.h | 2 +- tizen_src/ewk/efl_integration/public/ewk_context.cc | 7 +++++-- 8 files changed, 35 insertions(+), 3 deletions(-) diff --git a/tizen_src/ewk/efl_integration/common/content_switches_efl.cc b/tizen_src/ewk/efl_integration/common/content_switches_efl.cc index 1e8d1f9..d7f83f9 100644 --- a/tizen_src/ewk/efl_integration/common/content_switches_efl.cc +++ b/tizen_src/ewk/efl_integration/common/content_switches_efl.cc @@ -20,6 +20,7 @@ const char kApplicationType[] = "application-type"; // Widget Info const char kTizenAppId[] = "widget-id"; +const char kTizenAppVersion[] = "app-version"; const char kWidgetScale[] = "widget-scale"; const char kWidgetTheme[] = "widget-theme"; const char kWidgetEncodedBundle[] = "widget-encoded-bundle"; diff --git a/tizen_src/ewk/efl_integration/common/content_switches_efl.h b/tizen_src/ewk/efl_integration/common/content_switches_efl.h index abefe6d..ff0b1a2 100644 --- a/tizen_src/ewk/efl_integration/common/content_switches_efl.h +++ b/tizen_src/ewk/efl_integration/common/content_switches_efl.h @@ -23,6 +23,7 @@ CONTENT_EXPORT extern const char kInjectedBundlePath[]; CONTENT_EXPORT extern const char kApplicationType[]; #endif CONTENT_EXPORT extern const char kTizenAppId[]; +CONTENT_EXPORT extern const char kTizenAppVersion[]; CONTENT_EXPORT extern const char kWidgetScale[]; CONTENT_EXPORT extern const char kWidgetTheme[]; CONTENT_EXPORT extern const char kWidgetEncodedBundle[]; diff --git a/tizen_src/ewk/efl_integration/content_browser_client_efl.cc b/tizen_src/ewk/efl_integration/content_browser_client_efl.cc index cc199f7..5107d5a 100644 --- a/tizen_src/ewk/efl_integration/content_browser_client_efl.cc +++ b/tizen_src/ewk/efl_integration/content_browser_client_efl.cc @@ -132,6 +132,8 @@ void AppendExtraCommandLineSwitchesInternal(base::CommandLine* command_line, const std::string& tizen_app_id = context->GetTizenAppId(); command_line->AppendSwitchASCII(switches::kTizenAppId, tizen_app_id); + command_line->AppendSwitchASCII(switches::kTizenAppVersion, + context->GetTizenAppVersion()); double scale = context->GetWidgetScale(); command_line->AppendSwitchASCII(switches::kWidgetScale, diff --git a/tizen_src/ewk/efl_integration/eweb_context.cc b/tizen_src/ewk/efl_integration/eweb_context.cc index b2c3b7d..f344603 100644 --- a/tizen_src/ewk/efl_integration/eweb_context.cc +++ b/tizen_src/ewk/efl_integration/eweb_context.cc @@ -277,6 +277,24 @@ void EWebContext::SetWidgetInfo(const std::string& tizen_app_id, #endif // IS_TIZEN } +bool EWebContext::SetAppVersion(const std::string& tizen_app_version) { + if (tizen_app_id_.empty()) { + LOG(ERROR) << "Please set tizen_app_id first."; + return false; + } + + tizen_app_version_ = tizen_app_version; + +#if BUILDFLAG(IS_TIZEN) + base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); + command_line.AppendSwitchASCII(switches::kTizenAppVersion, tizen_app_version); + return true; +#else + LOG(WARNING) << "OS_TIZEN is not enabled."; + return false; +#endif // IS_TIZEN +} + void EWebContext::SendWrtMessage(const Ewk_Wrt_Message_Data& data) { WrtWidgetHost::Get()->SendWrtMessage(data); } diff --git a/tizen_src/ewk/efl_integration/eweb_context.h b/tizen_src/ewk/efl_integration/eweb_context.h index bb51d19..651941c 100644 --- a/tizen_src/ewk/efl_integration/eweb_context.h +++ b/tizen_src/ewk/efl_integration/eweb_context.h @@ -147,6 +147,7 @@ class EWebContext { Evas_Object *AddFaviconObject(const char *uri, Evas *canvas) const; void SetWidgetInfo(const std::string& tizen_app_id, double scale, const std::string &theme, const std::string &encoded_bundle); + bool SetAppVersion(const std::string& tizen_app_version); void SendWrtMessage(const Ewk_Wrt_Message_Data& message); void SetMimeOverrideCallback(Ewk_Context_Override_Mime_For_Url_Callback callback, @@ -182,6 +183,7 @@ class EWebContext { const std::string& GetInjectedBundlePath() const { return injected_bundle_path_; } const std::string& GetTizenAppId() const { return tizen_app_id_; } + const std::string& GetTizenAppVersion() const { return tizen_app_version_; } const std::string& GetWidgetTheme() const { return widget_theme_; } const std::string& GetWidgetEncodedBundle() const { return widget_encoded_bundle_; } double GetWidgetScale() const { return widget_scale_; } @@ -230,6 +232,7 @@ class EWebContext { // widget info std::string tizen_app_id_; + std::string tizen_app_version_; std::string widget_theme_; std::string widget_encoded_bundle_; double widget_scale_; diff --git a/tizen_src/ewk/efl_integration/private/ewk_context_private.cc b/tizen_src/ewk/efl_integration/private/ewk_context_private.cc index be871bd..e10e87a 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_context_private.cc +++ b/tizen_src/ewk/efl_integration/private/ewk_context_private.cc @@ -256,6 +256,10 @@ void Ewk_Context::SetWidgetInfo(const std::string& tizen_app_id, impl->SetWidgetInfo(tizen_app_id, scale, theme, encoded_bundle); } +bool Ewk_Context::SetAppVersion(const std::string& tizen_app_version) { + return impl->SetAppVersion(tizen_app_version); +} + int Ewk_Context::Pixmap() const { return impl->Pixmap(); } diff --git a/tizen_src/ewk/efl_integration/private/ewk_context_private.h b/tizen_src/ewk/efl_integration/private/ewk_context_private.h index fc39ea3..869cde0 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_context_private.h +++ b/tizen_src/ewk/efl_integration/private/ewk_context_private.h @@ -116,7 +116,7 @@ struct Ewk_Context : public base::RefCounted { double scale, const std::string& theme, const std::string& encoded_bundle); - //void SendWrtMessage(const Ewk_IPC_Wrt_Message_Data& message); + bool SetAppVersion(const std::string& tizen_app_version); // Pixmap int Pixmap() const; diff --git a/tizen_src/ewk/efl_integration/public/ewk_context.cc b/tizen_src/ewk/efl_integration/public/ewk_context.cc index 95dd572..a7e298a 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_context.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_context.cc @@ -26,6 +26,7 @@ #include "ewk_context_product.h" #include "base/memory/ref_counted.h" +#include "base/trace_event/ttrace.h" #include "browser/favicon/favicon_database_p.h" #include "browser/vibration/vibration_provider_client.h" #include "browser_context_efl.h" @@ -614,8 +615,10 @@ void ewk_context_tizen_app_id_set(Ewk_Context* context, Eina_Bool ewk_context_tizen_app_version_set(Ewk_Context* context, const char* tizen_app_version) { - LOG_EWK_API_MOCKUP(); - return false; + EINA_SAFETY_ON_NULL_RETURN_VAL(context, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(tizen_app_version, EINA_FALSE); + TTRACE_WEB("tizen_app_version: %s", tizen_app_version); + return context->SetAppVersion(tizen_app_version); } Ewk_Application_Cache_Manager* ewk_context_application_cache_manager_get(const Ewk_Context* ewkContext) -- 2.7.4 From b45c2d62776ec00e16e2333bce7f053988ecf976 Mon Sep 17 00:00:00 2001 From: Koyyani Maheswari Date: Wed, 22 Feb 2023 11:03:52 +0530 Subject: [PATCH 13/16] Remove unutilized code Below features are not used. Respective code is removed. - tizen_multimedia_eme_support - tizen_multimedia_support Reference : https://review.tizen.org/gerrit/279396/ https://review.tizen.org/gerrit/279317/ Change-Id: I989a3873cfe785afcff1f7172419c0646510e95c Signed-off-by: Koyyani Maheswari --- media/BUILD.gn | 7 - tizen_src/build/config/BUILD.gn | 6 - tizen_src/build/config/tizen_features.gni | 8 - tizen_src/build/gn_chromiumefl.sh | 2 - tizen_src/build/jhbuild/jhbuildrc | 3 - .../chromium_impl/content/browser/browser_efl.gni | 20 - .../browser/media/browser_mediapacket_manager.cc | 54 -- .../browser/media/browser_mediapacket_manager.h | 33 - .../browser/media/efl/browser_demuxer_efl.cc | 148 ---- .../browser/media/efl/browser_demuxer_efl.h | 72 -- .../media/efl/browser_media_player_manager_efl.cc | 364 -------- .../media/efl/browser_media_player_manager_efl.h | 120 --- .../media/media_web_contents_observer_efl.cc | 78 -- .../media/media_web_contents_observer_efl.h | 51 -- .../chromium_impl/content/common/common_efl.gni | 26 +- .../media/efl/tizen_video_decode_accelerator.cc | 589 ------------- .../gpu/media/efl/tizen_video_decode_accelerator.h | 48 -- .../media/efl/tizen_video_encode_accelerator.cc | 617 ------------- .../gpu/media/efl/tizen_video_encode_accelerator.h | 54 -- .../common/media/efl/media_player_messages_efl.h | 198 ----- .../media/efl/media_player_messages_enums_efl.h | 14 - .../content/common/message_generator_efl.h | 4 - .../content/common/render_messages_efl.h | 13 - tizen_src/chromium_impl/content/content_efl.gni | 11 - .../content/renderer/media/efl/audio_decoder_efl.h | 22 - .../media/efl/media_source_delegate_efl.cc | 513 ----------- .../renderer/media/efl/media_source_delegate_efl.h | 164 ---- .../renderer/media/efl/renderer_demuxer_efl.cc | 109 --- .../renderer/media/efl/renderer_demuxer_efl.h | 88 -- .../media/efl/renderer_media_player_manager_efl.cc | 239 ------ .../media/efl/renderer_media_player_manager_efl.h | 105 --- .../renderer/media/efl/webmediaplayer_efl.cc | 636 -------------- .../renderer/media/efl/webmediaplayer_efl.h | 264 ------ .../renderer/media/tizen/audio_decoder_capi.cc | 259 ------ .../content/renderer/renderer_efl.gni | 24 - .../media/audio/tizen/audio_manager_tizen.cc | 21 - .../chromium_impl/media/base/efl/demuxer_efl.h | 52 -- .../base/efl/demuxer_stream_player_params_efl.cc | 28 - .../base/efl/demuxer_stream_player_params_efl.h | 51 -- .../media/base/efl/webaudio_decoder_efl.h | 24 - .../media/base/efl/webaudio_media_codec_info_efl.h | 34 - .../media/base/tizen/media_source_player_capi.cc | 951 --------------------- .../media/base/tizen/media_source_player_capi.h | 143 ---- .../base/tizen/webaudio_decoder_browser_capi.cc | 318 ------- .../base/tizen/webaudio_decoder_browser_capi.h | 87 -- tizen_src/chromium_impl/media/media_efl.gni | 72 -- .../browser/render_message_filter_efl.cc | 21 +- .../browser/render_message_filter_efl.h | 12 - tizen_src/ewk/efl_integration/command_line_efl.cc | 4 - 49 files changed, 5 insertions(+), 6776 deletions(-) delete mode 100644 tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.cc delete mode 100644 tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.h delete mode 100644 tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.cc delete mode 100644 tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.h delete mode 100644 tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.cc delete mode 100644 tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.h delete mode 100644 tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.cc delete mode 100644 tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.h delete mode 100644 tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.cc delete mode 100644 tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.h delete mode 100644 tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.cc delete mode 100644 tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.h delete mode 100644 tizen_src/chromium_impl/content/common/media/efl/media_player_messages_efl.h delete mode 100644 tizen_src/chromium_impl/content/common/media/efl/media_player_messages_enums_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/audio_decoder_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.cc delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.cc delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.cc delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.cc delete mode 100644 tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.h delete mode 100644 tizen_src/chromium_impl/content/renderer/media/tizen/audio_decoder_capi.cc delete mode 100644 tizen_src/chromium_impl/media/audio/tizen/audio_manager_tizen.cc delete mode 100644 tizen_src/chromium_impl/media/base/efl/demuxer_efl.h delete mode 100644 tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.cc delete mode 100644 tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.h delete mode 100644 tizen_src/chromium_impl/media/base/efl/webaudio_decoder_efl.h delete mode 100644 tizen_src/chromium_impl/media/base/efl/webaudio_media_codec_info_efl.h delete mode 100644 tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.cc delete mode 100644 tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.h delete mode 100644 tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.cc delete mode 100644 tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.h diff --git a/media/BUILD.gn b/media/BUILD.gn index 548201d..d3a23d9 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -414,13 +414,6 @@ fuzzer_test("media_webm_muxer_fuzzer") { "//base", "//third_party/libwebm", ] - - if (use_efl && tizen_multimedia_support) { - deps += external_media_efl_deps - sources += external_media_efl_sources - sources -= external_exclude_media_efl_sources - configs += external_media_efl_config - } } fuzzer_test("cbcs_decryptor_fuzzer") { diff --git a/tizen_src/build/config/BUILD.gn b/tizen_src/build/config/BUILD.gn index 98e02c8..f8b9515 100644 --- a/tizen_src/build/config/BUILD.gn +++ b/tizen_src/build/config/BUILD.gn @@ -33,12 +33,6 @@ config("tizen_feature_flags") { if (tizen_tbm_support) { defines += [ "TIZEN_TBM_SUPPORT" ] } - if (tizen_multimedia_support) { - defines += [ - "TIZEN_MULTIMEDIA_SUPPORT", - "TIZEN_MULTIMEDIA_USE_CAPI_AUDIO_IO", - ] - } if (tizen_web_speech_recognition) { defines += [ "TIZEN_WEB_SPEECH_RECOGNITION" ] } diff --git a/tizen_src/build/config/tizen_features.gni b/tizen_src/build/config/tizen_features.gni index 47b30e0..8d2dd87 100644 --- a/tizen_src/build/config/tizen_features.gni +++ b/tizen_src/build/config/tizen_features.gni @@ -52,8 +52,6 @@ declare_args() { tizen_pepper_extensions = false # Tizen multimedia related - tizen_multimedia_eme_support = false - tizen_multimedia_support = false tizen_multimedia = false tizen_tbm_support = false tizen_video_hole = false @@ -72,12 +70,6 @@ if (tizen_product_tv) { use_ttrace = true } -if (is_tizen && tizen_multimedia_support) { - tizen_multimedia_eme_support = true -} else { - tizen_multimedia_eme_support = false -} - if (use_atk) { tizen_atk_support = true if (tizen_product_tv) { diff --git a/tizen_src/build/gn_chromiumefl.sh b/tizen_src/build/gn_chromiumefl.sh index 531f7f2..e0fe595 100755 --- a/tizen_src/build/gn_chromiumefl.sh +++ b/tizen_src/build/gn_chromiumefl.sh @@ -172,8 +172,6 @@ add_tizen_flags() { python_ver=\"$(getPythonVersion)\" is_official_build=true enable_nacl=false - enable_basic_printing=true - enable_print_preview=true use_xkbcommon=true target_os="\"tizen\"" target_sysroot=\"/\" diff --git a/tizen_src/build/jhbuild/jhbuildrc b/tizen_src/build/jhbuild/jhbuildrc index 337f39f..296aea9 100644 --- a/tizen_src/build/jhbuild/jhbuildrc +++ b/tizen_src/build/jhbuild/jhbuildrc @@ -44,10 +44,7 @@ if 'NUMBER_OF_PROCESSORS' in os.environ: jobs = os.environ['NUMBER_OF_PROCESSORS'] # Use system libraries while building. -if use_lib64: _libdir = 'lib64' -else: - _libdir = 'lib' partial_build = False diff --git a/tizen_src/chromium_impl/content/browser/browser_efl.gni b/tizen_src/chromium_impl/content/browser/browser_efl.gni index b63a368..d0f3989 100644 --- a/tizen_src/chromium_impl/content/browser/browser_efl.gni +++ b/tizen_src/chromium_impl/content/browser/browser_efl.gni @@ -41,15 +41,6 @@ if (!use_wayland) { ] } -if (tizen_multimedia_support) { - external_content_browser_efl_configs += [ - "//tizen_src/build:capi-media-player", - "//tizen_src/build:libcapi-media-player", - "//tizen_src/build:capi-media-tool", - "//tizen_src/build:libcapi-media-tool", - ] -} - if (tizen_web_speech_recognition) { external_content_browser_efl_configs += [ "//tizen_src/build:stt", @@ -137,17 +128,6 @@ if (is_tizen) { ] } -if (tizen_multimedia_support) { - external_content_browser_efl_sources += [ - "//tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.cc", - "//tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.h", - "//tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.cc", - "//tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.h", - "//tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.cc", - "//tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.h", - ] -} - if (tizen_atk_support) { external_content_browser_efl_configs += [ "//tizen_src/build:atk", diff --git a/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.cc b/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.cc deleted file mode 100644 index 9252741..0000000 --- a/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.cc +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/media/browser_mediapacket_manager.h" - -#include - -#include "content/common/media/efl/media_player_messages_efl.h" -#include "content/public/browser/browser_thread.h" -#include "ipc/ipc_message_macros.h" - -namespace { - -void DoDestroyMediaPacket(media_packet_h packet) { - if (MEDIA_PACKET_ERROR_NONE != media_packet_destroy(packet)) - LOG(WARNING) << "Fail to release media_packet"; -} - -} // namespace - -namespace content { - -scoped_refptr CreateBrowserMediapacketManager() { - return new BrowserMediaPacketManager(); -} - -BrowserMediaPacketManager::BrowserMediaPacketManager() - : BrowserMessageFilter(MediaPlayerMsgStart) {} - -BrowserMediaPacketManager::~BrowserMediaPacketManager() {} - -bool BrowserMediaPacketManager::OnMessageReceived( - const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(BrowserMediaPacketManager, message) - IPC_MESSAGE_HANDLER(MediaPlayerEflHostMsg_ReleaseTbmBuffer, - ReleaseMediaPacket) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -void BrowserMediaPacketManager::ReleaseMediaPacket( - gfx::TbmBufferHandle packet) { - DLOG(INFO) << "ReleaseMediaPacket, media_packet: " << packet.media_packet; - BrowserThread::PostDelayedTask( - BrowserThread::IO, FROM_HERE, - base::BindOnce(&DoDestroyMediaPacket, - static_cast(packet.media_packet)), - base::TimeDelta::FromMilliseconds(40)); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.h b/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.h deleted file mode 100644 index 1c89f013..0000000 --- a/tizen_src/chromium_impl/content/browser/media/browser_mediapacket_manager.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_MEDIA_BROWSER_MEDIAPACKET_MANAGER_H_ -#define CONTENT_BROWSER_MEDIA_BROWSER_MEDIAPACKET_MANAGER_H_ - -#include "content/public/browser/browser_message_filter.h" -#include "ui/gfx/gpu_memory_buffer.h" - -namespace content { - -class CONTENT_EXPORT BrowserMediaPacketManager : public BrowserMessageFilter { - public: - BrowserMediaPacketManager(); - - BrowserMediaPacketManager(const BrowserMediaPacketManager&) = delete; - BrowserMediaPacketManager& operator=(const BrowserMediaPacketManager&) = - delete; - - bool OnMessageReceived(const IPC::Message& message) override; - - protected: - friend class base::RefCountedThreadSafe; - ~BrowserMediaPacketManager() override; - - private: - void ReleaseMediaPacket(gfx::TbmBufferHandle packet); -}; - -} // namespace content - -#endif // CONTENT_BROWSER_MEDIA_BROWSER_MEDIAPACKET_MANAGER_H_ diff --git a/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.cc b/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.cc deleted file mode 100644 index 6f98ce0..0000000 --- a/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.cc +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/media/efl/browser_demuxer_efl.h" - -#include "content/common/media/efl/media_player_messages_efl.h" - -namespace content { - -class BrowserDemuxerEfl::Internal : public media::DemuxerEfl { - public: - Internal(const scoped_refptr& demuxer, - int demuxer_client_id) - : demuxer_(demuxer), - demuxer_client_id_(demuxer_client_id) {} - - ~Internal() override { - DCHECK(ClientIDExists()) << demuxer_client_id_; - demuxer_->RemoveDemuxerClient(demuxer_client_id_); - } - - Internal(const Internal&) = delete; - Internal& operator=(const Internal&) = delete; - - // |media::DemuxerEfl| implementation. - void Initialize(media::DemuxerEflClient* client) override { - DCHECK(!ClientIDExists()) << demuxer_client_id_; - demuxer_->AddDemuxerClient(demuxer_client_id_, client); - } - - void RequestDemuxerData(media::DemuxerStream::Type type) override { - DCHECK(ClientIDExists()) << demuxer_client_id_; - demuxer_->Send(new MediaPlayerEflMsg_ReadFromDemuxer( - demuxer_client_id_, type)); - } - - void RequestDemuxerSeek( - const base::TimeDelta& time_to_seek) override { - DCHECK(ClientIDExists()) << demuxer_client_id_; - demuxer_->Send(new MediaPlayerEflMsg_DemuxerSeekRequest( - demuxer_client_id_, time_to_seek)); - } - - private: - // Helper for DCHECKing that the ID is still registered. - bool ClientIDExists() { - return demuxer_->demuxer_clients_.Lookup(demuxer_client_id_); - } - - scoped_refptr demuxer_; - int demuxer_client_id_; -}; - -scoped_refptr CreateBrowserDemuxerEfl() { - return new BrowserDemuxerEfl(); -} - -BrowserDemuxerEfl::BrowserDemuxerEfl() - : BrowserMessageFilter(MediaPlayerMsgStart) {} - -BrowserDemuxerEfl::~BrowserDemuxerEfl() {} - -void BrowserDemuxerEfl::OverrideThreadForMessage( - const IPC::Message& message, - BrowserThread::ID* thread) { - switch (message.type()) { - case MediaPlayerEflHostMsg_DemuxerReady::ID: - case MediaPlayerEflHostMsg_ReadFromDemuxerAck::ID: - case MediaPlayerEflHostMsg_DurationChanged::ID: - case MediaPlayerEflHostMsg_DemuxerSeekDone::ID: - *thread = BrowserThread::UI; - break; - default: - break; - } -} - -bool BrowserDemuxerEfl::OnMessageReceived(const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(BrowserDemuxerEfl, message) - IPC_MESSAGE_HANDLER(MediaPlayerEflHostMsg_DemuxerReady, - OnDemuxerReady) - IPC_MESSAGE_HANDLER(MediaPlayerEflHostMsg_ReadFromDemuxerAck, - OnReadFromDemuxerAck) - IPC_MESSAGE_HANDLER(MediaPlayerEflHostMsg_DurationChanged, - OnDurationChanged) - IPC_MESSAGE_HANDLER(MediaPlayerEflHostMsg_DemuxerSeekDone, - OnDemuxerSeekDone) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -scoped_ptr BrowserDemuxerEfl::CreateDemuxer( - int demuxer_client_id) { - return scoped_ptr( - new Internal(this, demuxer_client_id)); -} - -void BrowserDemuxerEfl::AddDemuxerClient( - int demuxer_client_id, - media::DemuxerEflClient* client) { - demuxer_clients_.AddWithID(client, demuxer_client_id); -} - -void BrowserDemuxerEfl::RemoveDemuxerClient(int demuxer_client_id) { - demuxer_clients_.Remove(demuxer_client_id); -} - -void BrowserDemuxerEfl::OnDemuxerReady( - int demuxer_client_id, - const media::DemuxerConfigs& configs) { - media::DemuxerEflClient* client = - demuxer_clients_.Lookup(demuxer_client_id); - if (client) - client->OnDemuxerConfigsAvailable(configs); -} - -void BrowserDemuxerEfl::OnReadFromDemuxerAck( - int demuxer_client_id, - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) { - media::DemuxerEflClient* client = - demuxer_clients_.Lookup(demuxer_client_id); - if (client) - client->OnDemuxerDataAvailable(foreign_memory_handle, meta_data); -} - -void BrowserDemuxerEfl::OnDemuxerSeekDone( - int demuxer_client_id, - const base::TimeDelta& actual_browser_seek_time) { - media::DemuxerEflClient* client = - demuxer_clients_.Lookup(demuxer_client_id); - if (client) - client->OnDemuxerSeekDone(actual_browser_seek_time); -} - -void BrowserDemuxerEfl::OnDurationChanged( - int demuxer_client_id, - const base::TimeDelta& duration) { - media::DemuxerEflClient* client = - demuxer_clients_.Lookup(demuxer_client_id); - if (client) - client->OnDemuxerDurationChanged(duration); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.h b/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.h deleted file mode 100644 index 58bb56b..0000000 --- a/tizen_src/chromium_impl/content/browser/media/efl/browser_demuxer_efl.h +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_MEDIA_EFL_BROWSER_DEMUXER_EFL_H_ -#define CONTENT_BROWSER_MEDIA_EFL_BROWSER_DEMUXER_EFL_H_ - -#include "base/id_map.h" -#include "base/memory/shared_memory.h" -#include "content/public/browser/browser_message_filter.h" -#include "media/base/efl/demuxer_efl.h" - -namespace content { - -// Represents the browser process half of an IPC-based demuxer proxy. -// It vends out media::DemuxerEfl instances that are registered with an -// end point in the renderer process. -// -// Refer to RendererDemuxerEfl for the renderer process half. -class CONTENT_EXPORT BrowserDemuxerEfl : public BrowserMessageFilter { - public: - BrowserDemuxerEfl(); - - BrowserDemuxerEfl(const BrowserDemuxerEfl&) = delete; - BrowserDemuxerEfl& operator=(const BrowserDemuxerEfl&) = delete; - - // BrowserMessageFilter overrides. - void OverrideThreadForMessage( - const IPC::Message& message, - BrowserThread::ID* thread) override; - bool OnMessageReceived(const IPC::Message& message) override; - - // Returns an uninitialized demuxer implementation associated with - // |demuxer_client_id|, which can be used to communicate with the real demuxer - // in the renderer process. - scoped_ptr CreateDemuxer(int demuxer_client_id); - - protected: - friend class base::RefCountedThreadSafe; - ~BrowserDemuxerEfl() override; - - private: - class Internal; - - // Called by internal demuxer implementations to add/remove a client - // association. - void AddDemuxerClient( - int demuxer_client_id, - media::DemuxerEflClient* client); - void RemoveDemuxerClient(int demuxer_client_id); - - // IPC message handlers. - void OnDemuxerReady( - int demuxer_client_id, - const media::DemuxerConfigs& configs); - void OnReadFromDemuxerAck( - int demuxer_client_id, - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data); - void OnDemuxerSeekDone( - int demuxer_client_id, - const base::TimeDelta& actual_browser_seek_time); - void OnDurationChanged( - int demuxer_client_id, - const base::TimeDelta& duration); - - IDMap demuxer_clients_; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_MEDIA_EFL_BROWSER_DEMUXER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.cc b/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.cc deleted file mode 100644 index a0725f9..0000000 --- a/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.cc +++ /dev/null @@ -1,364 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/media/efl/browser_media_player_manager_efl.h" - -#include "base/memory/shared_memory.h" -#include "content/browser/media/efl/browser_demuxer_efl.h" -#include "content/browser/renderer_host/render_process_host_impl.h" -#include "content/common/media/efl/media_player_messages_efl.h" -#include "content/public/browser/web_contents.h" -#include "content/public/common/content_client.h" -#include "ipc/ipc_channel_proxy.h" -#include "ipc/ipc_logging.h" -#include "media/base/efl/media_player_efl.h" -#include "tizen/system_info.h" - -#if defined(TIZEN_TBM_SUPPORT) -#include -#endif - -namespace content { - -static unsigned int GetMaximumPlayerCount() { - // Note : In case of Mobile , maximum decoder instance count is depending on - // contents resolution but to get the resolution of content, player should be - // prepared. Hence maximum instance count is set as 1. - // Resolution <= 720P : 2 - // Resolution > 720P : 1 - // Incase of TV : audio & video using H/W decoder , so only support 1. - if (IsTvProfile()) - return 1; - else if (IsMobileProfile() || IsWearableProfile()) - return 1; - else - return 5; -} - -// GetContentClient() is defined in content_client.cc, but in content_client.h -// it is hidden by CONTENT_IMPLEMENTATION ifdef. We don't want to define -// CONTENT_IMPLEMENTATION because it may bring a lot of things we don't need. -ContentClient* GetContentClient(); - -BrowserMediaPlayerManagerEfl* BrowserMediaPlayerManagerEfl::Create( - RenderFrameHost* rfh) { - return new BrowserMediaPlayerManagerEfl(rfh); -} - -BrowserMediaPlayerManagerEfl::BrowserMediaPlayerManagerEfl( - RenderFrameHost* render_frame_host) - : current_player_(-1), - render_frame_host_(render_frame_host), - web_contents_(WebContents::FromRenderFrameHost(render_frame_host)) { -} - -BrowserMediaPlayerManagerEfl::~BrowserMediaPlayerManagerEfl() { - // Players can be destroyed during destruction of BMPM without clear(), - // but not to make destruction order dependencies with other member variables - // we explicitly destroy player instances here. - players_.clear(); -} - -media::MediaPlayerEfl* BrowserMediaPlayerManagerEfl::GetPlayer( - int player_id) { - for (auto player : players_) { - if (player->GetPlayerId() == player_id) - return player; - } - return NULL; -} - -void BrowserMediaPlayerManagerEfl::OnInitComplete( - int player_id, bool success) { - if (success) - OnResumeComplete(player_id); - - if(init_queue_.empty() || player_id != init_queue_.front()) - return; - - init_queue_.pop_front(); - if (!init_queue_.empty()) - InitNextPlayer(); -} - -void BrowserMediaPlayerManagerEfl::OnResumeComplete(int player_id) { - for(auto it = resumed_queue_.begin(); it != resumed_queue_.end(); ++it) { - if (*it == player_id) { - return; - } - } - - if (resumed_queue_.size() < GetMaximumPlayerCount()) - resumed_queue_.push_back(player_id); -} - -void BrowserMediaPlayerManagerEfl::OnSuspendComplete(int player_id) { - CleanUpResumedQueue(); - RemovePlayerFromResumedQueue(player_id); -} - -void BrowserMediaPlayerManagerEfl::CleanUpResumedQueue() { - // Clean up invalid player id. - int size = resumed_queue_.size(); - for (int index = 0 ; index < size ; index++) { - int id = resumed_queue_.front(); - media::MediaPlayerEfl* player = GetPlayer(id); - resumed_queue_.pop_front(); - if (player) - resumed_queue_.push_back(id); - } -} - -void BrowserMediaPlayerManagerEfl::InitNextPlayer() { - if (!init_queue_.empty()) { - SuspendPlayers(); - int player_id = init_queue_.front(); - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) - player->Initialize(); - } -} - -void BrowserMediaPlayerManagerEfl::OnNewFrameAvailable( - int player_id, - base::SharedMemoryHandle foreign_memory_handle, - uint32_t length, base::TimeDelta timestamp) { - Send(new MediaPlayerEflMsg_NewFrameAvailable( - GetRoutingID(), player_id, foreign_memory_handle, length, timestamp)); -} - -#if defined(TIZEN_TBM_SUPPORT) -void BrowserMediaPlayerManagerEfl::OnNewTbmBufferAvailable( - int player_id, gfx::TbmBufferHandle tbm_handle, - base::TimeDelta timestamp) { - DLOG(INFO) << "New media_packet:" << tbm_handle.media_packet; - Send(new MediaPlayerEflMsg_NewTbmBufferAvailable( - GetRoutingID(), player_id, tbm_handle, timestamp)); -} -#endif - -void BrowserMediaPlayerManagerEfl::OnTimeChanged(int player_id) { - Send(new MediaPlayerEflMsg_TimeChanged(GetRoutingID(), player_id)); -} - -void BrowserMediaPlayerManagerEfl::OnSeekStateChange( - int player_id, bool state) { - Send(new MediaPlayerEflMsg_OnSeekStateChange( - GetRoutingID(), player_id, state)); -} - -void BrowserMediaPlayerManagerEfl::OnPauseStateChange( - int player_id, bool state) { - Send(new MediaPlayerEflMsg_PauseStateChanged( - GetRoutingID(), player_id, state)); -} - -void BrowserMediaPlayerManagerEfl::OnRequestSeek( - int player_id, double seek_time) { - // To handle internal seek. - Send(new MediaPlayerEflMsg_SeekRequest( - GetRoutingID(), player_id, seek_time)); -} - -void BrowserMediaPlayerManagerEfl::OnTimeUpdate( - int player_id, double current_time) { - Send(new MediaPlayerEflMsg_TimeUpdate( - GetRoutingID(), player_id, current_time)); -} - -void BrowserMediaPlayerManagerEfl::OnBufferUpdate( - int player_id, - std::vector buffer_range) { - Send(new MediaPlayerEflMsg_BufferUpdate( - GetRoutingID(), player_id, buffer_range)); -} - -void BrowserMediaPlayerManagerEfl::OnDurationChange( - int player_id, - double duration) { - Send(new MediaPlayerEflMsg_DurationChanged( - GetRoutingID(), player_id, duration)); -} - -void BrowserMediaPlayerManagerEfl::OnReadyStateChange( - int player_id, - blink::WebMediaPlayer::ReadyState state) { - Send(new MediaPlayerEflMsg_ReadyStateChange( - GetRoutingID(), player_id, state)); -} - -void BrowserMediaPlayerManagerEfl::OnNetworkStateChange( - int player_id, - blink::WebMediaPlayer::NetworkState state) { - Send(new MediaPlayerEflMsg_NetworkStateChange( - GetRoutingID(), player_id, state)); -} - -void BrowserMediaPlayerManagerEfl::OnMediaDataChange(int player_id, int width, - int height, int media) { - Send(new MediaPlayerEflMsg_MediaDataChanged(GetRoutingID(), player_id, - width, height, media)); -} - -int BrowserMediaPlayerManagerEfl::GetRoutingID() { - if (!render_frame_host_) - return 0; - return render_frame_host_->GetRoutingID(); -} - -bool BrowserMediaPlayerManagerEfl::Send(IPC::Message* msg) { - if (!render_frame_host_) - return false; - return render_frame_host_->Send(msg); -} - -void BrowserMediaPlayerManagerEfl::OnInitialize( - int player_id, - MediaPlayerHostMsg_Initialize_Type type, - const GURL& url, - double volume, - int demuxer_client_id) { - RemovePlayer(player_id); - - if (type == MEDIA_PLAYER_TYPE_URL) { - std::string user_agent = web_contents()->GetUserAgentOverride(); - if (user_agent.empty()) - user_agent = content::GetContentClient()->GetUserAgent(); - - AddPlayer(media::MediaPlayerEfl::CreatePlayer( - player_id, url, volume, this, user_agent)); - } else if (type == MEDIA_PLAYER_TYPE_MEDIA_SOURCE) { - RenderProcessHostImpl* host = static_cast( - web_contents()->GetRenderProcessHost()); - BrowserDemuxerEfl* browser_demuxer_efl = - static_cast(host->browser_demuxer_efl().get()); - AddPlayer(media::MediaPlayerEfl::CreatePlayer( - player_id, - browser_demuxer_efl, demuxer_client_id, - this)); - } else { - LOG(ERROR) << __FUNCTION__ << " Load type is wrong!"; - OnNetworkStateChange( - player_id, blink::WebMediaPlayer::NetworkStateEmpty); - return; - } - - init_queue_.push_back(player_id); - - // Start initialize with first player. Others will be queued. - if (init_queue_.size() == 1) - InitNextPlayer(); -} - -void BrowserMediaPlayerManagerEfl::OnDestroy(int player_id) { - RemovePlayer(player_id); -} - -void BrowserMediaPlayerManagerEfl::SuspendPlayers() { - while (resumed_queue_.size() >= GetMaximumPlayerCount()) { - media::MediaPlayerEfl* player = GetPlayer(resumed_queue_.front()); - if (player) - player->Suspend(); - } -} - -void BrowserMediaPlayerManagerEfl::PausePlayers(int player_id) { - for (auto it = players_.begin(); it != players_.end(); ++it) { - media::MediaPlayerEfl* player = *it; - if (player->GetPlayerId() != player_id) { - player->Pause(false); - OnPauseStateChange(player->GetPlayerId() , true); - } - } -} - -void BrowserMediaPlayerManagerEfl::OnPlay(int player_id) { - PausePlayers(player_id); - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) { - if (current_player_ != player_id && player->IsPlayerSuspended()) - SuspendPlayers(); - - current_player_ = player_id; - player->Play(); - } -} - -void BrowserMediaPlayerManagerEfl::OnPause(int player_id) { - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) - player->Pause(false); -} - -void BrowserMediaPlayerManagerEfl::OnSetVolume( - int player_id, - double volume) { - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) - player->SetVolume(volume); -} - -void BrowserMediaPlayerManagerEfl::OnSetRate(int player_id, double rate) { - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) - player->SetRate(rate); -} - -void BrowserMediaPlayerManagerEfl::OnSeek(int player_id, double time) { - media::MediaPlayerEfl* player = GetPlayer(player_id); - if (player) { - if (current_player_ != player_id && player->IsPlayerSuspended()) - SuspendPlayers(); - current_player_ = player_id; - player->Seek(time); - } -} - -void BrowserMediaPlayerManagerEfl::AddPlayer( - media::MediaPlayerEfl* player) { - DCHECK(!GetPlayer(player->GetPlayerId())); - players_.push_back(player); -} - -void BrowserMediaPlayerManagerEfl::RemovePlayer(int player_id) { - for (auto it = players_.begin(); it != players_.end(); ++it) { - media::MediaPlayerEfl* player = *it; - if (player->GetPlayerId() == player_id) { - players_.erase(it); - - if (!init_queue_.empty()) { - if(player_id == init_queue_.front()) { - LOG(ERROR) << "The released Player is under initializing progress"; - init_queue_.pop_front(); - if (!init_queue_.empty()) - InitNextPlayer(); - } else - RemovePlayerFromInitializeQueue(player_id); - } - break; - } - } -} - -void BrowserMediaPlayerManagerEfl::RemovePlayerFromInitializeQueue( - int player_id) { - for(auto it = init_queue_.begin(); it != init_queue_.end(); ++it) { - if (*it == player_id) { - init_queue_.erase(it); - return; - } - } -} - -void BrowserMediaPlayerManagerEfl::RemovePlayerFromResumedQueue( - int player_id) { - for(auto it = resumed_queue_.begin(); it != resumed_queue_.end(); ++it) { - if (*it == player_id) { - resumed_queue_.erase(it); - return; - } - } -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.h b/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.h deleted file mode 100644 index c6d1851..0000000 --- a/tizen_src/chromium_impl/content/browser/media/efl/browser_media_player_manager_efl.h +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_MEDIA_EFL_BROWSER_MEDIA_PLAYER_MANAGER_EFL_H_ -#define CONTENT_BROWSER_MEDIA_EFL_BROWSER_MEDIA_PLAYER_MANAGER_EFL_H_ - -#include "base/memory/scoped_vector.h" -#include "content/common/media/efl/media_player_messages_enums_efl.h" -#include "content/public/browser/browser_message_filter.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/web_contents_observer.h" -#include "media/base/efl/media_player_manager_efl.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" - -namespace content { - -// This class manages all the MediaPlayerEfl objects. It receives -// control operations from the the render process, and forwards -// them to corresponding MediaPlayerEfl object. Callbacks from -// MediaPlayerEfl objects are converted to IPCs and then sent to the -// render process. -class CONTENT_EXPORT BrowserMediaPlayerManagerEfl - : public media::MediaPlayerManager { - public: - // Returns a new instance using the registered factory if available. - static BrowserMediaPlayerManagerEfl* Create(RenderFrameHost* rfh); - ~BrowserMediaPlayerManagerEfl() override; - - BrowserMediaPlayerManagerEf(const BrowserMediaPlayerManagerEf&) = delete; - BrowserMediaPlayerManagerEf& operator=(const BrowserMediaPlayerManagerEf&) = - delete; - - // media::MediaPlayerManager implementation. - media::MediaPlayerEfl* GetPlayer(int player_id) override; - void OnTimeChanged(int player_id) override; - void OnTimeUpdate(int player_id, double current_time) override; - void OnPauseStateChange(int player_id, bool state) override; - void OnSeekStateChange(int player_id, bool state) override; - void OnRequestSeek(int player_id, double seek_time) override; - void OnBufferUpdate( - int player_id, - std::vector buffer_range) override; - void OnDurationChange(int player_id, double duration) override; - void OnReadyStateChange( - int player_id, - blink::WebMediaPlayer::ReadyState state) override; - void OnNetworkStateChange( - int player_id, - blink::WebMediaPlayer::NetworkState state) override; - void OnMediaDataChange(int player_id, int width, - int height, int media) override; - void OnNewFrameAvailable( - int player_id, - base::SharedMemoryHandle foreign_memory_handle, - uint32_t length, base::TimeDelta timestamp) override; - -#if defined(TIZEN_TBM_SUPPORT) - void OnNewTbmBufferAvailable( - int player_id, gfx::TbmBufferHandle tbm_handle, - base::TimeDelta timestamp) override; -#endif - - // Helper function to handle IPC from RenderMediaPlayerMangaerEfl. - virtual void OnPlay(int player_id); - virtual void OnPause(int player_id); - virtual void OnSetVolume(int player_id, double volume); - virtual void OnSetRate(int player_id, double rate); - virtual void OnInitialize( - int player_id, - MediaPlayerHostMsg_Initialize_Type type, - const GURL& url, - double volume, - int demuxer_client_id); - virtual void OnDestroy(int player_id); - virtual void OnSeek(int player_id, double time); - - protected: - // Clients must use Create() or subclass constructor. - explicit BrowserMediaPlayerManagerEfl(RenderFrameHost* render_frame_host); - - void AddPlayer(media::MediaPlayerEfl* player); - void RemovePlayer(int player_id); - - // To continue initializing of other players in queue. - virtual void OnInitComplete(int player_id, bool success); - - // To manage resumed/suspended player id. - virtual void OnResumeComplete(int player_id); - virtual void OnSuspendComplete(int player_id); - - // Helper function to send messages to RenderFrameObserver. - bool Send(IPC::Message* msg); - - int GetRoutingID(); - WebContents* web_contents() const { return web_contents_; } - - private: - void SuspendPlayers(); - void PausePlayers(int player_id); - void InitNextPlayer(); - void RemovePlayerFromInitializeQueue(int player_id); - void RemovePlayerFromResumedQueue(int player_id); - void CleanUpResumedQueue(); - - int current_player_; - - // An array of managed players. - ScopedVector players_; - RenderFrameHost* render_frame_host_; - WebContents* const web_contents_; - - // A queue to initialize player including preroll. - std::deque init_queue_; - std::deque resumed_queue_; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_MEDIA_EFL_BROWSER_MEDIA_PLAYER_MANAGER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.cc b/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.cc deleted file mode 100644 index 025e131..0000000 --- a/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.cc +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/media/media_web_contents_observer_efl.h" - -#include "content/browser/media/efl/browser_media_player_manager_efl.h" -#include "content/browser/renderer_host/render_process_host_impl.h" -#include "content/common/media/efl/media_player_messages_efl.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/web_contents.h" -#include "ipc/ipc_message_macros.h" - -namespace content { - -MediaWebContentsObserver* CreateMediaWebContentsObserver( - WebContents* web_contents) { - return new MediaWebContentsObserver(web_contents); -} - -MediaWebContentsObserver::MediaWebContentsObserver(WebContents* web_contents) - : WebContentsObserver(web_contents) { -} - -MediaWebContentsObserver::~MediaWebContentsObserver() { -} - -void MediaWebContentsObserver::RenderFrameDeleted( - RenderFrameHost* render_frame_host) { - uintptr_t key = reinterpret_cast(render_frame_host); - media_player_managers_.erase(key); -} - - -bool MediaWebContentsObserver::OnMessageReceived( - const IPC::Message& msg, RenderFrameHost* render_frame_host) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(MediaWebContentsObserver, msg) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_Init, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnInitialize) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_DeInit, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnDestroy) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_Play, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnPlay) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_Pause, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnPause) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_SetVolume, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnSetVolume) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_SetRate, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnSetRate) - IPC_MESSAGE_FORWARD(MediaPlayerEflHostMsg_Seek, - GetMediaPlayerManager(render_frame_host), - BrowserMediaPlayerManagerEfl::OnSeek) - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -BrowserMediaPlayerManagerEfl* - MediaWebContentsObserver::GetMediaPlayerManager( - RenderFrameHost* render_frame_host) { - uintptr_t key = reinterpret_cast(render_frame_host); - if (!media_player_managers_.contains(key)) { - media_player_managers_.set( - key, - make_scoped_ptr( - BrowserMediaPlayerManagerEfl::Create(render_frame_host))); - } - return media_player_managers_.get(key); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.h b/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.h deleted file mode 100644 index 9e31a76..0000000 --- a/tizen_src/chromium_impl/content/browser/media/media_web_contents_observer_efl.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_MEDIA_MEDIA_WEB_CONTENTS_OBSERVER_EFL_H_ -#define CONTENT_BROWSER_MEDIA_MEDIA_WEB_CONTENTS_OBSERVER_EFL_H_ - -#include "base/compiler_specific.h" -#include "base/containers/scoped_ptr_hash_map.h" -#include "content/common/content_export.h" -#include "content/public/browser/web_contents_observer.h" - -namespace content { - -class BrowserMediaPlayerManagerEfl; - -// This class manages all RenderFrame based media related managers at the -// browser side. It receives IPC messages from media RenderFrameObservers and -// forwards them to the corresponding managers. The managers are responsible -// for sending IPCs back to the RenderFrameObservers at the render side. -class CONTENT_EXPORT MediaWebContentsObserver : public WebContentsObserver { - public: - explicit MediaWebContentsObserver(WebContents* web_contents); - MediaWebContentsObserver(const MediaWebContentsObserver&) = delete; - MediaWebContentsObserver& operator=(const MediaWebContentsObserver&) = delete; - virtual ~MediaWebContentsObserver(); - - MediaWebContentsObserver(const MediaWebContentsObserver&) = delete; - MediaWebContentsObserver& operator=(const MediaWebContentsObserver&) = delete; - - // WebContentsObserver implementations. - virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) override; - virtual bool OnMessageReceived(const IPC::Message& message, - RenderFrameHost* render_frame_host) override; - - // Gets the media player manager associated with |render_frame_host|. Creates - // a new one if it doesn't exist. The caller doesn't own the returned pointer. - BrowserMediaPlayerManagerEfl* GetMediaPlayerManager( - RenderFrameHost* render_frame_host); - - private: - // Map from RenderFrameHost* to BrowserMediaPlayerManagerEfl. - typedef base::ScopedPtrHashMap> - MediaPlayerManagerMap; - MediaPlayerManagerMap media_player_managers_; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_MEDIA_MEDIA_WEB_CONTENTS_OBSERVER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/common/common_efl.gni b/tizen_src/chromium_impl/content/common/common_efl.gni index be506cf..71e2ded 100644 --- a/tizen_src/chromium_impl/content/common/common_efl.gni +++ b/tizen_src/chromium_impl/content/common/common_efl.gni @@ -35,15 +35,6 @@ if (use_wayland) { ] } -if (tizen_multimedia_support) { - external_content_common_efl_configs += [ - "//tizen_src/build:capi-media-player", - "//tizen_src/build:libcapi-media-player", - "//tizen_src/build:gstreamer", - "//tizen_src/build:libgstreamer", - ] -} - ############################################################################## # Dependency ############################################################################## @@ -62,15 +53,15 @@ external_exclude_content_common_efl_sources = [] external_content_common_efl_sources = [ "//tizen_src/chromium_impl/content/common/content_client_export.cc", "//tizen_src/chromium_impl/content/common/content_client_export.h", + "//tizen_src/chromium_impl/content/common/cursors/webcursor_efl.cc", + "//tizen_src/chromium_impl/content/common/cursors/webcursor_efl.h", "//tizen_src/chromium_impl/content/common/locale_efl.cc", "//tizen_src/chromium_impl/content/common/locale_efl.h", "//tizen_src/chromium_impl/content/common/message_generator_efl.cc", "//tizen_src/chromium_impl/content/common/message_generator_efl.h", - "//tizen_src/chromium_impl/content/common/paths_efl.h", "//tizen_src/chromium_impl/content/common/paths_efl.cc", + "//tizen_src/chromium_impl/content/common/paths_efl.h", "//tizen_src/chromium_impl/content/common/render_messages_efl.h", - "//tizen_src/chromium_impl/content/common/cursors/webcursor_efl.cc", - "//tizen_src/chromium_impl/content/common/cursors/webcursor_efl.h", "//tizen_src/chromium_impl/content/common/wrt/wrt_url_parse.h", ] @@ -81,14 +72,3 @@ if (is_tizen) { "//tizen_src/chromium_impl/content/common/tts_utterance_request_efl.h", ] } - -if (tizen_multimedia_support) { - external_content_common_efl_sources += [ - "//tizen_src/chromium_impl/content/common/media/efl/media_player_messages_enums_efl.h", - "//tizen_src/chromium_impl/content/common/media/efl/media_player_messages_efl.h", - "//tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.h", - "//tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.cc", - "//tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.h", - "//tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.cc", - ] -} diff --git a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.cc b/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.cc deleted file mode 100644 index 0af40ee..0000000 --- a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.cc +++ /dev/null @@ -1,589 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/common/gpu/media/efl/tizen_video_decode_accelerator.h" - -#include -#include -#include -#include -#include -#include - -#include "base/bind.h" -#include "base/memory/shared_memory.h" -#include "base/message_loop/message_loop.h" -#include "base/process/process.h" -#include "base/synchronization/waitable_event.h" -#include "base/thread_task_runner_handle.h" -#include "base/timer/timer.h" -#include "media/base/video_frame.h" - -using media::VideoFrame; - -namespace { - -struct GstElementDeleter { - void operator()(GstElement* ptr) const { - DCHECK(ptr != NULL); - gst_object_unref(ptr); - } -}; - -// Gstreamer elements and names. -const char* kDecoderName = "decoder"; -const char* kParserElement = "h264parse"; -#if defined(TIZEN_MULTIMEDIA_USE_HW_CODEC) -const char* kDecoderGstElement = "omxh264dec"; -const char* kVideoConvertElement = "fimcconvert"; -const char* kCapsFilterElement = "capsfilter"; -#else -const char* kDecoderGstElement = "avdec_h264"; -#endif - -} // namespace - -namespace content { - -enum { - MAX_BITRATE = 2000000, // bps. - INPUT_BUFFER_SIZE = MAX_BITRATE / 8, // bytes. 1 sec for H.264 HD video. - ID_LAST = 0x3FFFFFFF, // wrap round ID after this -}; - -media::VideoDecodeAccelerator* CreateTizenVideoDecodeAccelerator() { - return new TizenVideoDecodeAccelerator(); -} - -media::VideoDecodeAccelerator::SupportedProfiles GetSupportedTizenProfiles() { - media::VideoDecodeAccelerator::SupportedProfiles profiles; - media::VideoDecodeAccelerator::SupportedProfile profile; - profile.profile = media::H264PROFILE_MAIN; - profile.min_resolution.SetSize(0, 0); - profile.max_resolution.SetSize(1920, 1080); // FHD - profiles.push_back(profile); - - return profiles; -} - -struct TizenVideoDecodeAccelerator::BitstreamBufferRef { - BitstreamBufferRef( - base::WeakPtr client, - const scoped_refptr& client_task_runner, - base::SharedMemory* shm, - size_t size, - int32_t input_id) - : client_(client), - client_task_runner_(client_task_runner), - shm_(shm), - size_(size), - bytes_used_(0), - input_id_(input_id), - gst_buffer_(NULL) {} - - ~BitstreamBufferRef() { - if (input_id_ < 0) - return; - client_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &media::VideoDecodeAccelerator::Client::NotifyEndOfBitstreamBuffer, - client_, input_id_)); - } - - static void Destruct(gpointer data) { - DCHECK(data != NULL); - BitstreamBufferRef* pRef = static_cast(data); - delete pRef; - } - - base::WeakPtr client_; - scoped_refptr client_task_runner_; - scoped_ptr shm_; - size_t size_; - off_t bytes_used_; - int32_t input_id_; - GstBuffer* gst_buffer_; -}; - -struct TizenVideoDecodeAccelerator::Impl { - Impl() - : can_feed_(true), - is_destroying_(false), - pipeline_(NULL), - sink_(NULL), - appsrc_(NULL), - io_task_runner_(base::ThreadTaskRunnerHandle::Get()), - gst_thread_("TizenDecoderThreadGst"), - bitstream_buffer_id_(0), - caps_width_(0), - caps_height_(0) {} - - void DeliverVideoFrame(GstSample* sample, gfx::Rect frame_size); - bool CreateAppSrcElement(); - bool CreateAppSinkElement(); - static GstFlowReturn OnDecoded(GstAppSink* sink, gpointer app_data); - static void OnSinkCapsChanged(GstPad* sink_pad, GParamSpec* gparamspec, - void* user_data); - - static GstBusSyncReply OnBusMessage( - GstBus* bus, GstMessage* msg, gpointer data) { - switch (GST_MESSAGE_TYPE(msg)) { - case GST_MESSAGE_ERROR: { - gchar* debug = NULL; - GError* error = NULL; - gst_message_parse_error(msg, &error, &debug); - LOG(ERROR) << " GSTError happens from bus at " - << GST_OBJECT_NAME(msg->src) - << ":" << error->message; - LOG(ERROR) << " Debugging Info: " - << (debug != NULL ? debug : "none"); - g_error_free(error); - g_free(debug); - break; - } - default: - break; - } - return GST_BUS_PASS; - } - - static void StartFeed(GstAppSrc* source, guint size, gpointer app) { - DCHECK(source); - content::TizenVideoDecodeAccelerator::Impl* impl = - static_cast(app); - impl->can_feed_ = true; - } - - static void StopFeed(GstAppSrc* source, gpointer app) { - DCHECK(source); - content::TizenVideoDecodeAccelerator::Impl* impl = - static_cast(app); - impl->can_feed_ = false; - } - - volatile bool can_feed_; - volatile bool is_destroying_; - GstElement* pipeline_; - GstElement* sink_; - GstElement* appsrc_; - scoped_refptr io_task_runner_; - scoped_ptr > io_client_weak_factory_; - base::Thread gst_thread_; - int bitstream_buffer_id_; - int caps_width_; - int caps_height_; -}; - -TizenVideoDecodeAccelerator::TizenVideoDecodeAccelerator() - : impl_(NULL) { -} - -TizenVideoDecodeAccelerator::~TizenVideoDecodeAccelerator() { -} - -bool TizenVideoDecodeAccelerator::Initialize(const Config& config, - Client* client) { - GError* error = NULL; - GstElement* gst_decoder = NULL; - GstElement* gst_parser = NULL; - GstBus* gst_bus = NULL; - GstPad* video_sink_pad = NULL; - scoped_ptr gst_pipeline; - CHECK(impl_ == NULL); - impl_ = new Impl(); - impl_->io_client_weak_factory_.reset( - new base::WeakPtrFactory(client)); - - switch (config.profile) { - case media::H264PROFILE_BASELINE: - DVLOG(1) << "Initialize(): profile -> H264PROFILE_BASELINE"; - break; - case media::H264PROFILE_MAIN: - DVLOG(1) << "Initialize(): profile -> H264PROFILE_MAIN"; - break; - default: - LOG(ERROR) << "Initialize(): unsupported profile=" << config.profile; - return false; - }; - - if (!gst_is_initialized() && !gst_init_check(NULL, NULL, &error)) { - LOG(ERROR) << "Cannot initialize gstreamer."; - g_error_free(error); - return false; - } - - // pipeline initialization. - gst_pipeline.reset(gst_pipeline_new("h264_decode")); - if (!gst_pipeline) { - LOG(ERROR) << "Cannot initialize gst pipeline."; - return false; - } - if (!(gst_bus = gst_pipeline_get_bus(GST_PIPELINE(gst_pipeline.get())))) { - return false; - } - gst_bus_set_sync_handler(gst_bus, Impl::OnBusMessage, impl_, NULL); - gst_object_unref(gst_bus); - - // appsrc initialization. - if (!impl_->CreateAppSrcElement()) { - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), impl_->appsrc_)) { - gst_object_unref(impl_->appsrc_); - impl_->appsrc_ = NULL; - return false; - } - - DVLOG(1) << "######################################"; - DVLOG(1) << "USING " << kDecoderGstElement <<" DECODER "; - DVLOG(1) << "######################################"; - - // decoder initialization. - if (!(gst_decoder = gst_element_factory_make(kDecoderGstElement, - kDecoderName))) { - LOG(ERROR) << "Cannot create " << kDecoderGstElement << "."; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), gst_decoder)) { - LOG(ERROR) << "Cannot add " << kDecoderGstElement << " to pipeline."; - gst_object_unref(gst_decoder); - return false; - } - - // parser initialization - if (!(gst_parser = gst_element_factory_make(kParserElement, "h264parse"))) { - LOG(ERROR) << "Cannot create " << kParserElement; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), gst_parser)) { - LOG(ERROR) << "Cannot add " << kParserElement << " into decoder pipeline."; - gst_object_unref(gst_parser); - return false; - } - - // appsink initialization - if (!impl_->CreateAppSinkElement()) { - LOG(ERROR) << "Could not create and add appsink element"; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), impl_->sink_)) { - gst_object_unref(impl_->sink_); - impl_->sink_ = NULL; - return false; - } - -#if defined(TIZEN_MULTIMEDIA_USE_HW_CODEC) - GstElement* video_filter = NULL; - GstElement* gst_converter = NULL; - if (!(gst_converter = gst_element_factory_make(kVideoConvertElement, - kVideoConvertElement))) { - LOG(ERROR) << "Cannot create "<< kVideoConvertElement; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), gst_converter)) { - LOG(ERROR) << "Cannot add " << kVideoConvertElement << " into pipeline."; - gst_object_unref(gst_converter); - return false; - } - if (!(video_filter = gst_element_factory_make(kCapsFilterElement, - kCapsFilterElement))) { - LOG(ERROR) << "Cannot create " << kCapsFilterElement; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), video_filter)) { - LOG(ERROR) << "Cannot add " << kCapsFilterElement << " into pipeline."; - gst_object_unref(video_filter); - return false; - } -#endif - - if (!(video_sink_pad = - gst_element_get_static_pad(impl_->sink_, "sink"))) { - LOG(ERROR) << "Could not create video sink pad"; - return false; - } - g_signal_connect( - video_sink_pad, "notify::caps", - G_CALLBACK(&Impl::OnSinkCapsChanged), impl_); - gst_object_unref(video_sink_pad); - - if (!gst_element_link_many(impl_->appsrc_, gst_parser, gst_decoder, -#if defined(TIZEN_MULTIMEDIA_USE_HW_CODEC) - gst_converter, video_filter, -#endif - impl_->sink_, NULL)) { - LOG(ERROR) << "Cannot link some elements in decode pipeline"; - return false; - } - -#if defined(USE_OMX_DECODER) - g_object_set(G_OBJECT(video_filter), "caps", - gst_caps_new_simple("video/x-raw", - "format", G_TYPE_STRING, "I420", - NULL), NULL); -#endif - - if (!impl_->gst_thread_.Start()) { - LOG(ERROR) << "gst_thread_ failed to start"; - return false; - } - - GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(gst_pipeline.get()), - GST_DEBUG_GRAPH_SHOW_ALL, - "decoder_graph.dot"); - - impl_->pipeline_ = gst_pipeline.release(); - - impl_->gst_thread_.message_loop()->PostTask( - FROM_HERE, base::BindOnce(&TizenVideoDecodeAccelerator::StartDecoder, - base::Unretained(this))); - return true; -} - -void TizenVideoDecodeAccelerator::Decode( - const media::BitstreamBuffer& bitstream_buffer) { - scoped_ptr buffer_ref; - scoped_ptr shm( - new base::SharedMemory(bitstream_buffer.handle(), true)); - - if (!shm->Map(bitstream_buffer.size())) { - LOG(ERROR) << "Could not map bitstream_buffer"; - NotifyError(media::VideoDecodeAccelerator::UNREADABLE_INPUT); - return; - } - - buffer_ref.reset(new BitstreamBufferRef( - impl_->io_client_weak_factory_->GetWeakPtr(), - base::ThreadTaskRunnerHandle::Get(), - shm.release(), - bitstream_buffer.size(), - bitstream_buffer.id())); - - if (!buffer_ref) { - return; - } - - if (impl_->can_feed_ && !impl_->is_destroying_) { - impl_->gst_thread_.message_loop()->PostTask( - FROM_HERE, - base::BindOnce(&TizenVideoDecodeAccelerator::OnDecode, - base::Unretained(this), base::Passed(&buffer_ref))); - } else { - DVLOG(2) << "Frame drop on decoder:" - << " INPUT Q is FULL"; - } -} - -void TizenVideoDecodeAccelerator::AssignPictureBuffers( - const std::vector& buffers) { - NOTIMPLEMENTED(); -} - -void TizenVideoDecodeAccelerator::ReusePictureBuffer( - int32_t picture_buffer_id) { - NOTIMPLEMENTED(); -} - -void TizenVideoDecodeAccelerator::Flush() { - NOTIMPLEMENTED(); -} - -void TizenVideoDecodeAccelerator::Reset() { - NOTIMPLEMENTED(); -} - -void TizenVideoDecodeAccelerator::Destroy() { - if (impl_ != NULL) { - if (impl_->gst_thread_.IsRunning()) { - impl_->gst_thread_.Stop(); - } - - if (impl_->appsrc_) - gst_app_src_end_of_stream(GST_APP_SRC(impl_->appsrc_)); - - impl_->is_destroying_ = true; - if (impl_->pipeline_) { - gst_element_set_state(impl_->pipeline_, GST_STATE_NULL); - gst_object_unref(GST_OBJECT(impl_->pipeline_)); - impl_->pipeline_ = NULL; - } - delete impl_; - impl_ = NULL; - } - delete this; -} - -bool TizenVideoDecodeAccelerator::CanDecodeOnIOThread(){ - return false; -} - -void TizenVideoDecodeAccelerator::StartDecoder() { - gst_element_set_state(impl_->pipeline_, GST_STATE_PLAYING); -}; - -void TizenVideoDecodeAccelerator::Impl::OnSinkCapsChanged( - GstPad* sink_pad, GParamSpec* gparamspec, void* user_data) { - content::TizenVideoDecodeAccelerator::Impl* impl = - static_cast(user_data); - GstCaps* caps = gst_pad_get_current_caps(GST_PAD(sink_pad)); - if (!caps) - return; - GstVideoInfo info; - gst_video_info_init(&info); - if (gst_video_info_from_caps(&info, caps)) { - impl->caps_width_ = info.width; - impl->caps_height_ = info.height; - } - gst_caps_unref(caps); -} - -GstFlowReturn TizenVideoDecodeAccelerator::Impl::OnDecoded( - GstAppSink* sink, gpointer app_data) { - content::TizenVideoDecodeAccelerator::Impl* self = - static_cast(app_data); - GstSample* sample = gst_app_sink_pull_sample(GST_APP_SINK(sink)); - if (!sample) { - LOG(ERROR) << "DECODING FRAME FAILED : frame_id " - << self->bitstream_buffer_id_; - return GST_FLOW_ERROR; - } - // FIXME: SONAL - // OnSinkCapsChanged callback is not called for Appsink on Tizen, - // This is an alternate approach to get sample info. -#if !BUILDFLAG(IS_TIZEN) - if (!self->caps_width_ || !self->caps_height_) { - const GstStructure* str = gst_sample_get_info(sample); - if (!str || - !gst_structure_get_int(str, "width", &self->caps_width_) || - !gst_structure_get_int(str, "height", &self->caps_height_)) { - LOG(ERROR) << "Buffer information could not be obtained"; - gst_sample_unref(sample); - return GST_FLOW_ERROR; - } - } -#endif - gfx::Rect frame_size = - gfx::Rect(self->caps_width_, self->caps_height_); - self->gst_thread_.message_loop()->PostTask( - FROM_HERE, - base::BindOnce(&TizenVideoDecodeAccelerator::Impl::DeliverVideoFrame, - base::Unretained(self), sample, frame_size)); - return GST_FLOW_OK; -} - -bool TizenVideoDecodeAccelerator::Impl::CreateAppSrcElement() { - if (!(appsrc_ = gst_element_factory_make("appsrc", "src"))) { - LOG(ERROR) << "Cannot initialize gst appsrc."; - return false; - } - static GstAppSrcCallbacks appsrc_callbacks = - {&Impl::StartFeed, &Impl::StopFeed, NULL}; - gst_app_src_set_max_bytes(GST_APP_SRC(appsrc_), INPUT_BUFFER_SIZE); - gst_app_src_set_callbacks(GST_APP_SRC(appsrc_), &appsrc_callbacks, - static_cast(this), NULL); - g_object_set(G_OBJECT(appsrc_), - "is-live", TRUE, - "block", FALSE, - "min-percent", 80, // if buffer below 80%, need-data emits. - "stream-type", GST_APP_STREAM_TYPE_STREAM, - NULL); - GstCaps* video_caps = gst_caps_from_string("video/x-h264,framerate=30/1"); - if (!video_caps) { - gst_object_unref(appsrc_); - return false; - } - gst_app_src_set_caps(GST_APP_SRC(appsrc_), video_caps); - gst_caps_unref(video_caps); - return true; -} - -bool TizenVideoDecodeAccelerator::Impl::CreateAppSinkElement() { - if (!(sink_ = gst_element_factory_make("appsink", "sink"))) { - LOG(ERROR) << "Appsink could not be created"; - return false; - } - - GstAppSinkCallbacks appsink_callbacks = {NULL, NULL, &OnDecoded, NULL}; - gst_app_sink_set_callbacks(GST_APP_SINK(sink_), - &appsink_callbacks, - static_cast(this), - NULL); - gst_app_sink_set_max_buffers(GST_APP_SINK(sink_), 1); - return true; -} - -void TizenVideoDecodeAccelerator::Impl::DeliverVideoFrame( - GstSample* sample, gfx::Rect frame_size) { - base::SharedMemory shared_memory; - base::SharedMemoryHandle shared_memory_handle; - - GstBuffer* buffer = gst_sample_get_buffer(sample); - GstMapInfo map; - if (!buffer || !gst_buffer_map(buffer, &map, GST_MAP_READ)) { - LOG(ERROR) << "No Decoded Buffer or contains invalid info!"; - gst_sample_unref(sample); - return; - } - - if (!map.data || !(map.size > 0) || - !shared_memory.CreateAndMapAnonymous(map.size)) { - LOG(ERROR) << "Shared Memory creation failed."; - } else { - if (!shared_memory.ShareToProcess(base::GetCurrentProcessHandle(), - &shared_memory_handle)) { - LOG(ERROR) << "Could not get handle of Shared Memory"; - } else { - memcpy(shared_memory.memory(), map.data, map.size); - io_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &media::VideoDecodeAccelerator::Client::NotifyDecodeDone, - io_client_weak_factory_->GetWeakPtr(), shared_memory_handle, - bitstream_buffer_id_, map.size, frame_size)); - bitstream_buffer_id_ = (bitstream_buffer_id_ + 1) & ID_LAST; - } - } - gst_buffer_unmap(buffer, &map); - gst_sample_unref(sample); -} - -void TizenVideoDecodeAccelerator::OnDecode( - scoped_ptr buffer_ref) { - if (!buffer_ref) { - return; - } - buffer_ref->gst_buffer_ = - gst_buffer_new_wrapped_full( - GST_MEMORY_FLAG_READONLY, - static_cast(buffer_ref->shm_->memory()), - buffer_ref->size_, - 0, - buffer_ref->size_, - reinterpret_cast(buffer_ref.get()), - BitstreamBufferRef::Destruct); - if (!buffer_ref->gst_buffer_ || !GST_IS_BUFFER(buffer_ref->gst_buffer_)) { - LOG(ERROR) << " gst_buffer_new_wrapped_full failed to allocate memory.!"; - return; - } - if (GST_FLOW_OK != - gst_app_src_push_buffer(GST_APP_SRC(impl_->appsrc_), - buffer_ref->gst_buffer_)) { - LOG(ERROR) << " fail to push buffer into decoder pipeline"; - return; - } - - // lifecycle of buffer_ref will be handled by gstreamer. - ignore_result(buffer_ref.release()); -} - -void TizenVideoDecodeAccelerator::NotifyError( - media::VideoDecodeAccelerator::Error error) { - if (impl_->io_client_weak_factory_->GetWeakPtr()) { - impl_->io_client_weak_factory_->GetWeakPtr()->NotifyError(error); - } -} - -} // namespace content - diff --git a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.h b/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.h deleted file mode 100644 index 1e34431..0000000 --- a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_decode_accelerator.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_DECODE_ACCELERATOR_H_ -#define CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_DECODE_ACCELERATOR_H_ - -#include "base/synchronization/lock.h" -#include "base/threading/thread.h" -#include "content/common/content_export.h" -#include "media/video/video_decode_accelerator.h" - -namespace content { - -class CONTENT_EXPORT TizenVideoDecodeAccelerator - : public media::VideoDecodeAccelerator { - public: - TizenVideoDecodeAccelerator(); - ~TizenVideoDecodeAccelerator() override; - - TizenVideoDecodeAccelerator(const TizenVideoDecodeAccelerator&) = delete; - TizenVideoDecodeAccelerator& operator=(const TizenVideoDecodeAccelerator&) = - delete; - - bool Initialize(const Config& config, Client* client) override; - void Decode(const media::BitstreamBuffer& bitstream_buffer) override; - void AssignPictureBuffers( - const std::vector& buffers) override; - void ReusePictureBuffer(int32_t picture_buffer_id) override; - void Flush() override; - void Reset() override; - void Destroy() override; - bool CanDecodeOnIOThread() override; - - private: - struct BitstreamBufferRef; - struct Impl; - - void OnDecode(scoped_ptr buffer_ref); - void NotifyError(media::VideoDecodeAccelerator::Error error); - void StartDecoder(); - - Impl* impl_; -}; - -} // namespace content - -#endif // CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_DECODE_ACCELERATOR_H_ diff --git a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.cc b/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.cc deleted file mode 100644 index 7fcd204..0000000 --- a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.cc +++ /dev/null @@ -1,617 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/common/gpu/media/efl/tizen_video_encode_accelerator.h" - -#include -#include -#include -#include - -#include "base/bind.h" -#include "base/command_line.h" -#include "base/logging.h" -#include "base/message_loop/message_loop.h" -#include "base/thread_task_runner_handle.h" -#include "base/timer/timer.h" -#include "gpu/command_buffer/service/gpu_switches.h" -#include "media/base/bitstream_buffer.h" -#include "media/base/video_frame.h" -#include "third_party/webrtc/common_video/libyuv/include/webrtc_libyuv.h" - -using media::VideoFrame; - -namespace content { - -struct GstElementDeleter { - inline void operator()(GstElement* ptr) const { - DCHECK(ptr != NULL); - gst_object_unref(ptr); - } -}; - -enum { - // Arbitrary choice. - INITIAL_FRAMERATE = 30, - // Until there are non-realtime users, no need for unrequested I-frames. - INPUT_BUFFER_COUNT = 5, // default input buffer counts of omx_h264enc - MAX_BUFFERING = 60, - MAX_FRAME_RATE = 30, - MAX_BITRATE = 2000000, // Max bitrate in bps - MAX_OUTPUT_BUFFERS = 30, // Maximum queue size of output buffers - MAX_WIDTH = 1280, - MAX_HEIGHT = 720, -}; - -// Gstreamer elements and names. -const char* kEncoderName = "encoder"; -#if BUILDFLAG(IS_TIZEN) -const char* kEncoderGstElement = "omxh264enc"; -const char* kBitrateProperty = "target-bitrate"; -#else -const char* kEncoderGstElement = "x264enc"; -const char* kBitrateProperty = "bitrate"; -#endif - -media::VideoEncodeAccelerator* CreateTizenVideoEncodeAccelerator() { - return new TizenVideoEncodeAccelerator(); -} - -struct TizenVideoEncodeAccelerator::BitstreamBufferRef { - BitstreamBufferRef( - const scoped_refptr& frame, - base::WeakPtr client_delegate, - const scoped_refptr& client_task_runner, - size_t size) - : frame_(frame), - client_delegate_(client_delegate), - client_task_runner_(client_task_runner), - size_(size), - bytes_used_(0), - gst_buffer_(NULL) {} - - ~BitstreamBufferRef() {} - - static void Destruct(gpointer data) { - DCHECK(data != NULL); - BitstreamBufferRef* pRef = static_cast(data); - delete pRef; - } - - scoped_refptr frame_; - base::WeakPtr client_delegate_; - scoped_refptr client_task_runner_; - size_t size_; - off_t bytes_used_; - GstBuffer* gst_buffer_; -}; - -struct TizenVideoEncodeAccelerator::OutputBuffer { - explicit OutputBuffer( - GstBuffer* buffer, - bool key_frame) - : buffer_(buffer), - key_frame_(key_frame) {} - - virtual ~OutputBuffer() { - if (buffer_) - gst_buffer_unref(buffer_); - buffer_ = NULL; - } - - GstBuffer* buffer_; - bool key_frame_; -}; - -struct TizenVideoEncodeAccelerator::Impl { - Impl(media::VideoEncodeAccelerator::Client* client, - scoped_refptr msg_loop) - : pipeline_(NULL), - encoder_(NULL), - appsrc_(NULL), - gst_thread_("TizenEncoderThreadGst"), - enable_framedrop_(false), - io_client_weak_factory_(client), - child_task_runner_(msg_loop), - gst_bitrate_(0), - is_running_(false), - is_destroying_(false), - can_feed_(false) {} - - void DeliverVideoFrame(); - bool CreateAppSrcElement(); - static GstFlowReturn OnEncoded(GstAppSink *sink,gpointer data); - static void StartFeed(GstAppSrc *source, guint size, gpointer data); - static void StopFeed(GstAppSrc *source, gpointer data); - - GstElement* pipeline_; - GstElement* encoder_; - GstElement* appsrc_; - base::Thread gst_thread_; - bool enable_framedrop_; - std::vector encoder_output_queue_; - base::WeakPtrFactory< - media::VideoEncodeAccelerator::Client> io_client_weak_factory_; - const scoped_refptr child_task_runner_; - base::Lock destroy_lock_; - base::ThreadChecker thread_checker_; - gfx::Size view_size_; - uint32_t gst_bitrate_; - volatile bool is_running_; - volatile bool is_destroying_; - volatile bool can_feed_; - base::RepeatingTimer io_timer_; - std::queue output_buffers_; - base::Lock output_queue_lock_; -}; - -void TizenVideoEncodeAccelerator::Impl::DeliverVideoFrame() { - media::BitstreamBuffer* bs_buffer = NULL; - bool key_frame = false; - GstMapInfo map; - scoped_ptr shm; - scoped_ptr out_buffer = NULL; - - if (output_buffers_.empty()) - return; - - if (encoder_output_queue_.empty()) { - // Observed till now that output_buffers_ size does not exceed 4-5. - // Therefore this code will be called in very rare situations. - if (output_buffers_.size() >= MAX_OUTPUT_BUFFERS) { - enable_framedrop_ = true; - base::AutoLock auto_lock(output_queue_lock_); - while (!output_buffers_.empty()) { - out_buffer.reset(output_buffers_.front()); - if (out_buffer->key_frame_) - break; - output_buffers_.pop(); - out_buffer.reset(NULL); - } - } - return; - } - enable_framedrop_ = false; - key_frame = output_buffers_.front()->key_frame_; - bs_buffer = &encoder_output_queue_.back(); - encoder_output_queue_.pop_back(); - - shm.reset(new base::SharedMemory(bs_buffer->handle(), false)); - if (!shm->Map(bs_buffer->size())) { - LOG(ERROR) << "Failed to map SHM"; - io_client_weak_factory_.GetWeakPtr()->NotifyError( - media::VideoEncodeAccelerator::kPlatformFailureError); - return; - } - { - base::AutoLock auto_lock(output_queue_lock_); - out_buffer.reset(output_buffers_.front()); - output_buffers_.pop(); - } - - if (!gst_buffer_map(out_buffer->buffer_, &map, GST_MAP_READ)) { - LOG(ERROR) << "Encoded Buffer contains invalid or no info.!"; - return; - } - - if (!map.data && map.size > shm->mapped_size()) { - LOG(ERROR) << "Encoded buff too large: " - << map.size << ">" << shm->mapped_size(); - io_client_weak_factory_.GetWeakPtr()->NotifyError( - media::VideoEncodeAccelerator::kPlatformFailureError); - } else { - //copying data to shared memory. - memcpy(static_cast(shm->memory()), map.data, map.size); - child_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &media::VideoEncodeAccelerator::Client::BitstreamBufferReady, - io_client_weak_factory_.GetWeakPtr(), bs_buffer->id(), map.size, - key_frame)); - } - gst_buffer_unmap(out_buffer->buffer_, &map); -} - -bool TizenVideoEncodeAccelerator::Impl::CreateAppSrcElement() { - if (!(appsrc_ = gst_element_factory_make ("appsrc", "src"))) { - LOG(ERROR) << "Cannot initialize gst appsrc."; - return false; - } - GstCaps* appsrc_caps = gst_caps_new_simple( - "video/x-raw", - "format", G_TYPE_STRING, "I420", - "width", G_TYPE_INT, view_size_.width(), - "height", G_TYPE_INT, view_size_.height(), - "framerate", GST_TYPE_FRACTION, 30, 1, - "rotate", G_TYPE_INT, 0, - NULL); - GstAppSrcCallbacks appsrc_callbacks = - { &TizenVideoEncodeAccelerator::Impl::StartFeed, - &TizenVideoEncodeAccelerator::Impl::StopFeed, - NULL }; - - guint64 max_input_buffer = - INPUT_BUFFER_COUNT * VideoFrame::AllocationSize(media::PIXEL_FORMAT_I420, - view_size_); - gst_app_src_set_callbacks(GST_APP_SRC(appsrc_), &appsrc_callbacks, - static_cast(this), NULL); - gst_app_src_set_max_bytes(GST_APP_SRC(appsrc_), max_input_buffer); - gst_app_src_set_caps(GST_APP_SRC(appsrc_), appsrc_caps); - - g_object_set(G_OBJECT(appsrc_), - "is-live", TRUE, - "block", FALSE, - "do-timestamp", TRUE, - "min-latency", (gint64)(0), - "max-latency", (gint64)(0), - "min-percent", 80, // if buffer below 80%, need-data emits. - "stream-type", GST_APP_STREAM_TYPE_STREAM, - "format", GST_FORMAT_DEFAULT, - NULL); - gst_caps_unref(appsrc_caps); - return true; -} - -GstFlowReturn TizenVideoEncodeAccelerator::Impl::OnEncoded( - GstAppSink *sink, gpointer data) { - TizenVideoEncodeAccelerator::Impl* impl = - static_cast(data); - - GstSample* sample = gst_app_sink_pull_sample(GST_APP_SINK(sink)); - GstBuffer* buffer = gst_sample_get_buffer(sample); - GstMapInfo map; - if (!buffer || !gst_buffer_map(buffer, &map, GST_MAP_READ)) { - LOG(ERROR) << "Encoded Buffer contains invalid or no info!"; - gst_sample_unref(sample); - return GST_FLOW_ERROR; - } - - if (map.data) { - bool key_frame = false; - if (!GST_BUFFER_FLAG_IS_SET(buffer, GST_BUFFER_FLAG_DELTA_UNIT)) { - key_frame = true; - } - base::AutoLock auto_lock(impl->output_queue_lock_); - impl->output_buffers_.push( - new TizenVideoEncodeAccelerator::OutputBuffer(gst_buffer_ref(buffer), - key_frame)); - } - gst_buffer_unmap(buffer, &map); - gst_sample_unref(sample); - return GST_FLOW_OK; -} - -void TizenVideoEncodeAccelerator::Impl::StartFeed( - GstAppSrc* source, guint size, gpointer data) { - TizenVideoEncodeAccelerator::Impl* impl = - static_cast(data); - DCHECK(impl); - impl->can_feed_ = true; -} - -void TizenVideoEncodeAccelerator::Impl::StopFeed( - GstAppSrc* source, gpointer data) { - TizenVideoEncodeAccelerator::Impl* impl = - static_cast(data); - DCHECK(impl); - impl->can_feed_ = false; -} - -TizenVideoEncodeAccelerator::TizenVideoEncodeAccelerator() - : impl_(NULL) {} - -TizenVideoEncodeAccelerator::~TizenVideoEncodeAccelerator() {} - -std::vector -TizenVideoEncodeAccelerator::GetSupportedProfiles() { - std::vector profiles; - media::VideoEncodeAccelerator::SupportedProfile profile; - profile.profile = media::H264PROFILE_BASELINE; - profile.max_resolution.SetSize(MAX_WIDTH, MAX_HEIGHT); - profile.max_framerate_numerator = MAX_FRAME_RATE; - profile.max_framerate_denominator = 1; - profiles.push_back(profile); - - return profiles; -} - -bool TizenVideoEncodeAccelerator::Initialize( - media::VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - media::VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) { - DVLOG(1) << " size :" << input_visible_size.ToString() - << " max bitrate :" << MAX_BITRATE << "bps"; - DCHECK(impl_ == NULL); - if (media::H264PROFILE_MIN > output_profile || - media::H264PROFILE_MAX < output_profile) { - NOTREACHED(); - return false; - } - - impl_ = new Impl(client, base::ThreadTaskRunnerHandle::Get()); - impl_->gst_bitrate_ = initial_bitrate; - impl_->view_size_ = input_visible_size; - impl_->gst_thread_.Start(); - - if (!StartEncoder()) { - delete impl_; - impl_ = NULL; - return false; - } - - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce( - &media::VideoEncodeAccelerator::Client::RequireBitstreamBuffers, - impl_->io_client_weak_factory_.GetWeakPtr(), - (unsigned int)INPUT_BUFFER_COUNT, input_visible_size, - MAX_BITRATE / 8)); // Maximum bytes for a frame by MAX_BITRATE. - return true; -} - -void TizenVideoEncodeAccelerator::Encode( - const scoped_refptr& frame, - bool force_keyframe) { - size_t frame_size = VideoFrame::AllocationSize(media::PIXEL_FORMAT_I420, - frame->coded_size()); - DVLOG(3) << " coded_size :" << frame->coded_size().ToString() - << " natural_size :" << frame->natural_size().ToString(); - - scoped_ptr buffer_ref; - - buffer_ref.reset( - new BitstreamBufferRef(frame, - impl_->io_client_weak_factory_.GetWeakPtr(), - impl_->child_task_runner_, - frame_size)); - - if (!buffer_ref) { - LOG(ERROR) << "malloc failed"; - return; - } - - if (impl_->can_feed_ && !impl_->is_destroying_) { - impl_->gst_thread_.message_loop()->PostTask( - FROM_HERE, base::BindOnce(&TizenVideoEncodeAccelerator::OnEncode, - base::Unretained(this), - base::Passed(&buffer_ref), force_keyframe)); - } else { - DVLOG(2) << " [WEBRTC] . FRAME DROP :" - << " can_feed_:" << impl_->can_feed_ - << " is_destroying_:" << impl_->is_destroying_; - } -} - -void TizenVideoEncodeAccelerator::UseOutputBitstreamBuffer( - const media::BitstreamBuffer& buffer) { - impl_->gst_thread_.message_loop()->PostTask( - FROM_HERE, - base::BindOnce(&TizenVideoEncodeAccelerator::OnUseOutputBitstreamBuffer, - base::Unretained(this), buffer)); -} - -void TizenVideoEncodeAccelerator::RequestEncodingParametersChange( - uint32_t bitrate, uint32_t framerate) { - DVLOG(2) << " bitrate: " << bitrate - << " framerate: " << framerate; - if (bitrate > 0 && bitrate != impl_->gst_bitrate_) { - impl_->gst_bitrate_ = bitrate; - // Omx Encoder expects bitrate in bps whereas ffenc expects bitrate in kbps - // Information can be gained by gst-inspect - g_object_set(G_OBJECT(impl_->encoder_), kBitrateProperty, -#if BUILDFLAG(IS_TIZEN) - std::min(bitrate, static_cast(MAX_BITRATE)), -#else - std::min(bitrate, static_cast(MAX_BITRATE)) / 1000, -#endif - NULL); - } -} - -void TizenVideoEncodeAccelerator::Destroy() { - if (impl_) { - DCHECK(impl_->thread_checker_.CalledOnValidThread()); - if (impl_->appsrc_) - gst_app_src_end_of_stream(GST_APP_SRC(impl_->appsrc_)); - - { - base::AutoLock auto_lock(impl_->destroy_lock_); - impl_->is_destroying_ = true; - } - - if (impl_->gst_thread_.IsRunning()) - impl_->gst_thread_.Stop(); - if (impl_->pipeline_) { - gst_element_set_state(impl_->pipeline_, GST_STATE_NULL); - gst_object_unref(GST_OBJECT(impl_->pipeline_)); - } - if (impl_->io_timer_.IsRunning()) - impl_->io_timer_.Stop(); - - while (!impl_->encoder_output_queue_.empty()) { - media::BitstreamBuffer bitstream_buffer = - impl_->encoder_output_queue_.back(); - // created shm and let it go out of scope automatically. - scoped_ptr shm( - new base::SharedMemory(bitstream_buffer.handle(), false)); - impl_->encoder_output_queue_.pop_back(); - } - scoped_ptr output_buffer = NULL; - while (!impl_->output_buffers_.empty()) { - output_buffer.reset(impl_->output_buffers_.front()); - impl_->output_buffers_.pop(); - output_buffer.reset(NULL); - } - delete impl_; - } - delete this; -} - -void TizenVideoEncodeAccelerator::OnEncode( - scoped_ptr buffer_ref, bool force_keyframe) { - - BitstreamBufferRef* bufref = buffer_ref.release(); - if (bufref == NULL) { - return; - } - - bufref->gst_buffer_ = - gst_buffer_new_wrapped_full( - GST_MEMORY_FLAG_READONLY, - static_cast(bufref->frame_->data(VideoFrame::kYPlane)), - bufref->size_, - 0, - bufref->size_, - reinterpret_cast(bufref), - BitstreamBufferRef::Destruct); - if (!bufref->gst_buffer_ || !GST_IS_BUFFER(bufref->gst_buffer_)) { - LOG(INFO) << "gst_buffer_new_wrapped_full failed to allocate memory."; - return; - } - if (GST_FLOW_OK != - gst_app_src_push_buffer(GST_APP_SRC(impl_->appsrc_), - bufref->gst_buffer_)) { - LOG(ERROR) << "Error while pushing buffer int appsrc on encoder."; - gst_buffer_unref(bufref->gst_buffer_); - } - - return; -} - -void TizenVideoEncodeAccelerator::OnUseOutputBitstreamBuffer( - const media::BitstreamBuffer& buffer) { - impl_->encoder_output_queue_.push_back(buffer); - - DVLOG(2) << " output buffer is ready to use: " << buffer.id() - << " out queue size: " << impl_->encoder_output_queue_.size(); -} - -bool TizenVideoEncodeAccelerator::StartEncoder() { - GError* error = NULL; - GstElement* gst_appsink = NULL; - scoped_ptr gst_pipeline; - - if (!gst_is_initialized() && !gst_init_check(NULL, NULL, &error)) { - LOG(ERROR) << "Cannot initialize gstreamer."; - g_error_free(error); - return false; - } - - // pipeline initialization - gst_pipeline.reset(gst_pipeline_new("h264_encode")); - if (!gst_pipeline) { - LOG(ERROR) << "Cannot initialize gst pipeline."; - return false; - } - - if (!impl_->CreateAppSrcElement()) { - return false; - } - - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), impl_->appsrc_)) { - LOG(ERROR) << "Cannot add gst appsrc to encoder pipeline."; - gst_object_unref(impl_->appsrc_); - impl_->appsrc_ = NULL; - return false; - } - - // appsink initialization - if (!(gst_appsink = gst_element_factory_make("appsink", "sink"))) { - LOG(ERROR) << "Cannot create appsink for encoder pipeline."; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), gst_appsink)) { - LOG(ERROR) << "Cannot add gst appsink into encoder pipeline."; - gst_object_unref(gst_appsink); - return false; - } - - GstAppSinkCallbacks appsink_callbacks = - { NULL, NULL, &TizenVideoEncodeAccelerator::Impl::OnEncoded, NULL }; - gst_app_sink_set_callbacks(GST_APP_SINK(gst_appsink), &appsink_callbacks, - static_cast(impl_), NULL); - gst_app_sink_set_max_buffers(GST_APP_SINK(gst_appsink), 1); - - DVLOG(1) << "######################################"; - DVLOG(1) << "USING " << kEncoderGstElement << " ENCODER"; - DVLOG(1) << "######################################"; - - // encoder initialization - if (!(impl_->encoder_ = gst_element_factory_make(kEncoderGstElement, - kEncoderName))) { - LOG(ERROR) << "Cannot create " << kEncoderGstElement << "."; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), impl_->encoder_)) { - LOG(ERROR) << "Cannot add " - << kEncoderGstElement << "into encoder pipeline."; - gst_object_unref(impl_->encoder_); - impl_->encoder_ = NULL; - return false; - } - -#if BUILDFLAG(IS_TIZEN) - g_object_set(impl_->encoder_, - "control-rate", 2, // 1:VBR_CFR 2:CBR_CFR 3:VBR_VFR 4:CBR_VFR - kBitrateProperty, impl_->gst_bitrate_, - NULL); -#else - // parser initialization - GstElement* gst_parser = NULL; - if (!(gst_parser = gst_element_factory_make("videoparse", "parse"))) { - LOG(ERROR) << "Cannot create videoparse."; - return false; - } - if (!gst_bin_add(GST_BIN(gst_pipeline.get()), gst_parser)) { - LOG(ERROR) << "Cannot add videoparse to encoder pipeline."; - gst_object_unref(gst_parser); - return false; - } - - g_object_set(gst_parser, - "format", GST_VIDEO_FORMAT_I420, - "width", impl_->view_size_.width(), - "height", impl_->view_size_.height(), - "framerate", INITIAL_FRAMERATE, 1, - NULL); - - g_object_set(impl_->encoder_, - "byte-stream", TRUE, - kBitrateProperty, impl_->gst_bitrate_ / 1000, // to kbit/s - "tune", 0x00000004, NULL); -#endif - - g_object_set(gst_appsink, "sync", FALSE, NULL); - - if (!gst_element_link_many(impl_->appsrc_, -#if !BUILDFLAG(IS_TIZEN) - gst_parser, -#endif - impl_->encoder_, gst_appsink, NULL)) { - LOG(ERROR) << "Cannot link for encoder pipeline."; - return false; - } - - if (GST_STATE_CHANGE_FAILURE == - gst_element_set_state(gst_pipeline.get(), GST_STATE_PLAYING)) { - LOG(ERROR) << "Cannot start encoder pipeline."; - return false; - } - - impl_->io_timer_.Start(FROM_HERE, - base::TimeDelta::FromMilliseconds(10), - impl_, - &TizenVideoEncodeAccelerator::Impl::DeliverVideoFrame); - - GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(gst_pipeline.get()), - GST_DEBUG_GRAPH_SHOW_ALL, - "encoder_graph.dot"); - - impl_->pipeline_ = gst_pipeline.release(); - return true; -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.h b/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.h deleted file mode 100644 index 943fac2..0000000 --- a/tizen_src/chromium_impl/content/common/gpu/media/efl/tizen_video_encode_accelerator.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_ENCODE_ACCELERATOR_H_ -#define CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_ENCODE_ACCELERATOR_H_ - -#include "base/threading/thread.h" -#include "base/synchronization/lock.h" -#include "base/synchronization/waitable_event.h" -#include "content/common/content_export.h" -#include "media/video/video_encode_accelerator.h" - -namespace content { - -class CONTENT_EXPORT TizenVideoEncodeAccelerator - : public media::VideoEncodeAccelerator { - public: - TizenVideoEncodeAccelerator(); - ~TizenVideoEncodeAccelerator() override; - - TizenVideoEncodeAccelerator(const TizenVideoEncodeAccelerator&) = delete; - TizenVideoEncodeAccelerator& operator=(const TizenVideoEncodeAccelerator&) = - delete; - - std::vector - GetSupportedProfiles() override; - bool Initialize(media::VideoPixelFormat input_format, - const gfx::Size& input_visible_size, - media::VideoCodecProfile output_profile, - uint32_t initial_bitrate, - Client* client) override; - void Encode(const scoped_refptr& frame, - bool force_keyframe) override; - void UseOutputBitstreamBuffer(const media::BitstreamBuffer& buffer) override; - void RequestEncodingParametersChange(uint32_t bitrate, - uint32_t framerate) override; - void Destroy() override; - - private: - struct BitstreamBufferRef; - struct Impl; - struct OutputBuffer; - - void OnEncode(scoped_ptr buffer_ref, bool force_keyframe); - void OnUseOutputBitstreamBuffer(const media::BitstreamBuffer& buffer); - bool StartEncoder(); - - Impl* impl_; -}; - -} // namespace content - -#endif // CONTENT_COMMON_GPU_MEDIA_EFL_TIZEN_VIDEO_ENCODE_ACCELERATOR_TIZEN_H_ diff --git a/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_efl.h b/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_efl.h deleted file mode 100644 index cdd423f..0000000 --- a/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_efl.h +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// IPC messages for efl media player. -// Multiply-included message file, hence no include guard. - -#include "content/common/content_export.h" -#include "content/common/media/efl/media_player_messages_enums_efl.h" -#include "ipc/ipc_message_macros.h" -#include "media/base/efl/demuxer_stream_player_params_efl.h" -#include "media/base/efl/media_player_manager_efl.h" -#include "media/base/media_keys.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" -#include "ui/gfx/geometry/rect_f.h" - -#undef IPC_MESSAGE_EXPORT -#define IPC_MESSAGE_EXPORT CONTENT_EXPORT -#define IPC_MESSAGE_START MediaPlayerMsgStart - -IPC_ENUM_TRAITS(media::AudioCodec) -IPC_ENUM_TRAITS(blink::WebMediaPlayer::ReadyState) -IPC_ENUM_TRAITS(blink::WebMediaPlayer::NetworkState) -IPC_ENUM_TRAITS(media::DemuxerStream::Status) -IPC_ENUM_TRAITS(media::DemuxerStream::Type) -IPC_ENUM_TRAITS(media::VideoCodec) -IPC_ENUM_TRAITS(MediaPlayerHostMsg_Initialize_Type) - -IPC_STRUCT_TRAITS_BEGIN(media::DemuxerConfigs) - IPC_STRUCT_TRAITS_MEMBER(audio_codec) - IPC_STRUCT_TRAITS_MEMBER(audio_channels) - IPC_STRUCT_TRAITS_MEMBER(audio_sampling_rate) - IPC_STRUCT_TRAITS_MEMBER(is_audio_encrypted) - IPC_STRUCT_TRAITS_MEMBER(audio_extra_data) - - IPC_STRUCT_TRAITS_MEMBER(video_codec) - IPC_STRUCT_TRAITS_MEMBER(video_size) - IPC_STRUCT_TRAITS_MEMBER(is_video_encrypted) - IPC_STRUCT_TRAITS_MEMBER(video_extra_data) - - IPC_STRUCT_TRAITS_MEMBER(duration_ms) -IPC_STRUCT_TRAITS_END() - -IPC_STRUCT_TRAITS_BEGIN(media::DemuxedBufferMetaData) - IPC_STRUCT_TRAITS_MEMBER(size) - IPC_STRUCT_TRAITS_MEMBER(end_of_stream) - IPC_STRUCT_TRAITS_MEMBER(timestamp) - IPC_STRUCT_TRAITS_MEMBER(time_duration) - IPC_STRUCT_TRAITS_MEMBER(type) - IPC_STRUCT_TRAITS_MEMBER(status) -IPC_STRUCT_TRAITS_END() - -IPC_STRUCT_TRAITS_BEGIN(media::MediaPlayerEfl::TimeRanges) - IPC_STRUCT_TRAITS_MEMBER(start) - IPC_STRUCT_TRAITS_MEMBER(end) -IPC_STRUCT_TRAITS_END() - -#if defined(TIZEN_TBM_SUPPORT) -IPC_STRUCT_TRAITS_BEGIN(gfx::TbmBufferHandle) - IPC_STRUCT_TRAITS_MEMBER(tbm_surface) - IPC_STRUCT_TRAITS_MEMBER(media_packet) -IPC_STRUCT_TRAITS_END() -#endif - -// Initialize Efl player. -IPC_MESSAGE_ROUTED5(MediaPlayerEflHostMsg_Init, - int /* player_id */, - MediaPlayerHostMsg_Initialize_Type /* type */, - GURL /* URL */, - double /* volume */, - int /* demuxer client id */) - -// Deinitialize Gst player. -IPC_MESSAGE_ROUTED1(MediaPlayerEflHostMsg_DeInit, - int /* player_id */) - -// Start playback. -IPC_MESSAGE_ROUTED1(MediaPlayerEflHostMsg_Play, - int /* player_id */) - -// Pause playback. -IPC_MESSAGE_ROUTED1(MediaPlayerEflHostMsg_Pause, - int /* player_id */) - -// Set volume. -IPC_MESSAGE_ROUTED2(MediaPlayerEflHostMsg_SetVolume, - int /* player_id */, - double /* volume */) - -// Set playback rate. -IPC_MESSAGE_ROUTED2(MediaPlayerEflHostMsg_SetRate, - int /* player_id */, - double /* rate */) - -// Playback duration. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_DurationChanged, - int /* player_id */, - double /* time */) - -// Current duration. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_TimeUpdate, - int /* player_id */, - double /* time */) - -// Pause state. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_PauseStateChanged, - int /* player_id */, - bool /* state */) - -// Seek state. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_OnSeekStateChange, - int /* player_id */, - bool /* state */) - -// Current buffer range. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_BufferUpdate, - int /* player_id */, - std::vector /*buffer_range*/) - -// Playback completed. -IPC_MESSAGE_ROUTED1(MediaPlayerEflMsg_TimeChanged, - int /* player_id */) - -// Ready state change. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_ReadyStateChange, - int /* player_id */, - blink::WebMediaPlayer::ReadyState /* state */) - -// Network state change. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_NetworkStateChange, - int /* player_id */, - blink::WebMediaPlayer::NetworkState /* state */) - -// Gst media data has changed. -IPC_MESSAGE_ROUTED4(MediaPlayerEflMsg_MediaDataChanged, - int /* player_id */, - int /* width */, - int /* height */, - int /* media */) - -// On new frame available. -IPC_MESSAGE_ROUTED4(MediaPlayerEflMsg_NewFrameAvailable, - int /* player_id */, - base::SharedMemoryHandle /* Handle */, - uint32_t /* length */, - base::TimeDelta /* time stamp */) - -#if defined(TIZEN_TBM_SUPPORT) -IPC_MESSAGE_ROUTED3(MediaPlayerEflMsg_NewTbmBufferAvailable, - int /* player_id */, - gfx::TbmBufferHandle /* Handle */, - base::TimeDelta /* time stamp */) - -// Requests to release tbm buffer. -IPC_MESSAGE_CONTROL1(MediaPlayerEflHostMsg_ReleaseTbmBuffer, - gfx::TbmBufferHandle /* Handle */) -#endif - -// Seek. -IPC_MESSAGE_ROUTED2(MediaPlayerEflHostMsg_Seek, - int /* player_id */, - double /* time */) - -// For MSE internal seek request. -IPC_MESSAGE_ROUTED2(MediaPlayerEflMsg_SeekRequest, - int /* player_id */, - double /* time_to_seek */) - -// Sent after the renderer demuxer has seeked. -IPC_MESSAGE_CONTROL2(MediaPlayerEflHostMsg_DemuxerSeekDone, - int /* demuxer_client_id */, - base::TimeDelta /* actual_browser_seek_time */) - -// Inform the media source player that the demuxer is ready. -IPC_MESSAGE_CONTROL2(MediaPlayerEflHostMsg_DemuxerReady, - int /* demuxer_client_id */, - media::DemuxerConfigs /* configs */) - -// Sent when the data was read from the ChunkDemuxer. -IPC_MESSAGE_CONTROL3(MediaPlayerEflHostMsg_ReadFromDemuxerAck, - int /* demuxer_client_id */, - base::SharedMemoryHandle /* Handle */, - media::DemuxedBufferMetaData /* meta data of buffer*/) - -// Inform the media source player of changed media duration from demuxer. -IPC_MESSAGE_CONTROL2(MediaPlayerEflHostMsg_DurationChanged, - int /* demuxer_client_id */, - base::TimeDelta /* duration */) - -// The media source player reads data from demuxer -IPC_MESSAGE_CONTROL2(MediaPlayerEflMsg_ReadFromDemuxer, - int /* demuxer_client_id */, - media::DemuxerStream::Type /* type */) - -// Requests renderer demuxer seek. -IPC_MESSAGE_CONTROL2(MediaPlayerEflMsg_DemuxerSeekRequest, - int /* demuxer_client_id */, - base::TimeDelta /* time_to_seek */) diff --git a/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_enums_efl.h b/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_enums_efl.h deleted file mode 100644 index efb7701..0000000 --- a/tizen_src/chromium_impl/content/common/media/efl/media_player_messages_enums_efl.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_COMMON_MEDIA_MEDIA_PLAYER_MESSAGES_ENUMS_EFL_H_ -#define CONTENT_COMMON_MEDIA_MEDIA_PLAYER_MESSAGES_ENUMS_EFL_H_ - -// Dictates which type of media playback is being initialized. -enum MediaPlayerHostMsg_Initialize_Type { - MEDIA_PLAYER_TYPE_URL, - MEDIA_PLAYER_TYPE_MEDIA_SOURCE, -}; - -#endif // CONTENT_COMMON_MEDIA_MEDIA_PLAYER_MESSAGES_ENUMS_EFL_H_ diff --git a/tizen_src/chromium_impl/content/common/message_generator_efl.h b/tizen_src/chromium_impl/content/common/message_generator_efl.h index d2d49c0..02ca346 100644 --- a/tizen_src/chromium_impl/content/common/message_generator_efl.h +++ b/tizen_src/chromium_impl/content/common/message_generator_efl.h @@ -9,7 +9,3 @@ #if BUILDFLAG(IS_TIZEN) #include "content/common/tts_messages_efl.h" #endif - -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -#include "content/common/media/efl/media_player_messages_efl.h" -#endif diff --git a/tizen_src/chromium_impl/content/common/render_messages_efl.h b/tizen_src/chromium_impl/content/common/render_messages_efl.h index 5a4ae3b..166cb1a 100644 --- a/tizen_src/chromium_impl/content/common/render_messages_efl.h +++ b/tizen_src/chromium_impl/content/common/render_messages_efl.h @@ -10,11 +10,6 @@ #include "content/public/common/common_param_traits.h" #include "ui/gfx/ipc/gfx_param_traits.h" -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -#include "base/file_descriptor_posix.h" -#include "base/memory/shared_memory.h" -#endif - //----------------------------------------------------------------------------- // RenderView messages // These are messages sent from the browser to the renderer process. @@ -24,11 +19,3 @@ // so using same message class for these messages. // but actual messages are different so they shouldn't mess with chrome messages #define IPC_MESSAGE_START ChromeMsgStart - -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -// This message runs audio decoding for webaudio. -IPC_MESSAGE_CONTROL3(EflViewHostMsg_WebAudioDecode, - base::SharedMemoryHandle /* encoded_data_handle */, - base::FileDescriptor /* pcm_output */, - uint32_t /* data_size*/) -#endif diff --git a/tizen_src/chromium_impl/content/content_efl.gni b/tizen_src/chromium_impl/content/content_efl.gni index 8b7a5f2..f1e187a 100644 --- a/tizen_src/chromium_impl/content/content_efl.gni +++ b/tizen_src/chromium_impl/content/content_efl.gni @@ -94,14 +94,3 @@ if (!use_wayland) { external_content_shell_configs += [ "//tizen_src/build:ecore-wayland" ] external_content_shell_configs += [ "//tizen_src/build:libecore-wayland" ] } - -if (tizen_multimedia_support) { - external_content_browser_configs += [ - "//tizen_src/build:capi-media-player", - "//tizen_src/build:libcapi-media-player", - "//tizen_src/build:capi-media-tool", - "//tizen_src/build:libcapi-media-tool", - ] - external_content_common_configs += [ "//tizen_src/build:gstreamer" ] - external_content_common_configs += [ "//tizen_src/build:libgstreamer" ] -} diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/audio_decoder_efl.h b/tizen_src/chromium_impl/content/renderer/media/efl/audio_decoder_efl.h deleted file mode 100644 index c21305f..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/audio_decoder_efl.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_EFL_AUDIO_DECODER_EFL_H_ -#define CONTENT_RENDERER_MEDIA_EFL_AUDIO_DECODER_EFL_H_ - -#include "content/child/thread_safe_sender.h" - -namespace blink { -class WebAudioBus; -} - -namespace content { - -bool DecodeAudioFileData(blink::WebAudioBus* destination_bus, - const char* data, - size_t data_size, - scoped_refptr sender); - -} // namespace content -#endif // CONTENT_RENDERER_MEDIA_EFL_AUDIO_DECODER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.cc b/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.cc deleted file mode 100644 index 61377ed..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.cc +++ /dev/null @@ -1,513 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/efl/media_source_delegate_efl.h" - -#include "base/process/process.h" -#include "media/base/bind_to_current_loop.h" -#include "media/base/efl/demuxer_stream_player_params_efl.h" -#include "media/base/media_log.h" -#include "media/blink/webmediaplayer_util.h" -#include "media/blink/webmediasource_impl.h" -#include "media/filters/chunk_demuxer.h" -#include "media/filters/decrypting_demuxer_stream.h" -#include "third_party/blink/public/web/WebRuntimeFeatures.h" - -namespace content { - -MediaSourceDelegateEfl::MediaSourceDelegateEfl( - RendererDemuxerEfl* demuxer_client, - int demuxer_client_id, - const scoped_refptr& media_task_runner, - media::MediaLog* media_log) - : main_loop_(base::ThreadTaskRunnerHandle::Get()), - main_weak_factory_(this), - main_weak_this_(main_weak_factory_.GetWeakPtr()), - media_task_runner_(media_task_runner), - media_weak_factory_(this), - demuxer_client_(demuxer_client), - demuxer_client_id_(demuxer_client_id), - media_log_(media_log), - audio_stream_(NULL), - video_stream_(NULL), - seek_time_(media::kNoTimestamp()), - pending_seek_(false), - is_seeking_(false), - seeking_pending_seek_(false), - is_demuxer_seek_done_(false), - pending_seek_time_(media::kNoTimestamp()), - is_audio_read_fired_(false), - is_video_read_fired_(false), - is_demuxer_ready_(false) { - DCHECK(!chunk_demuxer_); -} - -MediaSourceDelegateEfl::~MediaSourceDelegateEfl() { - DCHECK(main_loop_->BelongsToCurrentThread()); - DCHECK(!chunk_demuxer_); - DCHECK(!audio_stream_); - DCHECK(!video_stream_); - DCHECK(!audio_decrypting_demuxer_stream_); - DCHECK(!video_decrypting_demuxer_stream_); -} - -void MediaSourceDelegateEfl::InitializeMediaSource( - const MediaSourceOpenedCB& media_source_opened_cb, - const media::Demuxer::EncryptedMediaInitDataCB& emedia_init_data_cb, - const media::SetCdmReadyCB& set_cdm_ready_cb, - const UpdateNetworkStateCB& update_network_state_cb, - const DurationChangeCB& duration_change_cb, - const base::Closure& waiting_for_decryption_key_cb) { - DCHECK(main_loop_->BelongsToCurrentThread()); - DCHECK(!media_source_opened_cb.is_null()); - media_source_opened_cb_ = media_source_opened_cb; - emedia_init_data_cb_ = emedia_init_data_cb; - set_cdm_ready_cb_ = set_cdm_ready_cb; - update_network_state_cb_ = media::BindToCurrentLoop(update_network_state_cb); - duration_change_cb_ = duration_change_cb; - waiting_for_decryption_key_cb_ = - media::BindToCurrentLoop(waiting_for_decryption_key_cb); - - chunk_demuxer_.reset(new media::ChunkDemuxer( - media::BindToCurrentLoop(base::BindOnce( - &MediaSourceDelegateEfl::OnDemuxerOpened, main_weak_this_)), - media::BindToCurrentLoop(base::BindOnce( - &MediaSourceDelegateEfl::OnEncryptedMediaInitData, main_weak_this_)), - media_log_, false)); - - media_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourceDelegateEfl::InitializeDemuxer, - base::Unretained(this))); -} - -void MediaSourceDelegateEfl::OnBufferedTimeRangesChanged( - const media::Ranges& ranges) { - buffered_time_ranges_ = ranges; -} - -blink::WebTimeRanges MediaSourceDelegateEfl::Buffered() const { - return media::ConvertToWebTimeRanges(buffered_time_ranges_); -} - -void MediaSourceDelegateEfl::InitializeDemuxer() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - demuxer_client_->AddDelegate(demuxer_client_id_, this); - chunk_demuxer_->Initialize( - this, - base::BindOnce(&MediaSourceDelegateEfl::OnDemuxerInitDone, - media_weak_factory_.GetWeakPtr()), - false); -} - -void MediaSourceDelegateEfl::OnEncryptedMediaInitData ( - media::EmeInitDataType init_data_type, - const std::vector& init_data) { - DCHECK(main_loop_->BelongsToCurrentThread()); - if (emedia_init_data_cb_.is_null()) { - return; - } - emedia_init_data_cb_.Run(init_data_type, init_data); -} - -void MediaSourceDelegateEfl::OnDemuxerOpened() { - DCHECK(main_loop_->BelongsToCurrentThread()); - if (media_source_opened_cb_.is_null()) - return; - media_source_opened_cb_.Run(new media::WebMediaSourceImpl( - chunk_demuxer_.get(), media_log_)); -} - -void MediaSourceDelegateEfl::OnDemuxerError( - media::PipelineStatus status) { - if (status != media::PIPELINE_OK && !update_network_state_cb_.is_null()) - update_network_state_cb_.Run(PipelineErrorToNetworkState(status)); -} - -void MediaSourceDelegateEfl::AddTextStream( - media::DemuxerStream* /* text_stream */ , - const media::TextTrackConfig& /* config */ ) { - NOTIMPLEMENTED(); -} - -void MediaSourceDelegateEfl::RemoveTextStream( - media::DemuxerStream* /* text_stream */ ) { - NOTIMPLEMENTED(); -} - -bool MediaSourceDelegateEfl::CanNotifyDemuxerReady() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - return is_demuxer_ready_; -} - -void MediaSourceDelegateEfl::OnDemuxerInitDone( - media::PipelineStatus status) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(chunk_demuxer_); - if (status != media::PIPELINE_OK) { - OnDemuxerError(status); - return; - } - audio_stream_ = chunk_demuxer_->GetStream(media::DemuxerStream::AUDIO); - video_stream_ = chunk_demuxer_->GetStream(media::DemuxerStream::VIDEO); - if (audio_stream_ && audio_stream_->audio_decoder_config().is_encrypted() && - !set_cdm_ready_cb_.is_null()) { - InitAudioDecryptingDemuxerStream(); - return; - } - if (video_stream_ && video_stream_->video_decoder_config().is_encrypted() && - !set_cdm_ready_cb_.is_null()) { - InitVideoDecryptingDemuxerStream(); - return; - } - // Notify demuxer ready when both streams are not encrypted. - is_demuxer_ready_ = true; - NotifyDemuxerReady(); -} - -void MediaSourceDelegateEfl::InitAudioDecryptingDemuxerStream() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - audio_decrypting_demuxer_stream_.reset(new media::DecryptingDemuxerStream( - media_task_runner_, media_log_, waiting_for_decryption_key_cb_)); - - audio_decrypting_demuxer_stream_->Initialize( - audio_stream_, set_cdm_ready_cb_, - base::BindOnce( - &MediaSourceDelegateEfl::OnAudioDecryptingDemuxerStreamInitDone, - media_weak_factory_.GetWeakPtr())); -} - -void MediaSourceDelegateEfl::InitVideoDecryptingDemuxerStream() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - - video_decrypting_demuxer_stream_.reset(new media::DecryptingDemuxerStream( - media_task_runner_, media_log_, waiting_for_decryption_key_cb_)); - - video_decrypting_demuxer_stream_->Initialize( - video_stream_, set_cdm_ready_cb_, - base::BindOnce( - &MediaSourceDelegateEfl::OnVideoDecryptingDemuxerStreamInitDone, - media_weak_factory_.GetWeakPtr())); -} - - -void MediaSourceDelegateEfl::OnAudioDecryptingDemuxerStreamInitDone( - media::PipelineStatus status) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(chunk_demuxer_); - - if (status != media::PIPELINE_OK) - audio_decrypting_demuxer_stream_.reset(); - else - audio_stream_ = audio_decrypting_demuxer_stream_.get(); - - if (video_stream_ && video_stream_->video_decoder_config().is_encrypted()) { - InitVideoDecryptingDemuxerStream(); - return; - } - - // Try to notify demuxer ready when audio DDS initialization finished and - // video is not encrypted. - is_demuxer_ready_ = true; - NotifyDemuxerReady(); -} - -void MediaSourceDelegateEfl::OnVideoDecryptingDemuxerStreamInitDone( - media::PipelineStatus status) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(chunk_demuxer_); - - if (status != media::PIPELINE_OK) - video_decrypting_demuxer_stream_.reset(); - else - video_stream_ = video_decrypting_demuxer_stream_.get(); - - // Try to notify demuxer ready when video DDS initialization finished. - is_demuxer_ready_ = true; - NotifyDemuxerReady(); -} - -void MediaSourceDelegateEfl::NotifyDemuxerReady() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(is_demuxer_ready_); - if (!demuxer_client_ || (!audio_stream_ && !video_stream_)) { - OnDemuxerError(media::PIPELINE_ERROR_INITIALIZATION_FAILED); - return; - } - scoped_ptr configs(new media::DemuxerConfigs()); - if (audio_stream_) { - media::AudioDecoderConfig audio_config = - audio_stream_->audio_decoder_config(); - configs->audio_codec = audio_config.codec(); - configs->audio_channels = - media::ChannelLayoutToChannelCount(audio_config.channel_layout()); - configs->audio_sampling_rate = audio_config.samples_per_second(); - configs->is_audio_encrypted = audio_config.is_encrypted(); - configs->audio_extra_data = audio_config.extra_data(); - } - if (video_stream_) { - media::VideoDecoderConfig video_config = - video_stream_->video_decoder_config(); - configs->video_codec = video_config.codec(); - configs->video_size = video_config.natural_size(); - configs->is_video_encrypted = video_config.is_encrypted(); - configs->video_extra_data = video_config.extra_data(); - } - demuxer_client_->DemuxerReady(demuxer_client_id_, *configs); -} - -void MediaSourceDelegateEfl::OnReadFromDemuxer( - media::DemuxerStream::Type type) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - - if (is_seeking_) - return; - - if ((type == media::DemuxerStream::AUDIO) && audio_stream_ - && !is_audio_read_fired_) { - is_audio_read_fired_ = true; - audio_stream_->Read(base::BindOnce(&MediaSourceDelegateEfl::OnBufferReady, - media_weak_factory_.GetWeakPtr(), type)); - } - - if ((type == media::DemuxerStream::VIDEO) && video_stream_ - && !is_video_read_fired_) { - is_video_read_fired_ = true; - video_stream_->Read(base::BindOnce(&MediaSourceDelegateEfl::OnBufferReady, - media_weak_factory_.GetWeakPtr(), type)); - } -} - -void MediaSourceDelegateEfl::Stop(const base::Closure& stop_cb) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - if (!chunk_demuxer_) { - DCHECK(!demuxer_client_); - return; - } - - duration_change_cb_.Reset(); - update_network_state_cb_.Reset(); - media_source_opened_cb_.Reset(); - - main_weak_factory_.InvalidateWeakPtrs(); - DCHECK(!main_weak_factory_.HasWeakPtrs()); - - // 1. shutdown demuxer. - // 2. On media thread, call stop demuxer. - chunk_demuxer_->Shutdown(); - media_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourceDelegateEfl::StopDemuxer, - base::Unretained(this), stop_cb)); -} - -void MediaSourceDelegateEfl::StopDemuxer(const base::Closure& stop_cb) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(chunk_demuxer_); - - demuxer_client_->RemoveDelegate(demuxer_client_id_); - demuxer_client_ = NULL; - audio_stream_ = NULL; - video_stream_ = NULL; - audio_decrypting_demuxer_stream_.reset(); - video_decrypting_demuxer_stream_.reset(); - - media_weak_factory_.InvalidateWeakPtrs(); - DCHECK(!media_weak_factory_.HasWeakPtrs()); - - chunk_demuxer_->Stop(); - chunk_demuxer_.reset(); - - stop_cb.Run(); -} - -void MediaSourceDelegateEfl::SeekInternal( - const base::TimeDelta& seek_time) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - chunk_demuxer_->Seek( - seek_time, base::BindOnce(&MediaSourceDelegateEfl::OnDemuxerSeekDone, - media_weak_factory_.GetWeakPtr())); -} - -void MediaSourceDelegateEfl::OnBufferReady( - media::DemuxerStream::Type type, - media::DemuxerStream::Status status, - const scoped_refptr& buffer) { - uint32_t shared_memory_size = -1; - base::SharedMemory shared_memory; - base::SharedMemoryHandle foreign_memory_handle; - - scoped_ptr meta_data( - new media::DemuxedBufferMetaData()); - meta_data->status = status; - meta_data->type = type; - - if (type == media::DemuxerStream::AUDIO) - is_audio_read_fired_ = false; - if (type == media::DemuxerStream::VIDEO) - is_video_read_fired_ = false; - - switch (status) { - case media::DemuxerStream::kAborted: - LOG (ERROR) << "[RENDER] : DemuxerStream::kAborted"; - break; - - case media::DemuxerStream::kConfigChanged: - NotifyDemuxerReady(); - break; - - case media::DemuxerStream::kOk: - if (buffer.get()->end_of_stream()) { - meta_data->end_of_stream = true; - break; - } - shared_memory_size = buffer.get()->data_size(); - if (!shared_memory.CreateAndMapAnonymous(shared_memory_size)) { - LOG (ERROR) << "Shared Memory creation failed."; - return; - } - if (!shared_memory.ShareToProcess(base::Process::Current().Handle(), - &foreign_memory_handle)) { - LOG (ERROR) << "Shared Memory handle could not be obtained"; - return; - } - memcpy(shared_memory.memory(), (void*)buffer.get()->writable_data(), - shared_memory_size); - meta_data->timestamp = buffer.get()->timestamp(); - meta_data->time_duration = buffer.get()->duration(); - meta_data->size = shared_memory_size; - break; - default: - NOTREACHED(); - } - - if (demuxer_client_) - demuxer_client_->ReadFromDemuxerAck(demuxer_client_id_, - foreign_memory_handle, - *meta_data); -} - -void MediaSourceDelegateEfl::StartWaitingForSeek( - const base::TimeDelta& seek_time) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - if (!chunk_demuxer_) - return; - - // Called from |webmediaplayerefl| only. - is_demuxer_seek_done_ = false; - seeking_pending_seek_ = false; - is_seeking_ = true; - chunk_demuxer_->StartWaitingForSeek(seek_time); -} - -void MediaSourceDelegateEfl::CancelPendingSeek( - const base::TimeDelta& seek_time) { - DCHECK(main_loop_->BelongsToCurrentThread()); - if (!chunk_demuxer_) - return; - is_seeking_ = true; - pending_seek_ = true; - pending_seek_time_ = seek_time; - - if (is_demuxer_seek_done_) { - // Since we already requested gstreamer to seek. And there are no pending - // seeks in |chunk_demuxer|. Cancelling pending seek makes no sense. - // - // This block will handle when |gstreamer| is seeking and new seek came in - // between. - is_demuxer_seek_done_ = false; - pending_seek_ = false; - chunk_demuxer_->StartWaitingForSeek(seek_time); - StartSeek(seek_time, true); - return; - } - - chunk_demuxer_->CancelPendingSeek(seek_time); -} - -void MediaSourceDelegateEfl::StartSeek( - const base::TimeDelta& seek_time, - bool is_seeking_pending_seek) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - - if (!chunk_demuxer_) - return; - - is_seeking_ = true; - is_demuxer_seek_done_ = false; - if (is_seeking_pending_seek) - seeking_pending_seek_ = is_seeking_pending_seek; - else if (seeking_pending_seek_) - return; - - seek_time_ = seek_time; - SeekInternal(seek_time); -} - -void MediaSourceDelegateEfl::OnDemuxerSeekDone( - media::PipelineStatus status) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - if (status != media::PIPELINE_OK) { - OnDemuxerError(status); - return; - } - if (pending_seek_) { - pending_seek_ = false; - StartSeek(pending_seek_time_, true); - seek_time_ = pending_seek_time_; - } else { - seeking_pending_seek_ = false; - is_seeking_ = false; - is_demuxer_seek_done_ = true; - ResetAudioDecryptingDemuxerStream(); - } -} - -void MediaSourceDelegateEfl::ResetAudioDecryptingDemuxerStream() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - if (audio_decrypting_demuxer_stream_) { - audio_decrypting_demuxer_stream_->Reset(base::BindOnce( - &MediaSourceDelegateEfl::ResetVideoDecryptingDemuxerStream, - media_weak_factory_.GetWeakPtr())); - return; - } - ResetVideoDecryptingDemuxerStream(); -} - -void MediaSourceDelegateEfl::ResetVideoDecryptingDemuxerStream() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - if (video_decrypting_demuxer_stream_) { - video_decrypting_demuxer_stream_->Reset(base::BindOnce( - &MediaSourceDelegateEfl::FinishResettingDecryptingDemuxerStreams, - media_weak_factory_.GetWeakPtr())); - return; - } - FinishResettingDecryptingDemuxerStreams(); -} - -void MediaSourceDelegateEfl::FinishResettingDecryptingDemuxerStreams() { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - DCHECK(is_seeking_); - is_seeking_ = false; - demuxer_client_->DemuxerSeekDone(demuxer_client_id_, seek_time_); -} - -void MediaSourceDelegateEfl::SetDuration(base::TimeDelta duration) { - DCHECK(main_loop_->BelongsToCurrentThread()); - main_loop_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourceDelegateEfl::OnDurationChanged, - main_weak_this_, duration)); -} - -void MediaSourceDelegateEfl::OnDurationChanged( - const base::TimeDelta& duration) { - DCHECK(main_loop_->BelongsToCurrentThread()); - if (demuxer_client_) - demuxer_client_->DurationChanged(demuxer_client_id_, duration); - - if (!duration_change_cb_.is_null()) - duration_change_cb_.Run(duration.InSecondsF()); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.h b/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.h deleted file mode 100644 index f6f69d3..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/media_source_delegate_efl.h +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_EFL_MEDIA_SOURCE_DELEGATE_EFL_H_ -#define CONTENT_RENDERER_MEDIA_EFL_MEDIA_SOURCE_DELEGATE_EFL_H_ - -#include "content/renderer/media/efl/renderer_demuxer_efl.h" -#include "media/base/decoder_buffer.h" -#include "media/base/demuxer_stream.h" -#include "media/base/media_keys.h" -#include "media/filters/chunk_demuxer.h" -#include "media/filters/decrypting_demuxer_stream.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" - -namespace content { - -class MediaSourceDelegateEfl - : public media::DemuxerHost { - public: - typedef base::OnceCallback MediaSourceOpenedCB; - typedef base::OnceCallback - UpdateNetworkStateCB; - typedef base::OnceCallback DurationChangeCB; - - MediaSourceDelegateEfl( - RendererDemuxerEfl* demuxer_client, - int demuxer_client_id, - const scoped_refptr& media_task_runner, - media::MediaLog* media_log); - ~MediaSourceDelegateEfl(); - - //DemuxerHost implementation. - void OnBufferedTimeRangesChanged( - const media::Ranges& ranges) override; - - // Sets the duration of the media in microseconds. - // Duration may be kInfiniteDuration() if the duration is not known. - void SetDuration(base::TimeDelta duration) override; - - // Stops execution of the pipeline due to a fatal error. Do not call this - // method with PIPELINE_OK. - void OnDemuxerError(media::PipelineStatus error) override; - - // Add |text_stream| to the collection managed by the text renderer. - void AddTextStream( - media::DemuxerStream* text_stream, - const media::TextTrackConfig& config) override; - - // Remove |text_stream| from the presentation. - void RemoveTextStream(media::DemuxerStream* text_stream) override; - - void InitializeMediaSource( - const MediaSourceOpenedCB& media_source_opened_cb, - const media::Demuxer::EncryptedMediaInitDataCB& emedia_init_data_cb, - const media::SetCdmReadyCB& set_cdm_ready_cb, - const UpdateNetworkStateCB& update_network_state_cb, - const DurationChangeCB& duration_change_cb, - const base::Closure& waiting_for_decryption_key_cb); - - blink::WebTimeRanges Buffered() const; - - // Called when DemuxerStreamPlayer needs to read data from ChunkDemuxer. - void OnReadFromDemuxer(media::DemuxerStream::Type type); - - // Must be called explicitly before |this| can be destroyed. - void Stop(const base::Closure& stop_cb); - - // In MSE case, calls ChunkDemuxer::StartWaitingForSeek(), sets the - // expectation that a regular seek will be arriving. - void StartWaitingForSeek(const base::TimeDelta& seek_time); - - // Calls ChunkDemuxer::CancelPendingSeek(). Also sets the - // expectation that a regular seek will be arriving. - void CancelPendingSeek(const base::TimeDelta& seek_time); - - // Sets the expectation that a regular seek will be arriving. - void StartSeek( - const base::TimeDelta& seek_time, - bool is_seeking_pending_seek); - - // Callback for ChunkDemuxer::Seek(). - void OnDemuxerSeekDone(media::PipelineStatus status); - - private: - void OnEncryptedMediaInitData(media::EmeInitDataType init_data_type, - const std::vector& init_data); - void OnDemuxerOpened(); - void InitializeDemuxer(); - void OnDemuxerInitDone(media::PipelineStatus status); - // Stops and clears objects on the media thread. - void StopDemuxer(const base::Closure& stop_cb); - bool CanNotifyDemuxerReady(); - void NotifyDemuxerReady(); - void OnDurationChanged(const base::TimeDelta& duration); - void OnBufferReady( - media::DemuxerStream::Type type, - media::DemuxerStream::Status status, - const scoped_refptr& buffer); - void SeekInternal(const base::TimeDelta& seek_time); - - // Initializes DecryptingDemuxerStreams if audio/video stream is encrypted. - void InitAudioDecryptingDemuxerStream(); - void InitVideoDecryptingDemuxerStream(); - - // Callbacks for DecryptingDemuxerStream::Initialize(). - void OnAudioDecryptingDemuxerStreamInitDone(media::PipelineStatus status); - void OnVideoDecryptingDemuxerStreamInitDone(media::PipelineStatus status); - - // Runs on the media thread. - void ResetAudioDecryptingDemuxerStream(); - void ResetVideoDecryptingDemuxerStream(); - void FinishResettingDecryptingDemuxerStreams(); - - // Message loop for main renderer thread and corresponding weak pointer. - const scoped_refptr main_loop_; - base::WeakPtrFactory main_weak_factory_; - base::WeakPtr main_weak_this_; - - // Message loop for media thread and corresponding weak pointer. - const scoped_refptr media_task_runner_; - base::WeakPtrFactory media_weak_factory_; - RendererDemuxerEfl* demuxer_client_; - int demuxer_client_id_; - scoped_refptr media_log_; - - MediaSourceOpenedCB media_source_opened_cb_; - UpdateNetworkStateCB update_network_state_cb_; - DurationChangeCB duration_change_cb_; - base::Closure waiting_for_decryption_key_cb_; - - scoped_ptr chunk_demuxer_; - media::DemuxerStream* audio_stream_; - media::DemuxerStream* video_stream_; - media::Ranges buffered_time_ranges_; - - media::SetCdmReadyCB set_cdm_ready_cb_; - media::Demuxer::EncryptedMediaInitDataCB emedia_init_data_cb_; - scoped_ptr audio_decrypting_demuxer_stream_; - scoped_ptr video_decrypting_demuxer_stream_; - - base::TimeDelta seek_time_; - bool pending_seek_; - bool is_seeking_; - - // Will handle internal seek coming from |MediaSourcePlayerGstreamer| - // if new seek has been fired by |HTMLMediaElement|. - // Always one should seek to latest time and ignore previous seeks. - bool seeking_pending_seek_; - - // Will handle |seek| request coming after |chunk_demuxer| - // has requested |gstreamer| to seek. - bool is_demuxer_seek_done_; - base::TimeDelta pending_seek_time_; - - bool is_audio_read_fired_; - bool is_video_read_fired_; - - bool is_demuxer_ready_; -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_EFL_MEDIA_SOURCE_DELEGATE_EFL_H_ diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.cc b/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.cc deleted file mode 100644 index c305830..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.cc +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/efl/renderer_demuxer_efl.h" - -#include "base/bind.h" -#include "base/message_loop/message_loop.h" -#include "content/child/thread_safe_sender.h" -#include "content/common/media/efl/media_player_messages_efl.h" -#include "content/renderer/media/efl/media_source_delegate_efl.h" -#include "content/renderer/media/efl/renderer_media_player_manager_efl.h" -#include "content/renderer/render_thread_impl.h" - -namespace content { - -scoped_refptr CreateRendererDemuxerEfl() { - return new RendererDemuxerEfl(); -} - -RendererDemuxerEfl::RendererDemuxerEfl() - : thread_safe_sender_(RenderThreadImpl::current()->thread_safe_sender()), - media_task_runner_( - RenderThreadImpl::current()->GetMediaThreadTaskRunner()) {} - -RendererDemuxerEfl::~RendererDemuxerEfl() {} - -int RendererDemuxerEfl::GetNextDemuxerClientID() { - // Don't use zero for IDs since it can be interpreted as having no ID. - return next_demuxer_client_id_.GetNext() + 1; -} - -void RendererDemuxerEfl::AddDelegate( - int demuxer_client_id, - MediaSourceDelegateEfl* delegate) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - delegates_.AddWithID(delegate, demuxer_client_id); -} - -void RendererDemuxerEfl::RemoveDelegate(int demuxer_client_id) { - DCHECK(media_task_runner_->BelongsToCurrentThread()); - delegates_.Remove(demuxer_client_id); -} - -bool RendererDemuxerEfl::OnMessageReceived(const IPC::Message& message) { - switch (message.type()) { - case MediaPlayerEflMsg_ReadFromDemuxer::ID: - case MediaPlayerEflMsg_DemuxerSeekRequest::ID: - media_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&RendererDemuxerEfl::DispatchMessage, this, message)); - return true; - } - return false; -} - -void RendererDemuxerEfl::DemuxerReady( - int demuxer_client_id, - const media::DemuxerConfigs& configs) { - thread_safe_sender_->Send(new MediaPlayerEflHostMsg_DemuxerReady( - demuxer_client_id, configs)); -} - -void RendererDemuxerEfl::ReadFromDemuxerAck( - int demuxer_client_id, - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) { - thread_safe_sender_->Send(new MediaPlayerEflHostMsg_ReadFromDemuxerAck( - demuxer_client_id, foreign_memory_handle, meta_data)); -} - -void RendererDemuxerEfl::DemuxerSeekDone( - int demuxer_client_id, - const base::TimeDelta& actual_browser_seek_time) { - thread_safe_sender_->Send(new MediaPlayerEflHostMsg_DemuxerSeekDone( - demuxer_client_id, actual_browser_seek_time)); -} - -void RendererDemuxerEfl::DurationChanged(int demuxer_client_id, - const base::TimeDelta& duration) { - thread_safe_sender_->Send(new MediaPlayerEflHostMsg_DurationChanged( - demuxer_client_id, duration)); -} - -void RendererDemuxerEfl::DispatchMessage(const IPC::Message& message) { - IPC_BEGIN_MESSAGE_MAP(RendererDemuxerEfl, message) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_ReadFromDemuxer, OnReadFromDemuxer) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_DemuxerSeekRequest, - OnDemuxerSeekRequest) - IPC_END_MESSAGE_MAP() -} - -void RendererDemuxerEfl::OnReadFromDemuxer( - int demuxer_client_id, - media::DemuxerStream::Type type) { - MediaSourceDelegateEfl* delegate = delegates_.Lookup(demuxer_client_id); - if (delegate) - delegate->OnReadFromDemuxer(type); -} - -void RendererDemuxerEfl::OnDemuxerSeekRequest( - int demuxer_client_id, - const base::TimeDelta& time_to_seek) { - MediaSourceDelegateEfl* delegate = delegates_.Lookup(demuxer_client_id); - if (delegate) - delegate->StartSeek(time_to_seek, false); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.h b/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.h deleted file mode 100644 index 90b762b..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_demuxer_efl.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_EFL_RENDERER_DEMUXER_EFL_H_ -#define CONTENT_RENDERER_MEDIA_EFL_RENDERER_DEMUXER_EFL_H_ - -#include "base/atomic_sequence_num.h" -#include "base/id_map.h" -#include "base/memory/shared_memory.h" -#include "ipc/message_filter.h" -#include "media/base/efl/demuxer_stream_player_params_efl.h" - -namespace base { -class SingleThreadTaskRunner; -} - -namespace content { - -class MediaSourceDelegateEfl; -class ThreadSafeSender; - -// Represents the renderer process half of an IPC-based implementation of -// media::DemuxerEfl. -// -// Refer to BrowserDemuxerEfl for the browser process half. -class RendererDemuxerEfl : public IPC::MessageFilter { - public: - RendererDemuxerEfl(); - - RendererDemuxerEfl(const RendererDemuxerEfl&) = delete; - RendererDemuxerEfl& operator=(const RendererDemuxerEfl&) = delete; - - // Returns the next available demuxer client ID for use in IPC messages. - // - // Safe to call on any thread. - int GetNextDemuxerClientID(); - - // Associates |delegate| with |demuxer_client_id| for handling incoming IPC - // messages. - // - // Must be called on media thread. - void AddDelegate( - int demuxer_client_id, - MediaSourceDelegateEfl* delegate); - - // Removes the association created by AddDelegate(). - // - // Must be called on media thread. - void RemoveDelegate(int demuxer_client_id); - - // IPC::ChannelProxy::MessageFilter overrides. - bool OnMessageReceived(const IPC::Message& message) override; - - // media::DemuxerEflClient "implementation". - void DemuxerReady( - int demuxer_client_id, - const media::DemuxerConfigs& configs); - void ReadFromDemuxerAck( - int demuxer_client_id, - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data); - void DemuxerSeekDone( - int demuxer_client_id, - const base::TimeDelta& actual_browser_seek_time); - void DurationChanged(int demuxer_client_id, const base::TimeDelta& duration); - - protected: - friend class base::RefCountedThreadSafe; - ~RendererDemuxerEfl() override; - - private: - void DispatchMessage(const IPC::Message& message); - void OnReadFromDemuxer(int demuxer_client_id, - media::DemuxerStream::Type type); - void OnDemuxerSeekRequest(int demuxer_client_id, - const base::TimeDelta& time_to_seek); - - base::AtomicSequenceNumber next_demuxer_client_id_; - - IDMap delegates_; - scoped_refptr thread_safe_sender_; - scoped_refptr media_task_runner_; -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_EFL_RENDERER_DEMUXER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.cc b/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.cc deleted file mode 100644 index 8ff8263..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.cc +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/efl/renderer_media_player_manager_efl.h" - -#include "base/bind.h" -#include "base/message_loop/message_loop.h" -#include "content/common/media/efl/media_player_messages_efl.h" -#include "content/public/renderer/render_thread.h" -#include "content/renderer/media/efl/webmediaplayer_efl.h" -#include "media/base/bind_to_current_loop.h" - -namespace content { - -RendererMediaPlayerManager* CreateRendererMediaPlayerManager( - RenderFrame* render_frame) { - return new RendererMediaPlayerManager(render_frame); -} - -RendererMediaPlayerManager::RendererMediaPlayerManager( - RenderFrame* render_frame) - : RenderFrameObserver(render_frame), - next_media_player_id_(0) { -} - -RendererMediaPlayerManager::~RendererMediaPlayerManager() { - DCHECK(media_players_.empty()) - << "RendererMediaPlayerManager is owned by RenderFrameImpl and is " - "destroyed only after all media players are destroyed."; -} - -void RendererMediaPlayerManager::PausePlayingPlayers() { - for (auto player_it : media_players_) { - WebMediaPlayerEfl* player = player_it.second; - if (player && !player->paused() && player->hasVideo()) - player->RequestPause(); - } -} - -bool RendererMediaPlayerManager::OnMessageReceived( - const IPC::Message& message) { - bool handled = true; - IPC_BEGIN_MESSAGE_MAP(RendererMediaPlayerManager, message) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_MediaDataChanged, - OnMediaDataChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_DurationChanged, OnDurationChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_TimeUpdate, OnTimeUpdate) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_BufferUpdate, OnBufferUpdate) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_ReadyStateChange, - OnReadyStateChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_NetworkStateChange, - OnNetworkStateChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_TimeChanged, OnTimeChanged) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_PauseStateChanged, - OnPauseStateChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_OnSeekStateChange, - OnSeekStateChange) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_SeekRequest, OnRequestSeek) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_NewFrameAvailable, - OnNewFrameAvailable) -#if defined(TIZEN_TBM_SUPPORT) - IPC_MESSAGE_HANDLER(MediaPlayerEflMsg_NewTbmBufferAvailable, - OnNewTbmBufferAvailable) -#endif - IPC_MESSAGE_UNHANDLED(handled = false) - IPC_END_MESSAGE_MAP() - return handled; -} - -void RendererMediaPlayerManager::WasHidden() { - PausePlayingPlayers(); -} - -void RendererMediaPlayerManager::OnStop() { - PausePlayingPlayers(); -} - -void RendererMediaPlayerManager::Initialize( - int player_id, - MediaPlayerHostMsg_Initialize_Type type, - const GURL& url, - double volume, - int demuxer_client_id) { - Send(new MediaPlayerEflHostMsg_Init(routing_id(), player_id, type, - url, volume, demuxer_client_id)); -} - -void RendererMediaPlayerManager::OnMediaDataChange(int player_id, int width, - int height, int media) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnMediaDataChange(width, height, media); -} - -void RendererMediaPlayerManager::OnDurationChange( - int player_id, - double duration) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnDurationChange(duration); -} - -void RendererMediaPlayerManager::OnTimeUpdate( - int player_id, - double current_time) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnTimeUpdate(current_time); -} - -void RendererMediaPlayerManager::OnBufferUpdate( - int player_id, - std::vector buffer_range) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnBufferUpdate(buffer_range); -} - -void RendererMediaPlayerManager::OnReadyStateChange( - int player_id, - blink::WebMediaPlayer::ReadyState state) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->SetReadyState( - static_cast(state)); -} - -void RendererMediaPlayerManager::OnNetworkStateChange( - int player_id, - blink::WebMediaPlayer::NetworkState state) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->SetNetworkState( - static_cast(state)); -} - -void RendererMediaPlayerManager::OnTimeChanged(int player_id) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnTimeChanged(); -} - -void RendererMediaPlayerManager::OnSeekStateChange(int player_id, - bool state) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnSeekStateChange(state); -} - -void RendererMediaPlayerManager::OnPauseStateChange(int player_id, - bool state) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnPauseStateChange(state); -} - -void RendererMediaPlayerManager::OnRequestSeek(int player_id, - double seek_time) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnRequestSeek(seek_time); -} - -void RendererMediaPlayerManager::OnNewFrameAvailable( - int player_id, - base::SharedMemoryHandle foreign_memory_handle, - uint32_t length, base::TimeDelta timestamp) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - if (player) - player->OnNewFrameAvailable(foreign_memory_handle, length, timestamp); -} - -#if defined(TIZEN_TBM_SUPPORT) -void RendererMediaPlayerManager::OnNewTbmBufferAvailable( - int player_id, gfx::TbmBufferHandle tbm_handle, - base::TimeDelta timestamp) { - WebMediaPlayerEfl* player = GetMediaPlayer(player_id); - - if (player) - player->OnNewTbmBufferAvailable( - tbm_handle, timestamp, - media::BindToCurrentLoop( - base::BindOnce(&RendererMediaPlayerManager::OnTbmBufferRelease, - base::Unretained(this), tbm_handle))); -} - -void RendererMediaPlayerManager::OnTbmBufferRelease( - gfx::TbmBufferHandle tbm_handle) { - RenderThread::Get()->Send( - new MediaPlayerEflHostMsg_ReleaseTbmBuffer(tbm_handle)); -} -#endif - -WebMediaPlayerEfl* RendererMediaPlayerManager::GetMediaPlayer( - int player_id) { - std::map::iterator iter = - media_players_.find(player_id); - if (iter != media_players_.end()) - return iter->second; - return NULL; -} - -void RendererMediaPlayerManager::Play(int player_id) { - Send(new MediaPlayerEflHostMsg_Play(routing_id(), player_id)); -} - -void RendererMediaPlayerManager::Pause(int player_id, - bool is_media_related_action) { - Send(new MediaPlayerEflHostMsg_Pause(routing_id(), player_id)); -} - -void RendererMediaPlayerManager::Seek(int player_id, double time) { - Send(new MediaPlayerEflHostMsg_Seek(routing_id(), player_id, time)); -} - -void RendererMediaPlayerManager::SetVolume(int player_id, double volume) { - Send(new MediaPlayerEflHostMsg_SetVolume(routing_id(), player_id, volume)); -} - -void RendererMediaPlayerManager::SetRate(int player_id, double rate) { - Send(new MediaPlayerEflHostMsg_SetRate(routing_id(), player_id, rate)); -} - -void RendererMediaPlayerManager::DestroyPlayer(int player_id) { - Send(new MediaPlayerEflHostMsg_DeInit(routing_id(), player_id)); -} - -int RendererMediaPlayerManager::RegisterMediaPlayer( - WebMediaPlayerEfl* player) { - media_players_[next_media_player_id_] = player; - return next_media_player_id_++; -} - -void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) { - media_players_.erase(player_id); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.h b/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.h deleted file mode 100644 index a9f888b..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/renderer_media_player_manager_efl.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_EFL_RENDERER_MEDIA_PLAYER_MANAGER_EFL_H_ -#define CONTENT_RENDERER_MEDIA_EFL_RENDERER_MEDIA_PLAYER_MANAGER_EFL_H_ - -#include - -#include "base/memory/shared_memory.h" -#include "content/common/media/efl/media_player_messages_enums_efl.h" -#include "content/public/renderer/render_frame_observer.h" -#include "media/base/efl/media_player_efl.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" -#include "url/gurl.h" -#if defined(TIZEN_TBM_SUPPORT) -#include "ui/gfx/gpu_memory_buffer.h" -#endif - -namespace content { -class WebMediaPlayerEfl; - -class RendererMediaPlayerManager : public RenderFrameObserver { - public: - // Constructs a RendererMediaPlayerManager object for the |render_frame|. - explicit RendererMediaPlayerManager(RenderFrame* render_frame); - ~RendererMediaPlayerManager() override; - - RendererMediaPlayerManager(const RendererMediaPlayerManager&) = delete; - RendererMediaPlayerManager& operator=(const RendererMediaPlayerManager&) = - delete; - - // Initializes a MediaPlayerEfl object in browser process. - void Initialize(int player_id, MediaPlayerHostMsg_Initialize_Type type, - const GURL& url, double volume, int demuxer_client_id); - - // Starts the player. - void Play(int player_id); - - // Pauses the player. - // is_media_related_action should be true if this pause is coming from an - // an action that explicitly pauses the video (user pressing pause, JS, etc.) - // Otherwise it should be false if Pause is being called due to other reasons - // (cleanup, freeing resources, etc.) - void Pause(int player_id, bool is_media_related_action); - - // Performs seek on the player. - void Seek(int player_id, double time); - - // Sets the player volume. - void SetVolume(int player_id, double volume); - - // Sets the playback rate. - void SetRate(int player_id, double rate); - - // Destroys the player in the browser process - void DestroyPlayer(int player_id); - - // Registers and unregisters a WebMediaPlayerEfl object. - int RegisterMediaPlayer(WebMediaPlayerEfl* player); - void UnregisterMediaPlayer(int player_id); - - // RenderFrameObserver overrides. - bool OnMessageReceived(const IPC::Message& message) override; - void WasHidden() override; - void OnStop() override; - - // Pause the playing media players when tab/webpage goes to background - void PausePlayingPlayers(); - - private: - void OnNewFrameAvailable(int player_id, - base::SharedMemoryHandle foreign_memory_handle, - uint32_t length, base::TimeDelta timestamp); - -#if defined(TIZEN_TBM_SUPPORT) - void OnNewTbmBufferAvailable(int player_id, gfx::TbmBufferHandle tbm_handle, - base::TimeDelta timestamp); - void OnTbmBufferRelease(gfx::TbmBufferHandle tbm_handle); -#endif - - WebMediaPlayerEfl* GetMediaPlayer(int player_id); - void OnMediaDataChange(int player_id, int width, int height, int media); - void OnDurationChange(int player_id, double duration); - void OnTimeUpdate(int player_id, double current_time); - void OnBufferUpdate( - int player_id, - std::vector buffer_range); - void OnTimeChanged(int player_id); - void OnPauseStateChange(int player_id, bool state); - void OnSeekStateChange(int player_id, bool state); - void OnRequestSeek(int player_id, double seek_time); - void OnReadyStateChange(int player_id, - blink::WebMediaPlayer::ReadyState state); - void OnNetworkStateChange(int player_id, - blink::WebMediaPlayer::NetworkState state); - - private: - std::map media_players_; - int next_media_player_id_; -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_EFL_RENDERER_MEDIA_PLAYER_MANAGER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.cc b/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.cc deleted file mode 100644 index e97faa6..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.cc +++ /dev/null @@ -1,636 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/efl/webmediaplayer_efl.h" - -#include "cc/blink/web_layer_impl.h" -#include "cc/layers/video_layer.h" -#include "content/renderer/media/render_media_log.h" -#include "content/renderer/media/renderer_gpu_video_accelerator_factories.h" -#include "content/renderer/render_frame_impl.h" -#include "content/renderer/render_thread_impl.h" -#include "media/base/bind_to_current_loop.h" -#include "media/base/efl/media_player_util_efl.h" -#include "media/base/video_frame.h" -#include "media/blink/webmediaplayer_util.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" -#include "third_party/blink/public/platform/WebMediaPlayerClient.h" -#include "third_party/libyuv/include/libyuv/planar_functions.h" - -#define BIND_TO_RENDER_LOOP(function) \ - (DCHECK(main_loop_->BelongsToCurrentThread()), \ - media::BindToCurrentLoop(base::BindOnce(function, AsWeakPtr()))) - -// Round up 'x' to Multiple of 'a' byte. -// To properly use planes from tbm, width and height should round up to 16. -#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1)) - -using media::VideoFrame; - -namespace content { - -blink::WebMediaPlayer* CreateWebMediaPlayerEfl( - content::RendererMediaPlayerManager* manager, - blink::WebFrame* frame, - blink::WebMediaPlayerClient* client, - base::WeakPtr delegate, - const media::WebMediaPlayerParams& params) { - return new WebMediaPlayerEfl(manager, frame, client, delegate, params); -} - -WebMediaPlayerEfl::WebMediaPlayerEfl( - RendererMediaPlayerManager* manager, - blink::WebFrame* frame, - blink::WebMediaPlayerClient* client, - base::WeakPtr delegate, - const media::WebMediaPlayerParams& params) - : frame_(frame), - network_state_(blink::WebMediaPlayer::NetworkStateEmpty), - ready_state_(blink::WebMediaPlayer::ReadyStateHaveNothing), - main_loop_(base::ThreadTaskRunnerHandle::Get()), - media_task_runner_(params.media_task_runner()), - manager_(manager), - client_(client), - media_log_(params.media_log()), - delegate_(delegate), - defer_load_cb_(params.defer_load_cb()), - // Threaded compositing isn't enabled universally yet. - compositor_task_runner_( - params.compositor_task_runner() - ? params.compositor_task_runner() - : base::MessageLoop::current()->task_runner()), - compositor_(new media::VideoFrameCompositor( - compositor_task_runner_, - BIND_TO_RENDER_LOOP(&WebMediaPlayerEfl::OnNaturalSizeChanged), - BIND_TO_RENDER_LOOP(&WebMediaPlayerEfl::OnOpacityChanged))), - weak_factory_(this), - video_width_(0), - video_height_(0), - audio_(false), - video_(false), - current_time_(0), - duration_(0), - is_paused_(true), - is_seeking_(false), - seek_time_(0), - pending_seek_(0), - pending_seek_time_(0), - opaque_(false), - natural_size_(0, 0), - did_loading_progress_(false), - gpu_factories_(RenderThreadImpl::current()->GetGpuFactories()) -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) - , encrypted_media_support_( - params.CreateEncryptedMediaPlayerSupport(client)) -#endif - { - DCHECK(manager_); -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) - DCHECK(encrypted_media_support_); -#endif - - player_id_ = manager_->RegisterMediaPlayer(this); - - media_log_->AddEvent( - media_log_->CreateEvent(media::MediaLogEvent::WEBMEDIAPLAYER_CREATED)); -} - -WebMediaPlayerEfl::~WebMediaPlayerEfl() { - if (manager_) { - manager_->DestroyPlayer(player_id_); - manager_->UnregisterMediaPlayer(player_id_); - } - - compositor_->SetVideoFrameProviderClient(NULL); - client_->setWebLayer(NULL); - if (delegate_.get()) - delegate_->PlayerGone(this); - compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_); - if (media_source_delegate_) { - // Part of |media_source_delegate_| needs to be stopped - // on the media thread. - // Wait until |media_source_delegate_| is fully stopped - // before tearing down other objects. - base::WaitableEvent waiter(false, false); - media_source_delegate_->Stop(base::BindOnce(&base::WaitableEvent::Signal, - base::Unretained(&waiter))); - waiter.Wait(); - } -} - -void WebMediaPlayerEfl::load(LoadType load_type, - const blink::WebURL& url, - CORSMode /* cors_mode */) { - if (!defer_load_cb_.is_null()) { - defer_load_cb_.Run(base::BindOnce(&WebMediaPlayerEfl::DoLoad, AsWeakPtr(), - load_type, url)); - return; - } - DoLoad(load_type, url); -} - -void WebMediaPlayerEfl::DoLoad(LoadType load_type, const blink::WebURL& url) { - int demuxer_client_id = 0; - if (load_type == LoadTypeMediaSource) { - player_type_ = MEDIA_PLAYER_TYPE_MEDIA_SOURCE; - RendererDemuxerEfl* demuxer = - static_cast( - RenderThreadImpl::current()->renderer_demuxer()); - demuxer_client_id = demuxer->GetNextDemuxerClientID(); - media_source_delegate_.reset(new MediaSourceDelegateEfl( - demuxer, demuxer_client_id, media_task_runner_, media_log_.get())); - media::SetCdmReadyCB set_cdm_ready_cb; - media::Demuxer::EncryptedMediaInitDataCB emedia_init_data_cb; -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) - set_cdm_ready_cb = - encrypted_media_support_->CreateSetDecryptorReadyCB(); - emedia_init_data_cb = - encrypted_media_support_->CreateNeedKeyCB(); -#endif - media_source_delegate_->InitializeMediaSource( - base::BindOnce(&WebMediaPlayerEfl::OnMediaSourceOpened, - weak_factory_.GetWeakPtr()), - emedia_init_data_cb, set_cdm_ready_cb, - base::BindOnce(&WebMediaPlayerEfl::SetNetworkState, - weak_factory_.GetWeakPtr()), - base::BindOnce(&WebMediaPlayerEfl::OnDurationChange, - weak_factory_.GetWeakPtr()), - base::BindOnce(&WebMediaPlayerEfl::OnWaitingForDecryptionKey, - weak_factory_.GetWeakPtr())); - } else if (load_type == LoadTypeURL) { - player_type_ = MEDIA_PLAYER_TYPE_URL; - } else { - LOG(ERROR) << "Unsupported load type : " << load_type; - return; - } - - manager_->Initialize(player_id_, player_type_, - media::GetCleanURL(url.string().utf8()), - 0, demuxer_client_id); -} - -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) -blink::WebMediaPlayer::MediaKeyException -WebMediaPlayerEfl::generateKeyRequest(const blink::WebString& key_system, - const unsigned char* init_data, - unsigned init_data_length) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - return encrypted_media_support_->GenerateKeyRequest( - frame_, key_system, init_data, init_data_length); -} - -blink::WebMediaPlayer::MediaKeyException WebMediaPlayerEfl::addKey( - const blink::WebString& key_system, - const unsigned char* key, - unsigned key_length, - const unsigned char* init_data, - unsigned init_data_length, - const blink::WebString& session_id) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - return encrypted_media_support_->AddKey( - key_system, key, key_length, init_data, init_data_length, session_id); -} - -blink::WebMediaPlayer::MediaKeyException WebMediaPlayerEfl::cancelKeyRequest( - const blink::WebString& key_system, - const blink::WebString& session_id) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - return encrypted_media_support_->CancelKeyRequest(key_system, session_id); -} - -void WebMediaPlayerEfl::setContentDecryptionModule( - blink::WebContentDecryptionModule* cdm) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - encrypted_media_support_->SetContentDecryptionModule(cdm); -} - -void WebMediaPlayerEfl::setContentDecryptionModule( - blink::WebContentDecryptionModule* cdm, - blink::WebContentDecryptionModuleResult result) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - encrypted_media_support_->SetContentDecryptionModule(cdm, result); -} -#endif - -void WebMediaPlayerEfl::OnMediaSourceOpened( - blink::WebMediaSource* web_media_source) { - DCHECK(client_); - client_->mediaSourceOpened(web_media_source); -} - -void WebMediaPlayerEfl::OnWaitingForDecryptionKey() { - encrypted_client_->didBlockPlaybackWaitingForKey(); - - // TODO(jrummell): didResumePlaybackBlockedForKey() should only be called - // when a key has been successfully added (e.g. OnSessionKeysChange() with - // |has_additional_usable_key| = true). http://crbug.com/461903 - encrypted_client_->didResumePlaybackBlockedForKey(); -} - -void WebMediaPlayerEfl::play() { - manager_->Play(player_id_); - // Has to be updated from |MediaPlayerEfl| but IPC causes delay. - // There are cases were play - pause are fired successively and would fail. - is_paused_ = false; -} - -void WebMediaPlayerEfl::pause() { - manager_->Pause(player_id_, true); - // Has to be updated from |MediaPlayerEfl| but IPC causes delay. - // There are cases were play - pause are fired successively and would fail. - is_paused_ = true; -} - -void WebMediaPlayerEfl::RequestPause() { - switch (network_state_) { - // Pause the media player and inform Blink if the player is in a good - // shape. - case WebMediaPlayer::NetworkStateIdle: - case WebMediaPlayer::NetworkStateLoading: - case WebMediaPlayer::NetworkStateLoaded: - pause(); - client_->playbackStateChanged(); - break; - // If a WebMediaPlayer instance has entered into other then above states, - // the internal network state in HTMLMediaElement could be set to empty. - // And calling playbackStateChanged() could get this object deleted. - default: - break; - } -} - -bool WebMediaPlayerEfl::supportsSave() const { - return false; -} - -void WebMediaPlayerEfl::seek(double seconds) { - DCHECK(main_loop_->BelongsToCurrentThread()); - - if (is_seeking_) { - if (seconds == seek_time_) { - if (media_source_delegate_) { - if (!pending_seek_) { - // If using media source demuxer, only suppress redundant seeks if - // there is no pending seek. This enforces that any pending seek that - // results in a demuxer seek is preceded by matching - // CancelPendingSeek() and StartSeek() calls. - return; - } - } else { - // Suppress all redundant seeks if unrestricted by media source - // demuxer API. - pending_seek_ = false; - return; - } - } - - pending_seek_ = true; - pending_seek_time_ = seconds; - if (media_source_delegate_) - media_source_delegate_->CancelPendingSeek( - base::TimeDelta::FromSecondsD(pending_seek_time_)); - // Later, OnSeekComplete will trigger the pending seek. - return; - } - - is_seeking_ = true; - seek_time_ = seconds; - - // Once Chunk demuxer seeks |MediaPlayerEfl| seek will be intiated. - if (media_source_delegate_) - media_source_delegate_->StartWaitingForSeek( - base::TimeDelta::FromSecondsD(seek_time_)); - manager_->Seek(player_id_, seek_time_); - - // Draw empty frame during seek. - if (video_) { - gfx::Size size(video_width_, video_height_); - scoped_refptr video_frame = VideoFrame::CreateBlackFrame(size); - FrameReady(video_frame); - } -} - -void WebMediaPlayerEfl::setRate(double rate) { - manager_->SetRate(player_id_, rate); -} - -void WebMediaPlayerEfl::setVolume(double volume) { - manager_->SetVolume(player_id_, volume); -} - -blink::WebTimeRanges WebMediaPlayerEfl::buffered() const { - if (media_source_delegate_) - return media_source_delegate_->Buffered(); - return buffered_; -} - -blink::WebTimeRanges WebMediaPlayerEfl::seekable() const { - const double seekable_end = duration(); - if (std::isinf(seekable_end)) - return blink::WebTimeRanges(); - - blink::WebTimeRange seekable_range(0.0, seekable_end); - return blink::WebTimeRanges(&seekable_range, 1); -} - -void WebMediaPlayerEfl::setSinkId( - const blink::WebString& device_id, - const blink::WebSecurityOrigin& security_origin, - blink::WebSetSinkIdCallbacks* web_callback) { - DCHECK(main_loop_->BelongsToCurrentThread()); - scoped_ptr callback(web_callback); - callback->onError(blink::WebSetSinkIdError::NotSupported); -} - -void WebMediaPlayerEfl::paint(blink::WebCanvas* canvas, - const blink::WebRect& rect, - unsigned char alpha, - SkXfermode::Mode mode) { - scoped_refptr video_frame = - GetCurrentFrameFromCompositor(); - - gfx::RectF gfx_rect(rect); - media::Context3D context_3d; - skcanvas_video_renderer_.Paint( - video_frame.get(), canvas, gfx_rect, alpha, - SkXfermode::kSrcOver_Mode, media::VIDEO_ROTATION_0, context_3d); -} - -bool WebMediaPlayerEfl::hasVideo() const { - return video_; -} - -bool WebMediaPlayerEfl::hasAudio() const { - return audio_; -} - -blink::WebSize WebMediaPlayerEfl::naturalSize() const { - return blink::WebSize(natural_size_); -} - -bool WebMediaPlayerEfl::paused() const { - return is_paused_; -} - -bool WebMediaPlayerEfl::seeking() const { - return is_seeking_; -} - -double WebMediaPlayerEfl::duration() const { - return duration_; -} - -double WebMediaPlayerEfl::currentTime() const { - if (seeking()) - return pending_seek_ ? pending_seek_time_ : seek_time_; - return current_time_; -} - -blink::WebMediaPlayer::NetworkState WebMediaPlayerEfl::networkState() const { - return network_state_; -} - -blink::WebMediaPlayer::ReadyState WebMediaPlayerEfl::readyState() const { - return ready_state_; -} - -bool WebMediaPlayerEfl::didLoadingProgress() { - if (did_loading_progress_) { - did_loading_progress_ = false; - return true; - } - return false; -} - -bool WebMediaPlayerEfl::hasSingleSecurityOrigin() const { - return true; -} - -bool WebMediaPlayerEfl::didPassCORSAccessCheck() const { - return false; -} - -double WebMediaPlayerEfl::mediaTimeForTimeValue(double timeValue) const { - return base::TimeDelta::FromSecondsD(timeValue).InSecondsF(); -} - -unsigned WebMediaPlayerEfl::decodedFrameCount() const { - return 0; -}; - -unsigned WebMediaPlayerEfl::droppedFrameCount() const { - return 0; -}; - -unsigned WebMediaPlayerEfl::audioDecodedByteCount() const { - return 0; -}; - -unsigned WebMediaPlayerEfl::videoDecodedByteCount() const { - return 0; -}; - -void WebMediaPlayerEfl::SetReadyState(WebMediaPlayer::ReadyState state) { - ready_state_ = state; - client_->readyStateChanged(); -} - -void WebMediaPlayerEfl::SetNetworkState(WebMediaPlayer::NetworkState state) { - network_state_ = state; - client_->networkStateChanged(); -} - -#if defined(TIZEN_TBM_SUPPORT) -void WebMediaPlayerEfl::OnNewTbmBufferAvailable( - const gfx::TbmBufferHandle& tbm_handle, base::TimeDelta timestamp, - const base::Closure& cb) { - gfx::Size size(video_width_, video_height_); - scoped_refptr video_frame = - VideoFrame::WrapTBMSurface(size, timestamp, tbm_handle); - video_frame->AddDestructionObserver(cb); - FrameReady(video_frame); -} -#endif - -void WebMediaPlayerEfl::OnNewFrameAvailable(base::SharedMemoryHandle handle, - uint32 yuv_size, - base::TimeDelta timestamp) { - base::SharedMemory shared_memory(handle, false); - if (!shared_memory.Map(yuv_size)) { - LOG(ERROR) << "Failed to map shared memory for size " << yuv_size; - return; - } - - uint8* const yuv_buffer = static_cast(shared_memory.memory()); - gfx::Size size(video_width_, video_height_); - scoped_refptr video_frame = - VideoFrame::CreateFrame( - media::PIXEL_FORMAT_YV12, size, gfx::Rect(size), size, timestamp); - - uint8* video_buf = yuv_buffer; - const uint c_frm_size = yuv_size / 6; - const uint y_frm_size = c_frm_size << 2; // * 4; - - // U Plane buffer. - uint8* video_buf_u = video_buf + y_frm_size; - - // V Plane buffer. - uint8* video_buf_v = video_buf_u + c_frm_size; - - // Get the videoframe stride size. - // Calculate the video buffer stride size. - const uint uv_rows = video_frame.get()->rows(VideoFrame::kUPlane); - const uint video_stride = c_frm_size / uv_rows; - - libyuv::I420Copy(video_buf, 2 * video_stride, - video_buf_u, video_stride, - video_buf_v, video_stride, - video_frame.get()->data(VideoFrame::kYPlane), - video_frame.get()->stride(VideoFrame::kYPlane), - video_frame.get()->data(VideoFrame::kUPlane), - video_frame.get()->stride(VideoFrame::kUPlane), - video_frame.get()->data(VideoFrame::kVPlane), - video_frame.get()->stride(VideoFrame::kVPlane), - video_width_, video_height_); - FrameReady(video_frame); -} - -void WebMediaPlayerEfl::FrameReady( - const scoped_refptr& frame) { - compositor_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &media::VideoFrameCompositor::PaintFrameUsingOldRenderingPath, - base::Unretained(compositor_), frame)); -} - -void WebMediaPlayerEfl::OnMediaDataChange(int width, int height, int media) { - video_height_ = height; - video_width_ = width; - audio_ = media & media::MEDIA_AUDIO_MASK ? true : false; - video_ = media & media::MEDIA_VIDEO_MASK ? true : false; - natural_size_ = gfx::Size(width, height); - SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); - if (hasVideo() && !video_weblayer_.get()) { - scoped_refptr layer = - cc::VideoLayer::Create(cc_blink::WebLayerImpl::LayerSettings(), - compositor_, media::VIDEO_ROTATION_0); - video_weblayer_.reset(new cc_blink::WebLayerImpl(layer)); - video_weblayer_->setOpaque(opaque_); - client_->setWebLayer(video_weblayer_.get()); - } -} - -void WebMediaPlayerEfl::OnTimeChanged() { - is_seeking_ = false; - - // Handling pending seek for ME. For MSE |CancelPendingSeek| - // will handle the pending seeks. - if (!media_source_delegate_ && pending_seek_) { - pending_seek_ = false; - seek(pending_seek_time_); - return; - } - client_->timeChanged(); -} - -void WebMediaPlayerEfl::OnDurationChange(double duration) { - duration_ = duration; - client_->durationChanged(); -} - -void WebMediaPlayerEfl::OnNaturalSizeChanged(gfx::Size size) { - DCHECK(main_loop_->BelongsToCurrentThread()); - DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); - media_log_->AddEvent( - media_log_->CreateVideoSizeSetEvent(size.width(), size.height())); - natural_size_ = size; - - client_->sizeChanged(); -} - -void WebMediaPlayerEfl::OnOpacityChanged(bool opaque) { - DCHECK(main_loop_->BelongsToCurrentThread()); - DCHECK_NE(ready_state_, WebMediaPlayer::ReadyStateHaveNothing); - - opaque_ = opaque; - if (video_weblayer_) - video_weblayer_->setOpaque(opaque_); -} - -static void GetCurrentFrameAndSignal( - media::VideoFrameCompositor* compositor, - scoped_refptr* video_frame_out, - base::WaitableEvent* event) { - *video_frame_out = compositor->GetCurrentFrame(); - event->Signal(); -} - -scoped_refptr -WebMediaPlayerEfl::GetCurrentFrameFromCompositor() { - if (compositor_task_runner_->BelongsToCurrentThread()) - return compositor_->GetCurrentFrame(); - - // Use a posted task and waitable event instead of a lock otherwise - // WebGL/Canvas can see different content than what the compositor is seeing. - scoped_refptr video_frame; - base::WaitableEvent event(false, false); - compositor_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&GetCurrentFrameAndSignal, base::Unretained(compositor_), - &video_frame, &event)); - event.Wait(); - return video_frame; -} - -void WebMediaPlayerEfl::OnTimeUpdate(double current_time) { - current_time_ = current_time; -} - -void WebMediaPlayerEfl::OnBufferUpdate( - std::vector buffer_range) { - media::Ranges time_ranges; - std::vector::iterator tr_it; - for (tr_it = buffer_range.begin(); tr_it != buffer_range.end(); ++tr_it) { - time_ranges.Add( - base::TimeDelta::FromMicroseconds((*tr_it).start), - base::TimeDelta::FromMicroseconds((*tr_it).end)); - } - blink::WebTimeRanges web_ranges(ConvertToWebTimeRanges(time_ranges)); - buffered_.swap(web_ranges); - did_loading_progress_ = true; -} - -void WebMediaPlayerEfl::OnPauseStateChange(bool state) { - is_paused_ = state; - client_->playbackStateChanged(); - if (!delegate_) - return; - - if(is_paused_) - delegate_->DidPause(this); - else - delegate_->DidPlay(this); -} - -void WebMediaPlayerEfl::OnSeekStateChange(bool state) { - is_seeking_ = state; - // Draw empty frame during seek. - if (video_ && is_seeking_) { - gfx::Size size(video_width_, video_height_); - scoped_refptr video_frame = VideoFrame::CreateBlackFrame(size); - FrameReady(video_frame); - } -} - -void WebMediaPlayerEfl::OnRequestSeek(double seek_time) { - client_->requestSeek(seek_time); -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.h b/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.h deleted file mode 100644 index bed7ba6..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/efl/webmediaplayer_efl.h +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_RENDERER_MEDIA_EFL_WEBMEDIAPLAYER_EFL_H_ -#define CONTENT_RENDERER_MEDIA_EFL_WEBMEDIAPLAYER_EFL_H_ - -#include - -#include "base/memory/shared_memory.h" -#include "base/message_loop/message_loop.h" -#include "cc/layers/video_frame_provider_client_impl.h" -#include "content/renderer/media/efl/media_source_delegate_efl.h" -#include "content/renderer/media/efl/renderer_media_player_manager_efl.h" -#include "media/base/efl/media_player_efl.h" -#include "media/blink/video_frame_compositor.h" -#include "media/blink/webmediaplayer_params.h" -#include "media/blink/webmediaplayer_util.h" -#include "media/renderers/skcanvas_video_renderer.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" -#include "third_party/blink/public/platform/WebMediaPlayerEncryptedMediaClient.h" - -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) -#include "media/blink/encrypted_media_player_support.h" -#endif - -namespace blink { -class WebFrame; -class WebMediaPlayerClient; -} - -namespace cc_blink { -class WebLayerImpl; -} - -namespace media { -class GpuVideoAcceleratorFactories; -class MediaLog; -class MediaPlayerEfl; -class WebMediaPlayerDelegate; -class WebMediaPlayerEncryptedMediaClient; -} - -namespace content { -class RendererMediaPlayerManager; - -// This class implements blink::WebMediaPlayer by keeping the efl -// media player in the browser process. It listens to all the status changes -// sent from the browser process and sends playback controls to the media -// player. -class WebMediaPlayerEfl - : public blink::WebMediaPlayer, - public base::SupportsWeakPtr { - public: - // Construct a WebMediaPlayerEfl object. This class communicates - // with the WebMediaPlayerEfl object in the browser process through - // |proxy|. - WebMediaPlayerEfl( - RendererMediaPlayerManager* manager, - blink::WebFrame* frame, - blink::WebMediaPlayerClient* client, - base::WeakPtr delegate, - const media::WebMediaPlayerParams& params); - ~WebMediaPlayerEfl() override; - - WebMediaPlayerEfl(const WebMediaPlayerEfl&) = delete; - WebMediaPlayerEfl& operator=(const WebMediaPlayerEfl&) = delete; - - // blink::WebMediaPlayer implementation. - void load(LoadType load_type, - const blink::WebURL& url, - CORSMode cors_mode) override; - - // Playback controls. - void play() override; - void pause() override; - bool supportsSave() const override; - void seek(double seconds) override; - void setRate(double) override; - void setVolume(double) override; - blink::WebTimeRanges buffered() const override; - blink::WebTimeRanges seekable() const override; - void setSinkId(const blink::WebString& sink_id, - const blink::WebSecurityOrigin& security_origin, - blink::WebSetSinkIdCallbacks* web_callback) override; - - void paint(blink::WebCanvas*, - const blink::WebRect&, - unsigned char alpha, - SkXfermode::Mode) override; - - // True if the loaded media has a playable video/audio track. - bool hasVideo() const override; - bool hasAudio() const override; - - // Dimension of the video. - blink::WebSize naturalSize() const override; - - // Getters of playback state. - bool paused() const override; - bool seeking() const override; - double duration() const override; - double currentTime() const override; - - // Internal states of loading and network. - NetworkState networkState() const override; - ReadyState readyState() const override; - - bool didLoadingProgress() override; - - bool hasSingleSecurityOrigin() const override; - bool didPassCORSAccessCheck() const override; - - double mediaTimeForTimeValue(double timeValue) const override; - - unsigned decodedFrameCount() const override; - unsigned droppedFrameCount() const override; - unsigned audioDecodedByteCount() const override; - unsigned videoDecodedByteCount() const override; - -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) - virtual MediaKeyException generateKeyRequest( - const blink::WebString& key_system, - const unsigned char* init_data, - unsigned init_data_length); - - virtual MediaKeyException addKey(const blink::WebString& key_system, - const unsigned char* key, - unsigned key_length, - const unsigned char* init_data, - unsigned init_data_length, - const blink::WebString& session_id); - - virtual MediaKeyException cancelKeyRequest( - const blink::WebString& key_system, - const blink::WebString& session_id); - - // TODO(jrummell): Remove this method once Blink updated to use the other - // method. - virtual void setContentDecryptionModule( - blink::WebContentDecryptionModule* cdm); - virtual void setContentDecryptionModule( - blink::WebContentDecryptionModule* cdm, - blink::WebContentDecryptionModuleResult result); -#endif - - void SetReadyState(WebMediaPlayer::ReadyState state); - void SetNetworkState(WebMediaPlayer::NetworkState state); - - void OnNewFrameAvailable(base::SharedMemoryHandle foreign_memory_handle, - uint32_t length, base::TimeDelta timestamp); - -#if defined(TIZEN_TBM_SUPPORT) - void OnNewTbmBufferAvailable( - const gfx::TbmBufferHandle& tbm_handle, - base::TimeDelta timestamp, - const base::Closure& cb); -#endif - - void OnMediaDataChange(int width, int height, int media); - void OnDurationChange(double duration); - void OnTimeUpdate(double current_time); - void OnBufferUpdate( - std::vector buffer_range); - void OnTimeChanged(); - void OnPauseStateChange(bool state); - void OnSeekStateChange(bool state); - void OnRequestSeek(double seek_time); - - void OnMediaSourceOpened(blink::WebMediaSource* web_media_source); - void OnDemuxerSeekDone(); - - void RequestPause(); - - // Called when a decoder detects that the key needed to decrypt the stream - // is not available. - void OnWaitingForDecryptionKey(); - - private: - // Called after |defer_load_cb_| has decided to allow the load. If - // |defer_load_cb_| is null this is called immediately. - void DoLoad(LoadType load_type, const blink::WebURL& url); - - void OnNaturalSizeChanged(gfx::Size size); - void OnOpacityChanged(bool opaque); - - // Returns the current video frame from |compositor_|. Blocks until the - // compositor can return the frame. - scoped_refptr GetCurrentFrameFromCompositor(); - - // Called whenever there is new frame to be painted. - void FrameReady(const scoped_refptr& frame); - - blink::WebFrame* frame_; - - blink::WebMediaPlayer::NetworkState network_state_; - blink::WebMediaPlayer::ReadyState ready_state_; - - // Message loops for posting tasks on Chrome's main thread. Also used - // for DCHECKs so methods calls won't execute in the wrong thread. - const scoped_refptr main_loop_; - scoped_refptr media_task_runner_; - - // Manager for managing this object and for delegating method calls on - // Render Thread. - content::RendererMediaPlayerManager* manager_; - - blink::WebMediaPlayerClient* client_; - blink::WebMediaPlayerEncryptedMediaClient* encrypted_client_; - - scoped_refptr media_log_; - - base::WeakPtr delegate_; - - media::WebMediaPlayerParams::DeferLoadCB defer_load_cb_; - - // The compositor layer for displaying the video content when using - // composited playback. - scoped_ptr video_weblayer_; - - // Video rendering members. - scoped_refptr compositor_task_runner_; - media::VideoFrameCompositor* compositor_; - media::SkCanvasVideoRenderer skcanvas_video_renderer_; - - base::WeakPtrFactory weak_factory_; - scoped_ptr media_source_delegate_; - MediaPlayerHostMsg_Initialize_Type player_type_; - - // Player ID assigned by the |manager_|. - int player_id_; - - int video_width_; - int video_height_; - - bool audio_; - bool video_; - - double current_time_; - double duration_; - bool is_paused_; - - bool is_seeking_; - double seek_time_; - bool pending_seek_; - double pending_seek_time_; - - // Whether the video is known to be opaque or not. - bool opaque_; - - gfx::Size natural_size_; - blink::WebTimeRanges buffered_; - mutable bool did_loading_progress_; - - // Factories for supporting video accelerators. May be null. - media::GpuVideoAcceleratorFactories* gpu_factories_; -#if defined(TIZEN_MULTIMEDIA_EME_SUPPORT) - scoped_ptr encrypted_media_support_; -#endif -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_EFL_WEBMEDIAPLAYER_EFL_H_ diff --git a/tizen_src/chromium_impl/content/renderer/media/tizen/audio_decoder_capi.cc b/tizen_src/chromium_impl/content/renderer/media/tizen/audio_decoder_capi.cc deleted file mode 100644 index 8f46615..0000000 --- a/tizen_src/chromium_impl/content/renderer/media/tizen/audio_decoder_capi.cc +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/renderer/media/efl/audio_decoder_efl.h" - -#include "base/memory/shared_memory.h" -#include "base/posix/eintr_wrapper.h" -#include "base/process/process.h" -#include "base/strings/string_util.h" -#include "base/time/time.h" -#include "content/child/thread_safe_sender.h" -#include "content/common/render_messages_efl.h" -#include "media/base/audio_bus.h" -#include "media/base/efl/webaudio_media_codec_info_efl.h" -#include "media/base/limits.h" -#include "public/platform/Platform.h" -#include "third_party/blink/public/platform/WebAudioBus.h" - -namespace content { - -const size_t kAudioDataSizeLimit = 0x80000000; - -class AudioDecoderIO { - public: - AudioDecoderIO(const char* data, size_t data_size); - virtual ~AudioDecoderIO(); - - AudioDecoderIO(const AudioDecoderIO&) = delete; - AudioDecoderIO& operator=(const AudioDecoderIO&) = delete; - - bool ShareEncodedDataToProcess(base::SharedMemoryHandle* handle); - - // Returns true if |AudioDecoderIO| was successfully created. - bool IsValid() const; - - int GetReadFd() const { return read_fd_; } - int GetWriteFd() const { return write_fd_; } - - private: - // Shared memory that will hold the encoded audio data. This is - // used by |MediaCodec| for decoding. - base::SharedMemory encoded_data_handle_; - - // A pipe used to communicate with MediaCodec. MediaCodec owns - // write_fd_ and writes to it. - int read_fd_; - int write_fd_; -}; - -AudioDecoderIO::AudioDecoderIO(const char* data, size_t data_size) - : read_fd_(-1), write_fd_(-1) { - if (!data || data_size > kAudioDataSizeLimit || data_size <= 0) { - LOG(ERROR) << " Invalid Data"; - return; - } - - // Create the shared memory and copy our data to it so that - // |MediaCodec| can access it. - if(!encoded_data_handle_.CreateAndMapAnonymous(data_size)) { - LOG(ERROR) << " Creation of shared memory failed"; - return; - } - - if (!encoded_data_handle_.memory()) { - LOG(ERROR) << " Invalid shared memory"; - return; - } - - memcpy(encoded_data_handle_.memory(), data, data_size); - - // Create a pipe for reading/writing the decoded PCM data - int pipefd[2] = {0}; - if (-1 == pipe(pipefd)) { - LOG(INFO) <<" Pipe is already created"; - return; - } - - read_fd_ = pipefd[0]; - write_fd_ = pipefd[1]; -} - -AudioDecoderIO::~AudioDecoderIO() { - // Close the read end of the pipe. The write end should have been - // closed by |MediaCodec|. - if (read_fd_ >= 0 && close(read_fd_)) { - LOG(WARNING) << "Cannot close read fd " << read_fd_ - << ": " << strerror(errno); - } - read_fd_ = -1; - write_fd_ = -1; -} - -bool AudioDecoderIO::IsValid() const { - return read_fd_ >= 0 && write_fd_ >= 0 && - encoded_data_handle_.memory(); -} - -bool AudioDecoderIO::ShareEncodedDataToProcess( - base::SharedMemoryHandle* handle) { - return encoded_data_handle_.ShareToProcess(base::GetCurrentProcessHandle(), - handle); -} - -static void CopyPcmDataToBus(int input_fd, - blink::WebAudioBus* destination_bus, - size_t num_of_frames, - unsigned number_of_channels, - double file_sample_rate) { - - ssize_t lread = 0; - float sample = 0; - size_t samples_in_pipe = 0; - struct media::WebAudioMediaDataInfoEfl data_info; - std::vector decoded_samples[number_of_channels]; - while ((lread = - HANDLE_EINTR(read(input_fd, &data_info, sizeof(data_info)))) > 0) { - float pipe_data[data_info.size_ / sizeof(float)]; - - lread = HANDLE_EINTR(read(input_fd, pipe_data, sizeof(pipe_data))); - samples_in_pipe = lread / sizeof(float); - - for (size_t i = 0; i < number_of_channels; i++) { - if ((decoded_samples[i].size() + samples_in_pipe) > - decoded_samples[i].capacity()) { - decoded_samples[i].reserve( - std::max(samples_in_pipe, 2 * decoded_samples[i].capacity())); - } - } - std::copy(pipe_data, pipe_data + samples_in_pipe, - back_inserter(decoded_samples[data_info.channel_mask_ - 1])); - } - size_t number_of_samples = 0; - for (size_t i = 0; i < number_of_channels; i++) { - number_of_samples += decoded_samples[i].size(); - } - size_t number_of_frames = number_of_samples / number_of_channels; - size_t decoded_frames = 0; - destination_bus->initialize(number_of_channels, - number_of_frames, - file_sample_rate); - - for (size_t frames = 0; frames < number_of_frames; frames++) { - for (size_t channel = 0; channel < number_of_channels; channel++) { - sample = decoded_samples[channel][frames]; - destination_bus->channelData(channel)[decoded_frames] = sample; - } - ++decoded_frames; - } - LOG(INFO) << "decoded_frames : " << decoded_frames - << " number_of_frames : " << number_of_frames; - if (decoded_frames < number_of_frames) - destination_bus->resizeSmaller(decoded_frames); -} - -static void BufferAndCopyPcmDataToBus(int input_fd, - blink::WebAudioBus* destination_bus, - unsigned number_of_channels, - double file_sample_rate) { - ssize_t lread = 0; - float sample = 0; - size_t samples_in_pipe = 0; - struct media::WebAudioMediaDataInfoEfl data_info; - std::vector decoded_samples[number_of_channels]; - while ((lread = - HANDLE_EINTR(read(input_fd, &data_info, sizeof(data_info)))) > 0) { - float pipe_data[data_info.size_ / sizeof(float)]; - - lread = HANDLE_EINTR(read(input_fd, pipe_data, sizeof(pipe_data))); - samples_in_pipe = lread / sizeof(float); - - for (size_t i = 0; i < number_of_channels; i++) { - if ((decoded_samples[i].size() + samples_in_pipe) > - decoded_samples[i].capacity()) { - decoded_samples[i].reserve( - std::max(samples_in_pipe, 2 * decoded_samples[i].capacity())); - } - } - std::copy(pipe_data, pipe_data + samples_in_pipe, - back_inserter(decoded_samples[data_info.channel_mask_ - 1])); - } - size_t number_of_samples = 0; - for (size_t i = 0; i < number_of_channels; i++) { - number_of_samples += decoded_samples[i].size(); - } - size_t number_of_frames = number_of_samples / number_of_channels; - size_t decoded_frames = 0; - destination_bus->initialize(number_of_channels, - number_of_frames, - file_sample_rate); - - for (size_t frames = 0; frames < number_of_frames; frames++) { - for (size_t channel = 0; channel < number_of_channels; channel++) { - sample = decoded_samples[channel][frames]; - destination_bus->channelData(channel)[decoded_frames] = sample; - } - ++decoded_frames; - } - LOG(INFO) << "decoded_frames : " << decoded_frames - << " number_of_frames : " << number_of_frames; - - if (decoded_frames < number_of_frames) - destination_bus->resizeSmaller(decoded_frames); -} - -// Decode in-memory audio file data. -bool DecodeAudioFileData(blink::WebAudioBus* destination_bus, - const char* data, size_t data_size, - scoped_refptr sender) { - AudioDecoderIO audio_decoder(data, data_size); - - if (!audio_decoder.IsValid()) { - LOG(ERROR) << "Invalid audio_decoder"; - return false; - } - - base::SharedMemoryHandle encoded_data_handle; - audio_decoder.ShareEncodedDataToProcess(&encoded_data_handle); - base::FileDescriptor fd(audio_decoder.GetWriteFd(), true); - - // Start Decoding in browser process which will read from - // encoded_data_handle for our shared memory and write the decoded - // PCM samples (16-bit integer) to our pipe. - - sender->Send(new EflViewHostMsg_WebAudioDecode(encoded_data_handle, - fd, data_size)); - - int input_fd = audio_decoder.GetReadFd(); - struct media::WebAudioMediaCodecInfoEfl info; - - ssize_t nread = HANDLE_EINTR(read(input_fd, &info, sizeof(info))); - - if (nread != sizeof(info)) { - LOG(ERROR) << "Read Failed"; - return false; - } - - double file_sample_rate = static_cast(info.sample_rate_); - - // Sanity checks - if (!info.channel_count_ || - info.channel_count_ > media::limits::kMaxChannels || - file_sample_rate < media::limits::kMinSampleRate || - file_sample_rate > media::limits::kMaxSampleRate) { - return false; - } - - if (info.number_of_frames_> 0) { - CopyPcmDataToBus(input_fd, destination_bus, info.number_of_frames_, - info.channel_count_, file_sample_rate); - } else { - BufferAndCopyPcmDataToBus(input_fd, destination_bus, - info.channel_count_, file_sample_rate); - } - - return true; -} - -} // namespace content diff --git a/tizen_src/chromium_impl/content/renderer/renderer_efl.gni b/tizen_src/chromium_impl/content/renderer/renderer_efl.gni index 6e5706a..1b19cae 100644 --- a/tizen_src/chromium_impl/content/renderer/renderer_efl.gni +++ b/tizen_src/chromium_impl/content/renderer/renderer_efl.gni @@ -14,13 +14,6 @@ external_content_renderer_efl_configs = [ "//tizen_src/build:libtts", ] -if (tizen_multimedia_support) { - external_content_renderer_efl_configs += [ - "//tizen_src/build:capi-media-player", - "//tizen_src/build:libcapi-media-player", - ] -} - ############################################################################## # Dependency ############################################################################## @@ -34,23 +27,6 @@ external_content_renderer_efl_sources = [ "//tizen_src/chromium_impl/content/renderer/common_renderer_client.h", ] -if (tizen_multimedia_support) { - #"media/audio_decoder.cc", - #"media/audio_decoder.h", - external_content_renderer_efl_sources += [ - "media/efl/audio_decoder_efl.h", - "media/efl/media_source_delegate_efl.cc", - "media/efl/media_source_delegate_efl.h", - "media/efl/renderer_demuxer_efl.cc", - "media/efl/renderer_demuxer_efl.h", - "media/efl/renderer_media_player_manager_efl.cc", - "media/efl/renderer_media_player_manager_efl.h", - "media/efl/webmediaplayer_efl.cc", - "media/efl/webmediaplayer_efl.h", - "media/tizen/audio_decoder_capi.cc", - ] -} - if (tizen_multimedia) { external_content_renderer_efl_sources += [ "//tizen_src/chromium_impl/content/renderer/media/tizen/media_player_renderer_client.cc", diff --git a/tizen_src/chromium_impl/media/audio/tizen/audio_manager_tizen.cc b/tizen_src/chromium_impl/media/audio/tizen/audio_manager_tizen.cc deleted file mode 100644 index 7056b5b..0000000 --- a/tizen_src/chromium_impl/media/audio/tizen/audio_manager_tizen.cc +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2014 The Samsung Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#if defined(TIZEN_MULTIMEDIA_USE_CAPI_AUDIO_IO) -#include "media/audio/tizen/audio_manager_capi.h" -#else -#include "media/audio/pulse/audio_manager_pulse.h" -#endif - -namespace media { - -AudioManager* CreateAudioManager(AudioLogFactory* audio_log_factory) { -#if defined(TIZEN_MULTIMEDIA_USE_CAPI_AUDIO_IO) - return media::AudioManagerCapi::Create(audio_log_factory); -#else - return AudioManagerPulse::Create(audio_log_factory); -#endif -} - -} // namespace media diff --git a/tizen_src/chromium_impl/media/base/efl/demuxer_efl.h b/tizen_src/chromium_impl/media/base/efl/demuxer_efl.h deleted file mode 100644 index 12bd477..0000000 --- a/tizen_src/chromium_impl/media/base/efl/demuxer_efl.h +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_EFL_DEMUXER_EFL_H_ -#define MEDIA_BASE_EFL_DEMUXER_EFL_H_ - -#include "media/base/efl/demuxer_stream_player_params_efl.h" - -namespace media { - -// Defines the client callback interface. -class MEDIA_EXPORT DemuxerEflClient { - public: - // Called when the demuxer has initialized. - virtual void OnDemuxerConfigsAvailable(const DemuxerConfigs& params) = 0; - - // Called in response to RequestDemuxerData(). - virtual void OnDemuxerDataAvailable( - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) = 0; - - // Called to inform demuxer seek completion. - virtual void OnDemuxerSeekDone( - const base::TimeDelta& actual_browser_seek_time) = 0; - - // Called whenever the demuxer has detected a duration change. - virtual void OnDemuxerDurationChanged(base::TimeDelta duration) = 0; - - protected: - virtual ~DemuxerEflClient() {} -}; - -// Defines a demuxer with asynchronous operations. -class MEDIA_EXPORT DemuxerEfl { - public: - virtual ~DemuxerEfl() {} - - // Initializes this demuxer with |client| as the callback handler. - // Must be called prior to calling any other methods. - virtual void Initialize(DemuxerEflClient* client) = 0; - - // Called to request demuxer seek. - virtual void RequestDemuxerSeek(const base::TimeDelta& time_to_seek) = 0; - - // Called to request additional data from the demuxer. - virtual void RequestDemuxerData(media::DemuxerStream::Type type) = 0; -}; - -} // namespace media - -#endif // MEDIA_BASE_EFL_DEMUXER_EFL_H_ \ No newline at end of file diff --git a/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.cc b/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.cc deleted file mode 100644 index 3e90f65..0000000 --- a/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.cc +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "media/base/efl/demuxer_stream_player_params_efl.h" - -namespace media { - -DemuxerConfigs::DemuxerConfigs() - : audio_codec(kUnknownAudioCodec), - audio_channels(0), - audio_sampling_rate(0), - is_audio_encrypted(false), - video_codec(kUnknownVideoCodec), - is_video_encrypted(false), - duration_ms(0) {} - -DemuxerConfigs::~DemuxerConfigs() {} - -DemuxedBufferMetaData::DemuxedBufferMetaData() - : size(0), - end_of_stream(false), - type(DemuxerStream::UNKNOWN), - status(DemuxerStream::kAborted) {} - -DemuxedBufferMetaData::~DemuxedBufferMetaData() {} - -} // namespace media diff --git a/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.h b/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.h deleted file mode 100644 index 1678972..0000000 --- a/tizen_src/chromium_impl/media/base/efl/demuxer_stream_player_params_efl.h +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_EFL_DEMUXER_STREAM_PLAYER_PARAMS_EFL_H_ -#define MEDIA_BASE_EFL_DEMUXER_STREAM_PLAYER_PARAMS_EFL_H_ - -#include - -#include "media/base/audio_decoder_config.h" -#include "media/base/decrypt_config.h" -#include "media/base/demuxer_stream.h" -#include "media/base/media_export.h" -#include "media/base/video_decoder_config.h" -#include "ui/gfx/geometry/size.h" - -namespace media { - -struct MEDIA_EXPORT DemuxerConfigs { - DemuxerConfigs(); - ~DemuxerConfigs(); - - AudioCodec audio_codec; - int audio_channels; - int audio_sampling_rate; - bool is_audio_encrypted; - std::vector audio_extra_data; - - VideoCodec video_codec; - gfx::Size video_size; - bool is_video_encrypted; - std::vector video_extra_data; - - int duration_ms; -}; - -struct MEDIA_EXPORT DemuxedBufferMetaData { - DemuxedBufferMetaData(); - ~DemuxedBufferMetaData(); - - int size; - bool end_of_stream; - base::TimeDelta timestamp; - base::TimeDelta time_duration; - DemuxerStream::Type type; - DemuxerStream::Status status; -}; - -}; // namespace media - -#endif // MEDIA_BASE_EFL_DEMUXER_STREAM_PLAYER_PARAMS_EFL_H_ diff --git a/tizen_src/chromium_impl/media/base/efl/webaudio_decoder_efl.h b/tizen_src/chromium_impl/media/base/efl/webaudio_decoder_efl.h deleted file mode 100644 index 21a9412..0000000 --- a/tizen_src/chromium_impl/media/base/efl/webaudio_decoder_efl.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_EFL_WEBAUDIO_DECODER_EFL_H_ -#define MEDIA_BASE_EFL_WEBAUDIO_DECODER_EFL_H_ - -#include - -#include "base/memory/shared_memory.h" -#include "media/base/media_export.h" - -namespace media { - -class MEDIA_EXPORT WebAudioDecoder { - public: - static WebAudioDecoder* GetWebAudioDecoder(); - virtual void EncodedDataReceived(base::SharedMemoryHandle memory_handle, - base::FileDescriptor pcm_output, - uint32_t data_size) = 0; -}; - -} // namespace media -#endif // MEDIA_BASE_EFL_WEBAUDIO_DECODER_EFL_H_ diff --git a/tizen_src/chromium_impl/media/base/efl/webaudio_media_codec_info_efl.h b/tizen_src/chromium_impl/media/base/efl/webaudio_media_codec_info_efl.h deleted file mode 100644 index 734f820..0000000 --- a/tizen_src/chromium_impl/media/base/efl/webaudio_media_codec_info_efl.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2014 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_EFL_WEBAUDIO_MEDIA_CODEC_INFO_EFL_H_ -#define MEDIA_BASE_EFL_WEBAUDIO_MEDIA_CODEC_INFO_EFL_H_ - -namespace media { - -// This structure holds the information about the audio file -// determined by MediaCodec that is needed by the audio decoder to -// create the necessary destination bus. -struct WebAudioMediaCodecInfoEfl { - unsigned long channel_count_; - unsigned long sample_rate_; - unsigned long number_of_frames_; - WebAudioMediaCodecInfoEfl(unsigned long channel_count = 0, - unsigned long sample_rate = 0, - unsigned long number_of_frames = 0) - : channel_count_(channel_count), - sample_rate_(sample_rate), - number_of_frames_(number_of_frames) {} -}; - -struct WebAudioMediaDataInfoEfl { - int channel_mask_; - int size_; - WebAudioMediaDataInfoEfl(int channel_mask = 0, int size = 0) - : channel_mask_(channel_mask), - size_(size) {} -}; - -} // namespace media -#endif // MEDIA_BASE_EFL_WEBAUDIO_MEDIA_CODEC_INFO_EFL_H_ diff --git a/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.cc b/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.cc deleted file mode 100644 index 0f3f8ab..0000000 --- a/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.cc +++ /dev/null @@ -1,951 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/process/process.h" -#include "base/thread_task_runner_handle.h" -#include "content/browser/media/efl/browser_demuxer_efl.h" -#include "media/base/efl/media_player_manager_efl.h" -#include "media/base/tizen/media_source_player_capi.h" -#include "third_party/libyuv/include/libyuv.h" - -namespace { -const int kDurationUpdateInterval = 100; - -// Waiting time for buffering while seeking. -const double kSeekBufferingWaitInSec = 2; - -// CAPI internal appsrc buffer size. -const uint64 max_size = 2097152; // 2MB - -// Appsrc minimum buffering level -const unsigned int min_threshold = 30; - -} // namespace - -namespace media { -void OnCapiPlayerPreparedCB(void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - player->OnPrepareComplete(); -} - -void OnSeekCompleteCB(void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - player->OnSeekComplete(); -} - -void OnHandleBufferingMessageCB(int percent, void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - player->OnHandleBufferingMessage(percent); -} - -void OnCapiAudioBufStatusCB(player_media_stream_buffer_status_e status, - void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - if (status == PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN) { - player->OnUpdateDataStatus(media::DemuxerStream::AUDIO, true); - } else if (status == PLAYER_MEDIA_STREAM_BUFFER_OVERFLOW) { - player->OnUpdateDataStatus(media::DemuxerStream::AUDIO, false); - } -} - -void OnCapiVideoBufStatusCB(player_media_stream_buffer_status_e status, - void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - if (status == PLAYER_MEDIA_STREAM_BUFFER_UNDERRUN) { - player->OnUpdateDataStatus(media::DemuxerStream::VIDEO, true); - } else if (status == PLAYER_MEDIA_STREAM_BUFFER_OVERFLOW) { - player->OnUpdateDataStatus(media::DemuxerStream::VIDEO, false); - } -} - -static void OnMediaPacketDecoded(media_packet_h packet, void* data) { - if (!packet) { - LOG(ERROR) << "media_packet handle is null"; - return; - } - - MediaSourcePlayerCapi* player = static_cast(data); - player->OnMediaPacketUpdated(packet); -} - -void OnPlaybackCompleteCB(void* user_data) { - LOG(INFO) << "On playback complete Call back"; - MediaSourcePlayerCapi* player = - static_cast(user_data); - - if (!player) - return; - - player->OnPlaybackComplete(); -} - -void OnPlayerErrorCB(int error_code, void* user_data) { - MediaSourcePlayerCapi* player = - static_cast(user_data); - - if (!player) - return; - - player->OnHandlePlayerError(error_code, FROM_HERE); -} - -void MediaSourcePlayerCapi::PrepareComplete() { - player_prepared_ = true; - manager()->OnReadyStateChange( - GetPlayerId(), blink::WebMediaPlayer::ReadyStateHaveEnoughData); - manager()->OnNetworkStateChange( - GetPlayerId(), blink::WebMediaPlayer::NetworkStateLoaded); -} - -MediaPlayerEfl* MediaPlayerEfl::CreatePlayer( - int player_id, content::BrowserDemuxerEfl* demuxer, - int demuxer_id, MediaPlayerManager* manager) { - LOG(INFO) << "MediaSourceElement is using |CAPI| to play media"; - return new MediaSourcePlayerCapi(player_id, - demuxer->CreateDemuxer(demuxer_id), - manager); -} - -MediaSourcePlayerCapi::MediaSourcePlayerCapi(int player_id, - scoped_ptr demuxer, - MediaPlayerManager* manager) - : MediaPlayerEfl(player_id, manager), - demuxer_(std::move(demuxer)), - task_runner_(base::ThreadTaskRunnerHandle::Get()), - weak_this_(this), - player_(NULL), - media_type_(0), - duration_(0), - play_rate_(1.0f), - player_prepared_(false), - playing_(false), - is_end_reached_(false), - eos_audio_(false), - eos_video_(false), - error_occured_(false), - should_feed_audio_(false), - should_feed_video_(false), - seek_offset_(0), - seek_state_(MEDIA_SEEK_NONE), - media_packet_(NULL), - audio_format_(NULL), - video_format_(NULL), - weak_factory_(this) { - demuxer_->Initialize(this); - audio_buffer_queue_.clear(); - video_buffer_queue_.clear(); - - /*Init Player*/ - int ret = player_create(&player_); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - - ret = player_set_buffering_cb(player_, OnHandleBufferingMessageCB, this); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - - ret = player_set_sound_type(player_, SOUND_TYPE_MEDIA); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - ret = player_set_error_cb(player_, OnPlayerErrorCB, this); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - ret = player_set_completed_cb(player_, OnPlaybackCompleteCB, this); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - - ret = player_set_media_packet_video_frame_decoded_cb( - player_, OnMediaPacketDecoded, this); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - - player_set_display_visible(player_, true); - - ret = player_set_uri(player_, "es_buff://push_mode"); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } -} - -MediaSourcePlayerCapi::~MediaSourcePlayerCapi() { - Release(); - player_destroy(player_); -} - -void MediaSourcePlayerCapi::SeekComplete() { - DCHECK(task_runner_->BelongsToCurrentThread()); - UpdateSeekState(MEDIA_SEEK_NONE); - - // Initiate play for internal seeks. - if (GetPlayerState() != PLAYER_STATE_PLAYING) - Play(); - - manager()->OnTimeUpdate(GetPlayerId(), GetCurrentTime()); - manager()->OnTimeChanged(GetPlayerId()); -} - - -void MediaSourcePlayerCapi::UpdateSeekState(MediaSeekState state) { - switch (state) { - // Notify manager about player seek complete. - case MEDIA_SEEK_NONE: - manager()->OnSeekStateChange(GetPlayerId(), false); - break; - - // Notify manager about player seek start. - case MEDIA_SEEK_PLAYER: - manager()->OnSeekStateChange(GetPlayerId(), true); - break; - - // No need to notify manager about seek state change. - case MEDIA_SEEK_DEMUXER: - case MEDIA_SEEK_DEMUXER_DONE: - break; - - default: - NOTREACHED(); - break; - } - - seek_state_ = state; -} - -void MediaSourcePlayerCapi::SetRate(double rate) { - if (play_rate_ == rate) - return; - - if (rate == 0.0) { - play_rate_ = rate; - Pause(true); - return; - } - - // FIXME: |player_set_playback_rate| is always failing. - int err = player_set_playback_rate(player_, static_cast(rate)); - if (err != PLAYER_ERROR_NONE) { - OnHandlePlayerError(err, FROM_HERE); - return; - } else { - // If previous rate was zero and requested rate is non-zero, change the - // playback rate and call play. - if (play_rate_ == 0.0) { - play_rate_ = rate; - Play(); - } else { - play_rate_ = rate; - } - } -} - -void MediaSourcePlayerCapi::Seek(const double time) { - UpdateSeekState(MEDIA_SEEK_DEMUXER); - if (GetPlayerState() == PLAYER_STATE_PLAYING) - Pause(true); - - seek_offset_ = time; - - base::TimeDelta seek_time = base::TimeDelta::FromSecondsD(time); - demuxer_->RequestDemuxerSeek(seek_time); -} - -player_state_e MediaSourcePlayerCapi::GetPlayerState() { - player_state_e state = PLAYER_STATE_NONE; - player_get_state(player_, &state); - LOG(INFO) << __FUNCTION__ << " state " << state; - return state; -} - -void MediaSourcePlayerCapi::SeekInternal() { - if (error_occured_) - return; - - int ret = PLAYER_ERROR_NONE; - ret = player_set_play_position( - player_, ConvertSecondsToMilliSeconds(seek_offset_), - true, OnSeekCompleteCB, this); - - seek_offset_ = 0.0; - - MediaSeekState state = MEDIA_SEEK_PLAYER; - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) << "Seek to " << " failed"; - OnHandlePlayerError(ret, FROM_HERE); - state = MEDIA_SEEK_NONE; - } - UpdateSeekState(state); -} - -void MediaSourcePlayerCapi::OnDemuxerDurationChanged( - base::TimeDelta duration) { - duration_ = duration.InSecondsF(); -} - -void MediaSourcePlayerCapi::OnDemuxerSeekDone( - const base::TimeDelta& actual_browser_seek_time) { - if (error_occured_) - return; - - seek_offset_ = actual_browser_seek_time.InSecondsF(); - UpdateSeekState(MEDIA_SEEK_DEMUXER_DONE); - - audio_buffer_queue_.clear(); - video_buffer_queue_.clear(); - - OnReadDemuxedData(media::DemuxerStream::AUDIO); - OnReadDemuxedData(media::DemuxerStream::VIDEO); -} - -void MediaSourcePlayerCapi::OnMediaPacketUpdated(media_packet_h packet) { - ScopedMediaPacket packet_proxy(packet); - task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::DeliverMediaPacket, - weak_factory_.GetWeakPtr(), base::Passed(&packet_proxy))); -} - -void MediaSourcePlayerCapi::SetVolume(double volume) { - if (GetPlayerState() <= PLAYER_STATE_IDLE) - return; - - if (player_set_volume(player_, volume, volume) != PLAYER_ERROR_NONE) - LOG(ERROR) << "|player_set_volume| failed"; -} - -double MediaSourcePlayerCapi::GetCurrentTime() { - if (error_occured_) - return 0.0; - - int position = 0; - player_get_play_position(player_, &position); - return ConvertMilliSecondsToSeconds(position); -} - -void MediaSourcePlayerCapi::OnCurrentTimeUpdateTimerFired() { - manager()->OnTimeUpdate(GetPlayerId(), GetCurrentTime()); -} - -void MediaSourcePlayerCapi::StartCurrentTimeUpdateTimer() { - if (current_time_update_timer_.IsRunning()) - return; - - current_time_update_timer_.Start( - FROM_HERE, - base::TimeDelta::FromMilliseconds(kDurationUpdateInterval), - this, - &MediaSourcePlayerCapi::OnCurrentTimeUpdateTimerFired); -} - -void MediaSourcePlayerCapi::StopCurrentTimeUpdateTimer() { - if (current_time_update_timer_.IsRunning()) - current_time_update_timer_.Stop(); -} - -void MediaSourcePlayerCapi::Play() { - if (error_occured_ || playing_ || !player_prepared_) - return; - - if (play_rate_ == 0.0) { - playing_ = true; - return; - } - - WakeUpDisplayAndAcquireDisplayLock(); - - int ret = player_start(player_); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - playing_ = true; - StartCurrentTimeUpdateTimer(); -} - -void MediaSourcePlayerCapi::Pause(bool is_media_related_action) { - if (error_occured_ || !playing_) - return; - - if (GetPlayerState() != PLAYER_STATE_PLAYING) { - LOG(WARNING) << "Can't PAUSE player"; - return; - } - - int ret = player_pause(player_); - if (ret != PLAYER_ERROR_NONE) { - OnHandlePlayerError(ret, FROM_HERE); - return; - } - StopCurrentTimeUpdateTimer(); - if (!is_media_related_action) { - ReleaseDisplayLock(); - } - playing_ = false; -} - -void MediaSourcePlayerCapi::PlaybackComplete() { - double time = GetCurrentTime() != duration_ ? duration_ : GetCurrentTime(); - is_end_reached_ = true; - StopCurrentTimeUpdateTimer(); - manager()->OnTimeUpdate(GetPlayerId(), time); - manager()->OnTimeChanged(GetPlayerId()); - ReleaseDisplayLock(); -} - -// TODO(sam) : It's worked as bypass now. Need Suspend/Resume/Initialize -// implementation for MSE multiple instance. -void MediaSourcePlayerCapi::Initialize() { - manager()->OnInitComplete(GetPlayerId(), true); -} - -void MediaSourcePlayerCapi::Release() { - playing_ = false; - StopCurrentTimeUpdateTimer(); - audio_buffer_queue_.clear(); - video_buffer_queue_.clear(); - if (player_) { - player_unset_completed_cb(player_); - player_unset_media_packet_video_frame_decoded_cb(player_); - player_unprepare(player_); - } - manager()->OnSuspendComplete(GetPlayerId()); - if (media_packet_) - media_packet_destroy(media_packet_); - media_packet_ = NULL; -} - -void MediaSourcePlayerCapi::OnDemuxerConfigsAvailable( - const DemuxerConfigs& configs) { - - if (!player_) - return; - LOG(INFO) << "New width " << configs.video_size.width() - << " height " << configs.video_size.height(); - if (GetPlayerState() > PLAYER_STATE_IDLE) { - media_format_set_video_width(video_format_, configs.video_size.width()); - media_format_set_video_height(video_format_, configs.video_size.height()); - return; - } - int ret = PLAYER_ERROR_NONE; - - if ((configs.video_codec == kUnknownVideoCodec || - configs.video_codec != kCodecH264) && - (configs.audio_codec == kUnknownAudioCodec || - (configs.audio_codec != kCodecAAC && - configs.audio_codec != kCodecMP3))) { - LOG(ERROR) << "Audio and Video codecs not supported for MediaSource"; - OnHandlePlayerError(PLAYER_ERROR_NOT_SUPPORTED_FILE, FROM_HERE); - return; - } - int samplerate = configs.audio_sampling_rate; - int channel = configs.audio_channels; - width_ = configs.video_size.width(); - height_ = configs.video_size.height(); - - ret = media_format_create(&audio_format_); - if (ret != MEDIA_FORMAT_ERROR_NONE) { - LOG(ERROR) << "media_format_create : 0x" << ret; - return; - } - - media_format_mimetype_e audiomimeType = MEDIA_FORMAT_MP3; - if (configs.audio_codec == kCodecAAC) - audiomimeType = MEDIA_FORMAT_AAC; - - LOG(INFO) << "samplerate: " << samplerate - << ", channel: " << channel - << ", audiomimeType: " << audiomimeType; - - media_format_set_audio_mime(audio_format_, audiomimeType); - media_format_set_audio_channel(audio_format_, channel); - media_format_set_audio_samplerate(audio_format_, samplerate); - - ret = player_set_media_stream_info(player_, PLAYER_STREAM_TYPE_AUDIO, - audio_format_); - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) << "player_set_audio_stream_info Error: " << ret; - return; - } - ret = player_set_media_stream_buffer_status_cb(player_, - PLAYER_STREAM_TYPE_AUDIO, - OnCapiAudioBufStatusCB, - this); - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) << "player set audio buffer status cb failed :" << ret; - return; - } - - ret = media_format_create(&video_format_); - if (ret != MEDIA_FORMAT_ERROR_NONE) { - LOG(ERROR) << "media_format_create : 0x" << ret; - return; - } - - media_format_mimetype_e videomimeType = MEDIA_FORMAT_H264_SP; - - media_format_set_video_mime(video_format_, videomimeType); - media_format_set_video_width(video_format_, width_); - media_format_set_video_height(video_format_, height_); - - LOG(INFO) << "width: " << width_ - << ", height: " << height_ - << ", videomimeType: " << videomimeType; - - ret = player_set_media_stream_info(player_, - PLAYER_STREAM_TYPE_VIDEO, - video_format_); - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) << "player_set_video_stream_info Error: " << ret; - return; - } - - // FIXME(Kodam): This property should be updated based on dynamic - // resolution change - player_set_media_stream_buffer_max_size( - player_, PLAYER_STREAM_TYPE_VIDEO, max_size); - player_set_media_stream_buffer_min_threshold( - player_, PLAYER_STREAM_TYPE_VIDEO, min_threshold); - ret = player_set_media_stream_buffer_status_cb(player_, - PLAYER_STREAM_TYPE_VIDEO, - OnCapiVideoBufStatusCB, - this); - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) << "player set video buffer status cb failed : 0x" << ret; - return; - } - - // Audio stream is present if sample rate is valid. - if (samplerate > 0) - media_type_ |= MEDIA_AUDIO_MASK; - - // Video stream is present if both video width and height are valid. - if (width_ > 0 && height_ > 0) - media_type_ |= MEDIA_VIDEO_MASK; - - manager()->OnMediaDataChange(GetPlayerId(), width_, height_, media_type_); - manager()->OnReadyStateChange( - GetPlayerId(), blink::WebMediaPlayer::ReadyStateHaveMetadata); - - if (GetPlayerState() == PLAYER_STATE_IDLE) { - ret = player_prepare_async(player_, OnCapiPlayerPreparedCB, this); - if (ret != PLAYER_ERROR_NONE) { - LOG(ERROR) <<"player prepare failed : 0x " << ret; - return; - } - } - - // TODO(Venu): Need to check where is the exact place for this code. - // For make it work added this below code - // TODO(max): We have a contradiction here. - // To Complete preparing the capi-player, we have to get the first frame - // But to get the first frame we have to set readyState to EnoughData, - // even we are not ready for play(Setting the Enoughdata make HTML - // think that player is ready for play) - // We have to make some hack to get/set the first frame without notifying - // to HTML. - manager()->OnReadyStateChange( - GetPlayerId(), blink::WebMediaPlayer::ReadyStateHaveEnoughData); -} - -// Helper method that prints error occured with CAPI. -void MediaSourcePlayerCapi::OnMediaError(MediaError error_type) { - StopCurrentTimeUpdateTimer(); - MediaPlayerEfl::OnMediaError(error_type); -} - -void MediaSourcePlayerCapi::ReadDemuxedData( - media::DemuxerStream::Type type) { - demuxer_->RequestDemuxerData(type); -} - -void MediaSourcePlayerCapi::HandleBufferingMessage(int percent) { - // FIXME: add code if required - return; -} - -void MediaSourcePlayerCapi::HandleUnderFlowStatus( - media::DemuxerStream::Type type, bool underflow_status) { - if (underflow_status) { - if (type == media::DemuxerStream::VIDEO) { - should_feed_video_ = underflow_status; - LOG(INFO) << "Video Underflow " << should_feed_video_ - << " call CAPI Pause"; - } else if (type == media::DemuxerStream::AUDIO) { - should_feed_audio_ = underflow_status; - LOG(INFO) << "Audio Underflow " << should_feed_audio_ - << " call CAPI Pause"; - } - if (player_prepared_) { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::Pause, - weak_factory_.GetWeakPtr(), true)); - } - task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourcePlayerCapi::ReadDemuxedData, - weak_factory_.GetWeakPtr(), type)); - } else if (!underflow_status) { - if (type == media::DemuxerStream::VIDEO) { - should_feed_video_ = underflow_status; - LOG(INFO) << "Video Overflow " << should_feed_video_ - << " call CAPI Play"; - } else if (type == media::DemuxerStream::AUDIO) { - should_feed_audio_ = underflow_status; - LOG(INFO) << "Audio Overflow " << should_feed_audio_ - << " call CAPI Play"; - } - - // FIXME(Kodam): Distinguish from user triggered PAUSE. - if ((!should_feed_audio_ || eos_audio_) && - (!should_feed_video_ || eos_video_)) { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::Play, - weak_factory_.GetWeakPtr())); - } - } -} - - -void MediaSourcePlayerCapi::OnDemuxerDataAvailable( - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) { - if (error_occured_) { - LOG(ERROR) << "error occured"; - return; - } - - if (meta_data.status != media::DemuxerStream::kOk || - meta_data.end_of_stream) - BufferMetaDataAvailable(meta_data); - - if (seek_state_ == MEDIA_SEEK_DEMUXER_DONE) { - // Seek either reached to eos or buffered enough data to seek. - if (meta_data.end_of_stream || - (seek_offset_ + kSeekBufferingWaitInSec) <= - meta_data.timestamp.InSecondsF()) { - SeekInternal(); - } - } - - if (meta_data.size <= 0) { - LOG(ERROR) << "ERROR : Size of shared memory is Zero"; - return; - } - ReadFromQueueIfAny(meta_data.type); - - if (meta_data.type == media::DemuxerStream::AUDIO && !should_feed_audio_) { - // Why store the DecoderBuffer? we have requested for buffer - // from demuxer but gstreamer asked to stop. So need to save - // this buffer and use it on next |need_data| call. - SaveDecoderBuffer(foreign_memory_handle, meta_data); - return; - } - if (meta_data.type == media::DemuxerStream::VIDEO && !should_feed_video_) { - SaveDecoderBuffer(foreign_memory_handle, meta_data); - return; - } - - // Wrapping each frame and deleting shared memory using callback - // will not work as possibility of Gstreamer retaining frames (such as - // 'i' frames) is high. In that case shared memory will crash. So, we - // copy frames and release shared memory right away. - - base::SharedMemory shared_memory(foreign_memory_handle, false); - if (!shared_memory.Map(meta_data.size)) { - LOG(ERROR) << "Failed to map shared memory of size " << meta_data.size; - return; - } - - if (meta_data.type == media::DemuxerStream::AUDIO) { - if (media_packet_create_from_external_memory( - audio_format_, static_cast(shared_memory.memory()), - meta_data.size, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Audio media_packet_create_from_external_memory failed"; - return; - } - } else if (meta_data.type == media::DemuxerStream::VIDEO) { - if (media_packet_create_from_external_memory( - video_format_, static_cast(shared_memory.memory()), - meta_data.size, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Video media_packet_create_from_external_memory failed"; - return; - } - } - - if (media_packet_set_pts(media_packet_, meta_data.timestamp.InMilliseconds()) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "media_packet_set_pts failed"; - return; - } - if (player_push_media_stream(player_, media_packet_) - != MEDIA_PACKET_ERROR_NONE) - LOG(ERROR) << "player_push_media_stream failed"; - - if (meta_data.type == media::DemuxerStream::AUDIO) - media_format_unref(audio_format_); - else if (meta_data.type == media::DemuxerStream::VIDEO) - media_format_unref(video_format_); - - if (media_packet_) - media_packet_destroy(media_packet_); - media_packet_ = NULL; - - if (meta_data.type == media::DemuxerStream::AUDIO) - OnReadDemuxedData(media::DemuxerStream::AUDIO); - else if (meta_data.type == media::DemuxerStream::VIDEO) - OnReadDemuxedData(media::DemuxerStream::VIDEO); - return; -} - -void MediaSourcePlayerCapi::BufferMetaDataAvailable( - const media::DemuxedBufferMetaData& meta_data) { - LOG(INFO) << __FUNCTION__ << " meta_data.type " << meta_data.type; - if (error_occured_) { - LOG(ERROR) << "Pipeline_ null or error occured"; - return; - } - - switch (meta_data.status) { - case media::DemuxerStream::kAborted: - LOG(WARNING) << "[BROWSER] : DemuxerStream::kAborted, Stream type = " - << meta_data.type; - case media::DemuxerStream::kConfigChanged: - if (meta_data.type == media::DemuxerStream::AUDIO) - OnReadDemuxedData(media::DemuxerStream::AUDIO); - else if (meta_data.type == media::DemuxerStream::VIDEO) - OnReadDemuxedData(media::DemuxerStream::VIDEO); - break; - - case media::DemuxerStream::kOk: - if (meta_data.end_of_stream) { - ReadFromQueueIfAny(meta_data.type); - LOG(INFO) <<"[BROWSER] : DemuxerStream::kOk but |end_of_stream|"; - SendEosToCapi(meta_data); - if (!playing_) - Play(); - } - break; - - default: - NOTREACHED(); - } -} - -void MediaSourcePlayerCapi::SendEosToCapi( - const media::DemuxedBufferMetaData& meta_data) { - if (meta_data.type == media::DemuxerStream::AUDIO) { - if (!eos_audio_) { - if (media_packet_create(audio_format_, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Audio media_packet_create failed"; - return; - } - eos_audio_ = true; - } else { - LOG(ERROR) << "Audio EOS Already Pushed"; - return; - } - } else if (meta_data.type == media::DemuxerStream::VIDEO) { - if (!eos_video_) { - if (media_packet_create(video_format_, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Video media_packet_create failed"; - return; - } - eos_video_ = true; - } else { - LOG(ERROR) << "Video EOS Already Pushed"; - return; - } - } - - if (media_packet_set_flags(media_packet_, MEDIA_PACKET_END_OF_STREAM) - != MEDIA_PACKET_ERROR_NONE) - LOG(ERROR) << "media_packet_set_flags failed"; - - if (player_push_media_stream(player_, media_packet_) - != MEDIA_PACKET_ERROR_NONE) - LOG(ERROR) << "player_push_media_stream failed"; - - if (meta_data.type == media::DemuxerStream::AUDIO) - media_format_unref(audio_format_); - else if (meta_data.type == media::DemuxerStream::VIDEO) - media_format_unref(video_format_); - - if (media_packet_) - media_packet_destroy(media_packet_); - media_packet_ = NULL; -} - -void MediaSourcePlayerCapi::ReadFromQueueIfAny( - DemuxerStream::Type type) { - if (error_occured_) { - LOG(ERROR) << "error occured in capi"; - return; - } - - if (type == media::DemuxerStream::AUDIO) { - if (audio_buffer_queue_.empty() || !should_feed_audio_) - return; - } - - if (type == media::DemuxerStream::VIDEO) { - if (video_buffer_queue_.empty() || !should_feed_video_) - return; - } - - scoped_refptr decoder_buffer; - - if (type == media::DemuxerStream::AUDIO) { - decoder_buffer = audio_buffer_queue_.front(); - audio_buffer_queue_.pop_front(); - } else if (type == media::DemuxerStream::VIDEO) { - decoder_buffer = video_buffer_queue_.front(); - video_buffer_queue_.pop_front(); - } - uint64 size = static_cast(decoder_buffer.get()->data_size()); - - uint64 timestamp = - static_cast(decoder_buffer.get()->timestamp().InMilliseconds()); - if (type == media::DemuxerStream::AUDIO) { - if (media_packet_create_from_external_memory( - audio_format_, - static_cast(decoder_buffer.get()->writable_data()), - size, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Audio media_packet_create_from_external_memory failed"; - return; - } - } else if (type == media::DemuxerStream::VIDEO) { - if (media_packet_create_from_external_memory( - video_format_, - static_cast(decoder_buffer.get()->writable_data()), - size, NULL, NULL, &media_packet_) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "Video media_packet_create_from_external_memory failed"; - return; - } - } - - if (media_packet_set_pts(media_packet_, timestamp) - != MEDIA_PACKET_ERROR_NONE) { - LOG(ERROR) << "media_packet_set_pts failed"; - return; - } - - if (player_push_media_stream(player_, media_packet_) - != MEDIA_PACKET_ERROR_NONE) - LOG(ERROR) << "player_push_media_stream failed"; - - if (type == media::DemuxerStream::AUDIO) - media_format_unref(audio_format_); - else if (type == media::DemuxerStream::VIDEO) - media_format_unref(video_format_); - - // Empty the Buffer before reading the new buffer from render process. - if (media_packet_) - media_packet_destroy(media_packet_); - media_packet_ = NULL; - - ReadFromQueueIfAny(type); - return; -} - -void MediaSourcePlayerCapi::SaveDecoderBuffer( - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) { - if (error_occured_) { - LOG(ERROR) << "Error occured in capi"; - return; - } - - base::SharedMemory shared_memory(foreign_memory_handle, false); - if (!shared_memory.Map(meta_data.size)) { - LOG(ERROR) << "Failed to map shared memory of size " << meta_data.size; - return; - } - scoped_refptr buffer; - buffer = DecoderBuffer::CopyFrom(static_cast ( - shared_memory.memory()), meta_data.size); - - if (!buffer.get()) { - LOG(ERROR) << "DecoderBuffer::CopyFrom failed"; - return; - } - - buffer->set_timestamp(meta_data.timestamp); - buffer->set_duration(meta_data.time_duration); - - if (meta_data.type == media::DemuxerStream::AUDIO) - audio_buffer_queue_.push_back(buffer); - else if (meta_data.type == media::DemuxerStream::VIDEO) - video_buffer_queue_.push_back(buffer); -} - -void MediaSourcePlayerCapi::OnPrepareComplete() { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::PrepareComplete, - weak_factory_.GetWeakPtr())); -} - -void MediaSourcePlayerCapi::OnPlaybackComplete() { - task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourcePlayerCapi::PlaybackComplete, - weak_factory_.GetWeakPtr())); -} - -void MediaSourcePlayerCapi::OnSeekComplete() { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::SeekComplete, - weak_factory_.GetWeakPtr())); -} - -void MediaSourcePlayerCapi::OnHandleBufferingMessage(int percent) { - task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaSourcePlayerCapi::HandleBufferingMessage, - weak_factory_.GetWeakPtr(), percent)); -} - -void MediaSourcePlayerCapi::OnReadDemuxedData( - media::DemuxerStream::Type type) { - task_runner_->PostTask(FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::ReadDemuxedData, - weak_factory_.GetWeakPtr(), type)); -} - -void MediaSourcePlayerCapi::OnUpdateDataStatus( - media::DemuxerStream::Type type, bool underflow_status) { - task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&MediaSourcePlayerCapi::HandleUnderFlowStatus, - weak_factory_.GetWeakPtr(), type, underflow_status)); -} - -void MediaSourcePlayerCapi::OnHandlePlayerError( - int player_error_code, const tracked_objects::Location& location) { - - LOG(ERROR) << GetErrorString(player_error_code) << " from " - << location.ToString(); - - OnMediaError(GetMediaError(player_error_code)); -} - -} // namespace media diff --git a/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.h b/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.h deleted file mode 100644 index 16b3c09..0000000 --- a/tizen_src/chromium_impl/media/base/tizen/media_source_player_capi.h +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_TIZEN_MEDIA_SOURCE_PLAYER_CAPI_H_ -#define MEDIA_BASE_TIZEN_MEDIA_SOURCE_PLAYER_CAPI_H_ - -#include - -#include "base/cancelable_callback.h" -#include "base/threading/thread.h" -#include "base/time/default_tick_clock.h" -#include "base/timer/timer.h" -#include "media/base/decoder_buffer.h" -#include "media/base/efl/demuxer_efl.h" -#include "media/base/efl/media_player_efl.h" -#include "media/base/efl/media_player_util_efl.h" -#include "third_party/blink/public/platform/WebMediaPlayer.h" - -namespace media { - -// This class handles media source extensions for CAPI port. -class MEDIA_EXPORT MediaSourcePlayerCapi : public MediaPlayerEfl, - public DemuxerEflClient { - public: - // Constructs a player with the given ID and demuxer. |manager| must outlive - // the lifetime of this object. - MediaSourcePlayerCapi(int player_id, - std::unique_ptr demuxer, - MediaPlayerManager* manager); - MediaSourcePlayerCapi(const MediaSourcePlayerCapi&) = delete; - MediaSourcePlayerCapi& operator=(const MediaSourcePlayerCapi&) = delete; - ~MediaSourcePlayerCapi() override; - - MediaSourcePlayerCapi(const MediaSourcePlayerCapi&) = delete; - MediaSourcePlayerCapi& operator=(const MediaSourcePlayerCapi&) = delete; - - // MediaPlayerEfl implementation. - void Play() override; - void Pause(bool is_media_related_action) override; - void SetRate(double rate) override; - void Seek(const double time) override; - void SetVolume(double volume) override; - double GetCurrentTime() override; - void Initialize() override; - - // DemuxerEflClient implementation. - void OnDemuxerConfigsAvailable(const DemuxerConfigs& params) override; - void OnDemuxerDataAvailable( - base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data) override; - void OnDemuxerSeekDone( - const base::TimeDelta& actual_browser_seek_time) override; - void OnDemuxerDurationChanged(base::TimeDelta duration) override; - - // To handle CAPI callbacks. - void OnReadDemuxedData(media::DemuxerStream::Type type); - void OnUpdateDataStatus(media::DemuxerStream::Type type, - bool underflow_status); - void OnSeekComplete(); - void OnHandleBufferingMessage(int percent); - void OnPlaybackComplete(); - void OnPrepareComplete(); - void OnHandlePlayerError(int player_error_code, - const tracked_objects::Location& loc); - - void OnMediaPacketUpdated(media_packet_h packet); - - protected: - void Release() override; - void OnMediaError(MediaError error_type) override; - - private: - player_state_e GetPlayerState(); - void PrepareComplete(); - - // For internal seeks. - void SeekInternal(); - void UpdateSeekState(MediaSeekState state); - void SeekComplete(); - - void BufferMetaDataAvailable(const media::DemuxedBufferMetaData& meta_data); - void ReadDemuxedData(media::DemuxerStream::Type type); - void HandleBufferingMessage(int percent); - - // To handle buffer underflow CB. - void HandleUnderFlowStatus(media::DemuxerStream::Type type, - bool underflow_status); - - void PlaybackComplete(); - void SendEosToCapi(const media::DemuxedBufferMetaData& meta_data); - - // |current_time_update_timer_| related - void OnCurrentTimeUpdateTimerFired(); - void StartCurrentTimeUpdateTimer(); - void StopCurrentTimeUpdateTimer(); - - void ReadFromQueueIfAny(DemuxerStream::Type type); - void SaveDecoderBuffer(base::SharedMemoryHandle foreign_memory_handle, - const media::DemuxedBufferMetaData& meta_data); - - std::unique_ptr demuxer_; - const scoped_refptr task_runner_; - - // Weak pointer passed to media decoder jobs for callbacks. - base::WeakPtrFactory weak_this_; - - player_h player_; - int media_type_; - double duration_; - double play_rate_; - - bool player_prepared_; - bool playing_; - bool is_end_reached_; - bool eos_audio_; - bool eos_video_; - bool error_occured_; - - // Will allow to listen to |prepare-xid| message only once. - bool should_feed_audio_; - bool should_feed_video_; - - double seek_offset_; - MediaSeekState seek_state_; - - media_packet_h media_packet_; - - // FIXME(Venu): Make them a smart pointer to avoid leak. - media_format_h audio_format_; - media_format_h video_format_; - - base::RepeatingTimer current_time_update_timer_; - - std::deque > audio_buffer_queue_; - std::deque > video_buffer_queue_; - - base::WeakPtrFactory weak_factory_; -}; - -} // namespace media - -#endif // MEDIA_BASE_TIZEN_MEDIA_SOURCE_PLAYER_CAPI_H_ diff --git a/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.cc b/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.cc deleted file mode 100644 index ce7904f..0000000 --- a/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.cc +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "media/base/tizen/webaudio_decoder_browser_capi.h" - -#include "base/bind.h" -#include "base/logging.h" -#include "media/base/efl/webaudio_media_codec_info_efl.h" - -namespace { - -const int kChannelCount = 2; - -const int kSampleRate = 44100; - -struct ErrorList { - player_error_e error_code; - std::string error_message; -}; - -// FIXME: Move to common place -const struct ErrorList errorlist[] = { - {PLAYER_ERROR_OUT_OF_MEMORY, "PLAYER_ERROR_OUT_OF_MEMORY"}, - {PLAYER_ERROR_INVALID_PARAMETER, "PLAYER_ERROR_INVALID_PARAMETER"}, - {PLAYER_ERROR_NO_SUCH_FILE, "PLAYER_ERROR_NO_SUCH_FILE"}, - {PLAYER_ERROR_INVALID_OPERATION, "PLAYER_ERROR_INVALID_OPERATION"}, - {PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE, - "PLAYER_ERROR_FILE_NO_SPACE_ON_DEVICE"}, - {PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE, - "PLAYER_ERROR_FEATURE_NOT_SUPPORTED_ON_DEVICE"}, - {PLAYER_ERROR_SEEK_FAILED, "PLAYER_ERROR_SEEK_FAILED"}, - {PLAYER_ERROR_INVALID_STATE, "PLAYER_ERROR_INVALID_STATE"}, - {PLAYER_ERROR_NOT_SUPPORTED_FILE, "PLAYER_ERROR_NOT_SUPPORTED_FILE"}, - {PLAYER_ERROR_INVALID_URI, "PLAYER_ERROR_INVALID_URI"}, - {PLAYER_ERROR_SOUND_POLICY, "PLAYER_ERROR_SOUND_POLICY"}, - {PLAYER_ERROR_CONNECTION_FAILED, "PLAYER_ERROR_CONNECTION_FAILED"}, - {PLAYER_ERROR_VIDEO_CAPTURE_FAILED, "PLAYER_ERROR_VIDEO_CAPTURE_FAILED"}, - {PLAYER_ERROR_DRM_EXPIRED, "PLAYER_ERROR_DRM_EXPIRED"}, - {PLAYER_ERROR_DRM_NO_LICENSE, "PLAYER_ERROR_DRM_NO_LICENSE"}, - {PLAYER_ERROR_DRM_FUTURE_USE, "PLAYER_ERROR_DRM_FUTURE_USE"}, - {PLAYER_ERROR_DRM_NOT_PERMITTED, "PLAYER_ERROR_DRM_NOT_PERMITTED"}, - {PLAYER_ERROR_RESOURCE_LIMIT, "PLAYER_ERROR_RESOURCE_LIMIT"}, - {PLAYER_ERROR_PERMISSION_DENIED, "PLAYER_ERROR_PERMISSION_DENIED"}}; - -const int ERROR_MAX = sizeof(errorlist) / sizeof(errorlist[0]); - -static void PlayerPreparedCb(void* data) { - media::AudioDecoderCapi* player = - static_cast(data); - if (!player) - return; - player->OnPlayerPrepared(); -} - -static void PlayerDecodedBufferReadyCb(player_audio_raw_data_s* audio_data, - void* data) { - media::AudioDecoderCapi* player = - static_cast(data); - if (!player) - return; - player->OnPlayerDecodedBufferReady(audio_data); -} - -static void PlayerEosCb(void* data) { - media::AudioDecoderCapi* player = - static_cast(data); - if (!player) - return; - player->OnPlayerEos(); -} - -static void PlayerErrorCb(int error_code, void* data) { - media::AudioDecoderCapi* player = - static_cast(data); - if (!player) - return; - player->OnPlayerError(error_code, "PlayerErrorCb"); -} - -} // namespace - -namespace media { - -struct WAPCMdata{ - uint8_t* data_; - int rate_; - int size_; - int channel_mask_; - WAPCMdata(int rate, int size, int channel_mask) - : data_(NULL), - rate_(rate), - size_(size), - channel_mask_(channel_mask) {} -}; - -AudioDecoderCapi::AudioDecoderCapi( - base::FileDescriptor pcm_output, - uint8_t* data, - uint32_t data_size) - : decoder_thread_("CAPIAudioDecoder"), - player_(NULL), - pcm_output_(pcm_output.fd), - data_size_(data_size), - encoded_data_(data), - is_new_request_(true), - is_running_(true) { -} - -AudioDecoderCapi::~AudioDecoderCapi() { - if (player_) { - player_unset_error_cb(player_); - player_unset_completed_cb(player_); - player_unprepare(player_); - player_destroy(player_); - } - player_ = NULL; - if (decoder_thread_.IsRunning()) - decoder_thread_.Stop(); - - close(pcm_output_); -} - -void AudioDecoderCapi::InitializePlayer() { - int error = player_create(&player_); - if (error != PLAYER_ERROR_NONE) { - PlayerError(error, "player_create"); - return; - } - - player_set_completed_cb(player_, PlayerEosCb, this); - player_set_error_cb(player_, PlayerErrorCb, this); - player_set_pcm_extraction_mode(player_, false, - PlayerDecodedBufferReadyCb, this); - - player_set_pcm_spec(player_, "F32LE", kSampleRate, kChannelCount); - - error = player_set_memory_buffer(player_, encoded_data_, data_size_); - if (error != PLAYER_ERROR_NONE) { - PlayerError(error, "player_set_memory_buffer"); - return; - } - - error = player_prepare_async(player_, PlayerPreparedCb, this); - if (error != PLAYER_ERROR_NONE) { - PlayerError(error, "player_prepare_async"); - return; - } -} - -void AudioDecoderCapi::StartDecodeProcess() { - InitializePlayer(); -} - -void AudioDecoderCapi::PlayerPrepared() { - int error = player_start(player_); - if (error != PLAYER_ERROR_NONE) - PlayerError(error, "player_start()"); -} - -static void SendData(const int pcm_out, WAPCMdata* audio_data) { - if (!audio_data) - return; - uint8_t* data = audio_data->data_; - int data_size = audio_data->size_; - while (data_size > 0) { - int bytes_to_write = (data_size >= PIPE_BUF) ? PIPE_BUF : data_size; - media::WebAudioMediaDataInfoEfl data_info(audio_data->channel_mask_, - bytes_to_write); - HANDLE_EINTR(write(pcm_out, &data_info, sizeof(data_info))); - ssize_t bytes_written = HANDLE_EINTR(write(pcm_out, data, bytes_to_write)); - if (bytes_written == -1) { - LOG(ERROR) << "Write Failed\n"; - break; - } - data_size -= bytes_written; - data += bytes_written; - } -} - -void AudioDecoderCapi::PlayerDecodedBufferReady(WAPCMdata* audio_data) { - if (audio_data->size_ <= 0) { - LOG(ERROR) << "Decoded buffer size is invalid"; - return; - } - - if (is_new_request_) { - // TODO: How to handle more than 2 channels - media::WebAudioMediaCodecInfoEfl info( - static_cast(kChannelCount), - static_cast(audio_data->rate_), - static_cast((audio_data->size_ / sizeof(float)))); - - HANDLE_EINTR(write(pcm_output_, &info, sizeof(info))); - is_new_request_ = false; - } - SendData(pcm_output_, audio_data); - delete[] (audio_data->data_); - delete(audio_data); -} - -void AudioDecoderCapi::PlayerEos() { - is_running_ = false; -} - -void AudioDecoderCapi::PlayerError(int err, char const* from) { - for (int index = 0; index < ERROR_MAX; ++index) { - if (errorlist[index].error_code == err) { - LOG(ERROR) << "Stoping decoding due to error code : " << err - << " Error message : " << errorlist[index].error_message - << " from " << from; - break; - } - } - - is_running_ = false; -} - -void AudioDecoderCapi::OnPlayerPrepared() { - decoder_thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&AudioDecoderCapi::PlayerPrepared, - base::Unretained(this))); -} - -void AudioDecoderCapi::OnPlayerDecodedBufferReady( - player_audio_raw_data_s* audio_data) { - DCHECK(!decoder_thread_.IsRunning()); - - // The buffer is resued by CAPI in next iteration, - // this leaves junk data in it hence making local copy. - WAPCMdata* localdata = new WAPCMdata(audio_data->rate, - audio_data->size, - audio_data->channel_mask); - localdata->data_ = new uint8_t[localdata->size_]; - memcpy(localdata->data_, audio_data->data, localdata->size_); - - decoder_thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&AudioDecoderCapi::PlayerDecodedBufferReady, - base::Unretained(this), localdata)); -} - -void AudioDecoderCapi::OnPlayerEos() { - decoder_thread_.task_runner()->PostTask( - FROM_HERE, - base::BindOnce(&AudioDecoderCapi::PlayerEos, base::Unretained(this))); -} - -void AudioDecoderCapi::OnPlayerError(int error_code, const char* msg) { - decoder_thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&AudioDecoderCapi::PlayerError, - base::Unretained(this), error_code, msg)); -} - -void AudioDecoderCapi::OnStartDecodeProcess() { - if (!decoder_thread_.IsRunning() && !decoder_thread_.Start()) { - LOG(ERROR) << "Decoder thread start failed"; - return; - } - - decoder_thread_.message_loop()->PostTask( - FROM_HERE, base::BindOnce(&AudioDecoderCapi::StartDecodeProcess, - base::Unretained(this))); - - // TODO(kodam): Need to refactor this class not to use usleep(10) in here. - while (is_running_) - usleep(10); -} - -// WebAudioDecoderCapi class -WebAudioDecoder* WebAudioDecoder::GetWebAudioDecoder(){ - return WebAudioDecoderCapi::GetInstance(); -} - -// static -WebAudioDecoderCapi* WebAudioDecoderCapi::GetInstance() { - return base::Singleton::get(); -} - -WebAudioDecoderCapi::WebAudioDecoderCapi() - : capi_thread_("CapiThread") { -} - -WebAudioDecoderCapi::~WebAudioDecoderCapi() { -} - -void WebAudioDecoderCapi::DecodeUsingCAPI( - base::SharedMemoryHandle foreign_memory_handle, - base::FileDescriptor pcm_output, - uint32_t data_size) { - base::SharedMemory shared_memory(foreign_memory_handle, false); - if (!shared_memory.Map(data_size)) { - LOG(ERROR) << "Failed to map shared memory for size " << data_size; - return; - } - - // This will execute until decoding is done - AudioDecoderCapi capi_Decoder(pcm_output, - static_cast(shared_memory.memory()), - data_size); - capi_Decoder.OnStartDecodeProcess(); -} - -void WebAudioDecoderCapi::EncodedDataReceived( - base::SharedMemoryHandle memory_handle, - base::FileDescriptor pcm_output, - uint32_t data_size) { - if (!capi_thread_.IsRunning() && !capi_thread_.Start()) { - LOG(ERROR) << "Starting capi thread failed"; - return; - } - - capi_thread_.message_loop()->PostTask( - FROM_HERE, base::BindOnce(&WebAudioDecoderCapi::DecodeUsingCAPI, - base::Unretained(this), memory_handle, - pcm_output, data_size)); -} - -} // namespace media diff --git a/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.h b/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.h deleted file mode 100644 index 147cd62..0000000 --- a/tizen_src/chromium_impl/media/base/tizen/webaudio_decoder_browser_capi.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2015 Samsung Electronics Inc. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_BASE_TIZEN_WEBAUDIO_DECODER_BROWSER_CAPI_H_ -#define MEDIA_BASE_TIZEN_WEBAUDIO_DECODER_BROWSER_CAPI_H_ - -#include -#include - -#include "base/memory/singleton.h" -#include "base/memory/shared_memory.h" -#include "base/threading/thread.h" -#include "media/base/efl/webaudio_decoder_efl.h" -#include "media/base/media_export.h" - -namespace media { - -struct WAPCMdata; - -// WebAudioDecoderCapi class -class MEDIA_EXPORT WebAudioDecoderCapi : public WebAudioDecoder { - public: - static WebAudioDecoderCapi* GetInstance(); - virtual ~WebAudioDecoderCapi(); - - WebAudioDecoderCapi(const WebAudioDecoderCapi&) = delete; - WebAudioDecoderCapi& operator=(const WebAudioDecoderCapi&) = delete; - - // media::WebAudioDecoder implementation. - void EncodedDataReceived(base::SharedMemoryHandle memory_handle, - base::FileDescriptor pcm_output, - uint32_t data_size) override; - - private: - friend struct base::DefaultSingletonTraits; - WebAudioDecoderCapi(); - void DecodeUsingCAPI(base::SharedMemoryHandle foreign_memory_handle, - base::FileDescriptor pcm_output, - uint32_t data_size); - - base::Thread capi_thread_; -}; - -class AudioDecoderCapi { - public: - AudioDecoderCapi(base::FileDescriptor pcm_output, uint8_t* data, - uint32_t data_size); - virtual ~AudioDecoderCapi(); - void OnPlayerPrepared(); - void OnPlayerDecodedBufferReady(player_audio_raw_data_s* pcm_data); - void OnPlayerEos(); - void OnPlayerError(int error_code, const char* msg); - void OnStartDecodeProcess(); - - private: - void InitializePlayer(); - void StartDecodeProcess(); - - void PlayerPrepared(); - void PlayerDecodedBufferReady(WAPCMdata* pcm_data); - void PlayerEos(); - void PlayerError(int error_code, const char* msg); - - private: - base::Thread decoder_thread_; - - // CAPI player handle. - player_h player_; - - // The audio file information and decoded pcm data are written to - // this file descriptor. We take ownership of this descriptor. - int pcm_output_; - - // The length of the encoded data. - uint32_t data_size_; - - // Encoded audio data. - uint8_t* encoded_data_; - - bool is_new_request_; - bool is_running_; -}; - -} // namespace media - -#endif // MEDIA_BASE_TIZEN_WEBAUDIO_DECODER_BROWSER_CAPI_H_ diff --git a/tizen_src/chromium_impl/media/media_efl.gni b/tizen_src/chromium_impl/media/media_efl.gni index 8227060..7a06278 100644 --- a/tizen_src/chromium_impl/media/media_efl.gni +++ b/tizen_src/chromium_impl/media/media_efl.gni @@ -17,78 +17,6 @@ if (use_ozone) { external_media_efl_deps += [ "//tizen_src/chromium_impl/ui/ozone:ozone_efl" ] } -if (tizen_multimedia_support) { - external_media_efl_deps += [ - "//tizen_src/build:capi-media-audio-io", - "//tizen_src/build:capi-media-camera", - "//tizen_src/build:capi-media-player", - "//tizen_src/build:ecore", - "//tizen_src/build:libcapi-media-audio-io", - "//tizen_src/build:libcapi-media-camera", - "//tizen_src/build:libcapi-media-player", - "//tizen_src/build:libecore", - "//tizen_src/build:mm_player", - ] - - if (!use_wayland) { - external_media_efl_deps += [ - "//tizen_src/build:ecore-x", - "//tizen_src/build:libecore-x", - "//ui/gl:gl", - ] - } else { - external_media_efl_deps += [ "//tizen_src/build:ecore-wayland" ] - external_media_efl_deps += [ "//tizen_src/build:libecore-wayland" ] - } - - if (is_tizen) { - external_media_efl_deps += [ "//tizen_src/build:capi-system-device" ] - external_media_efl_deps += [ "//tizen_src/build:libcapi-system-device" ] - } - - external_media_efl_sources += [ - "audio/tizen/audio_manager_capi.cc", - "audio/tizen/audio_manager_capi.h", - "audio/tizen/audio_manager_tizen.cc", - "audio/tizen/capi_audio_input.cc", - "audio/tizen/capi_audio_input.h", - "audio/tizen/capi_audio_output.cc", - "audio/tizen/capi_audio_output.h", - "audio/tizen/capi_util.cc", - "audio/tizen/capi_util.h", - "base/efl/demuxer_efl.h", - "base/efl/demuxer_stream_player_params_efl.cc", - "base/efl/demuxer_stream_player_params_efl.h", - "base/efl/media_player_efl.cc", - "base/efl/media_player_efl.h", - "base/efl/media_player_manager_efl.h", - "base/efl/media_player_util_efl.cc", - "base/efl/media_player_util_efl.h", - "base/efl/webaudio_decoder_efl.h", - "base/efl/webaudio_media_codec_info_efl.h", - "base/tizen/media_player_bridge_capi.cc", - "base/tizen/media_player_bridge_capi.h", - "base/tizen/media_source_player_capi.cc", - "base/tizen/media_source_player_capi.h", - "base/tizen/webaudio_decoder_browser_capi.cc", - "base/tizen/webaudio_decoder_browser_capi.h", - "capture/video/tizen/video_capture_device_factory_tizen.cc", - "capture/video/tizen/video_capture_device_factory_tizen.h", - "capture/video/tizen/video_capture_device_tizen.cc", - "capture/video/tizen/video_capture_device_tizen.h", - ] - - external_exclude_media_efl_sources += [ - "audio/linux/audio_manager_linux.cc", - "capture/video/linux/video_capture_device_factory_linux.cc", - "capture/video/linux/video_capture_device_factory_linux.h", - "capture/video/linux/video_capture_device_linux.cc", - "capture/video/linux/video_capture_device_linux.h", - ] - - external_media_efl_config += [ ":media_efl_config" ] -} - if (tizen_multimedia) { external_media_video_decode_config += [ "//tizen_src/build:esplusplayer", diff --git a/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.cc b/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.cc index 8c44038..c39ef0b 100644 --- a/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.cc +++ b/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.cc @@ -15,10 +15,6 @@ #include "ipc_message_start_ewk.h" #include "net/url_request/url_request_context_getter.h" -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -#include "media/base/efl/webaudio_decoder_efl.h" -#endif - using content::BrowserThread; using web_contents_utils::WebContentsFromFrameID; using web_contents_utils::WebViewFromWebContents; @@ -45,12 +41,9 @@ void RenderMessageFilterEfl::OverrideThreadForMessage( bool RenderMessageFilterEfl::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(RenderMessageFilterEfl, message) - IPC_MESSAGE_HANDLER(EwkHostMsg_DecideNavigationPolicy, + IPC_MESSAGE_HANDLER(EwkHostMsg_DecideNavigationPolicy, OnDecideNavigationPolicy) -#if defined(TIZEN_MULTIMEDIA_SUPPORT) - IPC_MESSAGE_HANDLER(EflViewHostMsg_WebAudioDecode, OnWebAudioDecode) -#endif - IPC_MESSAGE_UNHANDLED(handled = false) + IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; } @@ -65,13 +58,3 @@ void RenderMessageFilterEfl::OnDecideNavigationPolicy( ->InvokePolicyNavigationCallback(params, handled); } } - -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -void RenderMessageFilterEfl::OnWebAudioDecode( - base::SharedMemoryHandle encoded_data_handle, - base::FileDescriptor pcm_output, - uint32_t data_size) { - media::WebAudioDecoder::GetWebAudioDecoder()->EncodedDataReceived( - encoded_data_handle, pcm_output, data_size); -} -#endif diff --git a/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.h b/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.h index 1a11f33..27d1f0f 100644 --- a/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.h +++ b/tizen_src/ewk/efl_integration/browser/render_message_filter_efl.h @@ -12,11 +12,6 @@ #include "third_party/blink/public/web/web_navigation_type.h" #include "url/gurl.h" -#if defined(TIZEN_MULTIMEDIA_SUPPORT) -#include "base/file_descriptor_posix.h" -#include "base/memory/shared_memory.h" -#endif - struct NavigationPolicyParams; namespace net { @@ -41,13 +36,6 @@ class RenderMessageFilterEfl : public content::BrowserMessageFilter { void OnReceivedHitTestData(int view, const _Ewk_Hit_Test& hit_test_data, const NodeAttributesMap& node_attributes); -#if defined(TIZEN_MULTIMEDIA_SUPPORT) - void OnWebAudioDecode(base::SharedMemoryHandle encoded_data_handle, - base::FileDescriptor pcm_output, - uint32_t data_size); -#endif - int render_process_id_; }; - #endif diff --git a/tizen_src/ewk/efl_integration/command_line_efl.cc b/tizen_src/ewk/efl_integration/command_line_efl.cc index de01912..57911c2 100644 --- a/tizen_src/ewk/efl_integration/command_line_efl.cc +++ b/tizen_src/ewk/efl_integration/command_line_efl.cc @@ -71,10 +71,6 @@ content::MainFunctionParams CommandLineEfl::GetDefaultPortParams() { if (IsDesktopProfile()) p_command_line->AppendSwitch(switches::kDisableES3GLContext); -#if defined(TIZEN_MULTIMEDIA_SUPPORT) && defined(ENABLE_WEBRTC) - p_command_line->AppendSwitch(switches::kEnableWebRtcHWH264Encoding); -#endif - #if BUILDFLAG(IS_TIZEN) // For optimizing discardable memory. [limit:MB, delay:ms] if (!p_command_line->HasSwitch(switches::kDiscardableMemoryLimit)) -- 2.7.4 From e00ead702ae0d66ebad4af4a69599f9ee4ae4dc3 Mon Sep 17 00:00:00 2001 From: fang fengrong Date: Sat, 25 Feb 2023 15:32:47 +0800 Subject: [PATCH 14/16] [M108 Migration] Support Url conversion on the multi process model 1. Instantiate WrtDynamicPlugin for browser process on multi process. 2. Revise WrtUrlRequestInterceptor. Added to Support app scheme. If parsed URL is not file scheme, the request will be redirected, not handled directly in WrtUrlRequestInterceptor. The parsed URL will be exposed to the content side(WebApp) after redirection. 3. Cleanup WrtWidget related codes Remove duplicated codes and unify codes for TV product and public in a single interface 4. Remove URLRequestInterceptingJobFactory 5.Fix the crash in EWebContext::SetWidgetInfo There is a crash when EWebContext::SetWidgetInfo is invoked without injected bundle in the single process mode. References: https://review.tizen.org/gerrit/#/c/247502/ https://review.tizen.org/gerrit/#/c/250497/ Change-Id: Id057f3c74e4f4168515b15d9a0509a17bde96479 Signed-off-by: fang fengrong --- tizen_src/ewk/efl_integration/eweb_context.cc | 32 +++--- tizen_src/ewk/efl_integration/eweb_context.h | 2 +- .../efl_integration/private/ewk_context_private.cc | 7 +- .../efl_integration/private/ewk_context_private.h | 5 +- .../ewk/efl_integration/public/ewk_context.cc | 8 +- .../renderer/content_renderer_client_efl.cc | 38 +------ .../renderer/content_renderer_client_efl.h | 2 - .../url_request_context_getter_efl.cc | 18 +++- .../url_request_context_getter_efl.h | 5 + tizen_src/ewk/efl_integration/wrt/dynamicplugin.cc | 114 ++++++++++++-------- tizen_src/ewk/efl_integration/wrt/dynamicplugin.h | 32 ++++-- tizen_src/ewk/efl_integration/wrt/v8widget.cc | 46 ++------- tizen_src/ewk/efl_integration/wrt/v8widget.h | 37 +++++-- .../ewk/efl_integration/wrt/wrt_dynamicplugin.cc | 113 ++++++++++---------- .../ewk/efl_integration/wrt/wrt_dynamicplugin.h | 22 ++-- .../wrt/wrt_file_protocol_handler.cc | 115 --------------------- .../wrt/wrt_file_protocol_handler.h | 45 -------- tizen_src/ewk/efl_integration/wrt/wrtwidget.cc | 46 +++++---- tizen_src/ewk/efl_integration/wrt/wrtwidget.h | 16 +-- 19 files changed, 278 insertions(+), 425 deletions(-) delete mode 100644 tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.cc delete mode 100644 tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.h diff --git a/tizen_src/ewk/efl_integration/eweb_context.cc b/tizen_src/ewk/efl_integration/eweb_context.cc index f344603..1af63b7 100644 --- a/tizen_src/ewk/efl_integration/eweb_context.cc +++ b/tizen_src/ewk/efl_integration/eweb_context.cc @@ -43,15 +43,16 @@ #include "content/common/plugin_list.h" #endif -#include "browser_context_efl.h" -#include "ewk_global_data.h" -#include "browser/password_manager/password_store_factory.h" #include "browser/browsing_data_remover_efl.h" +#include "browser/password_manager/password_store_factory.h" #include "browser/vibration/vibration_provider_client.h" +#include "browser_context_efl.h" #include "components/password_manager/core/browser/password_manager.h" #include "content/common/render_messages_efl.h" +#include "ewk_global_data.h" #include "private/ewk_favicon_database_private.h" #include "private/ewk_security_origin_private.h" +#include "wrt/dynamicplugin.h" #include "wrt/wrt_widget_host.h" #if BUILDFLAG(IS_TIZEN) @@ -239,28 +240,17 @@ bool EwkMimeOverrideCallback::TriggerCallback(const std::string& url_spec, return result; } -void EWebContext::SetWidgetInfo(const std::string& tizen_app_id, - double scale, - const string& theme, - const string& encoded_bundle) { +void EWebContext::SetTizenAppId(const std::string& tizen_app_id) { tizen_app_id_ = tizen_app_id; - widget_scale_ = scale; - widget_theme_ = theme; - widget_encoded_bundle_ = encoded_bundle; #if BUILDFLAG(IS_TIZEN) base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); // Add the switches in here to load injected bundle in renderer thread // in single process mode - if (command_line.HasSwitch(switches::kSingleProcess)) { + if (command_line.HasSwitch(switches::kSingleProcess) && + (!injected_bundle_path_.empty())) { command_line.AppendSwitchASCII(switches::kInjectedBundlePath, injected_bundle_path_); - command_line.AppendSwitchASCII(switches::kTizenAppId, tizen_app_id_); - command_line.AppendSwitchASCII(switches::kWidgetScale, - std::to_string(widget_scale_)); - command_line.AppendSwitchASCII(switches::kWidgetTheme, widget_theme_); - command_line.AppendSwitchASCII(switches::kWidgetEncodedBundle, - widget_encoded_bundle_); #if BUILDFLAG(IS_TIZEN_TV) // Drop process privillages while web app is launching @@ -274,6 +264,14 @@ void EWebContext::SetWidgetInfo(const std::string& tizen_app_id, // because it is handled in crosswalk side in single process mode. content::GetGenericZygote()->DropProcessPrivileges(tizen_app_id_); } +#if !defined(EWK_BRINGUP) // FIXME: m108 bringup + // Set DynamicPlugin to convert file scheme(file://) for Tizen HbbTV. + // Important: WRT doesn't use 'injected bundle' anymore + if (!tizen_app_id_.empty() && !injected_bundle_path_.empty()) { + DynamicPlugin* plugin = &DynamicPlugin::Get(V8Widget::Type::WRT); + plugin->Init(injected_bundle_path_); + } +#endif // EWK_BRINGUP #endif // IS_TIZEN } diff --git a/tizen_src/ewk/efl_integration/eweb_context.h b/tizen_src/ewk/efl_integration/eweb_context.h index 651941c..a2162df 100644 --- a/tizen_src/ewk/efl_integration/eweb_context.h +++ b/tizen_src/ewk/efl_integration/eweb_context.h @@ -146,7 +146,7 @@ class EWebContext { bool SetFaviconDatabasePath(const base::FilePath& path); Evas_Object *AddFaviconObject(const char *uri, Evas *canvas) const; - void SetWidgetInfo(const std::string& tizen_app_id, double scale, const std::string &theme, const std::string &encoded_bundle); + void SetTizenAppId(const std::string& tizen_app_id); bool SetAppVersion(const std::string& tizen_app_version); void SendWrtMessage(const Ewk_Wrt_Message_Data& message); diff --git a/tizen_src/ewk/efl_integration/private/ewk_context_private.cc b/tizen_src/ewk/efl_integration/private/ewk_context_private.cc index e10e87a..1215b15 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_context_private.cc +++ b/tizen_src/ewk/efl_integration/private/ewk_context_private.cc @@ -249,11 +249,8 @@ Evas_Object * Ewk_Context::AddFaviconObject(const char *uri, Evas *canvas) const return impl->AddFaviconObject(uri, canvas); } -void Ewk_Context::SetWidgetInfo(const std::string& tizen_app_id, - double scale, - const std::string& theme, - const std::string& encoded_bundle) { - impl->SetWidgetInfo(tizen_app_id, scale, theme, encoded_bundle); +void Ewk_Context::SetTizenAppId(const std::string& tizen_app_id) { + impl->SetTizenAppId(tizen_app_id); } bool Ewk_Context::SetAppVersion(const std::string& tizen_app_version) { diff --git a/tizen_src/ewk/efl_integration/private/ewk_context_private.h b/tizen_src/ewk/efl_integration/private/ewk_context_private.h index 869cde0..294f21e 100644 --- a/tizen_src/ewk/efl_integration/private/ewk_context_private.h +++ b/tizen_src/ewk/efl_integration/private/ewk_context_private.h @@ -112,10 +112,7 @@ struct Ewk_Context : public base::RefCounted { Evas_Object *AddFaviconObject(const char *uri, Evas *canvas) const; // Widget - void SetWidgetInfo(const std::string& tizen_app_id, - double scale, - const std::string& theme, - const std::string& encoded_bundle); + void SetTizenAppId(const std::string& tizen_app_id); bool SetAppVersion(const std::string& tizen_app_version); // Pixmap diff --git a/tizen_src/ewk/efl_integration/public/ewk_context.cc b/tizen_src/ewk/efl_integration/public/ewk_context.cc index a7e298a..545869b 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_context.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_context.cc @@ -600,17 +600,15 @@ void ewk_send_widget_info(Ewk_Context *context, EINA_SAFETY_ON_NULL_RETURN(theme); EINA_SAFETY_ON_NULL_RETURN(encodedBundle); EINA_SAFETY_ON_NULL_RETURN(context); - context->SetWidgetInfo(tizen_id, scale, theme, encodedBundle); + context->SetTizenAppId(tizen_id); } void ewk_context_tizen_app_id_set(Ewk_Context* context, const char* tizen_app_id) { EINA_SAFETY_ON_NULL_RETURN(context); EINA_SAFETY_ON_NULL_RETURN(tizen_app_id); - // Ewk_Context::SetWidgetInfo() will be changed with removal of argumets - // hardcoded in this call once bug - // http://107.108.218.239/bugzilla/show_bug.cgi?id=15424 is merged. - context->SetWidgetInfo(tizen_app_id, 1.0, "theme", "encoded_bundle"); + LOG(INFO) << "tizen_app_id:" << tizen_app_id; + context->SetTizenAppId(tizen_app_id); } Eina_Bool ewk_context_tizen_app_version_set(Ewk_Context* context, const char* tizen_app_version) diff --git a/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.cc b/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.cc index b65f276..2e0016e 100644 --- a/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.cc +++ b/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.cc @@ -78,21 +78,6 @@ static const float maximum_legible_scale = 2.0f; static const float minimum_page_scale_for_mobile = 0.25f; static const float maximum_page_scale_for_mobile = 5.f; -class WrtUrlParseImpl : public content::WrtUrlParseBase { - public: - WrtUrlParseImpl(WrtWidget* wrt_widget) : wrt_widget_(wrt_widget) {} - GURL parseUrl(const GURL& old_url) const override { - if (!wrt_widget_->IsWidgetInfoSet()) - return old_url; - GURL new_url; - wrt_widget_->ParseUrl(old_url, new_url); - return new_url; - } - - private: - WrtWidget* wrt_widget_; -}; - ContentRendererClientEfl::ContentRendererClientEfl() {} ContentRendererClientEfl::~ContentRendererClientEfl() {} @@ -116,25 +101,10 @@ void ContentRendererClientEfl::RenderThreadStarted() { #endif if (command_line.HasSwitch(switches::kInjectedBundlePath)) { - std::string tizen_app_id = - command_line.GetSwitchValueASCII(switches::kTizenAppId); - - WrtWidget* wrt_widget = new WrtWidget; - widget_.reset(wrt_widget); - thread->AddObserver(wrt_widget->GetObserver()); - wrt_url_parser_.reset(new WrtUrlParseImpl(wrt_widget)); - - std::string theme = - command_line.GetSwitchValueASCII(switches::kWidgetTheme); - std::string encoded_bundle = - command_line.GetSwitchValueASCII(switches::kWidgetEncodedBundle); - std::string scale = - command_line.GetSwitchValueASCII(switches::kWidgetScale); - double scale_factor = 0; - base::StringToDouble(scale, &scale_factor); - - wrt_widget->SetWidgetInfo(tizen_app_id, scale_factor, theme, - encoded_bundle); + V8Widget::Type type = V8Widget::Type::WRT; + widget_.reset(V8Widget::CreateWidget(type, command_line)); + if (widget_->GetObserver()) + thread->AddObserver(widget_->GetObserver()); } render_thread_observer_.reset(new RenderThreadObserverEfl(this)); diff --git a/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.h b/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.h index 3d5a537..2067164 100644 --- a/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.h +++ b/tizen_src/ewk/efl_integration/renderer/content_renderer_client_efl.h @@ -26,7 +26,6 @@ class VisitedLinkReader; class Ewk_Wrt_Message_Data; class V8Widget; -class WrtUrlParseImpl; class ContentRendererClientEfl : public content::ContentRendererClient { public: @@ -103,7 +102,6 @@ class ContentRendererClientEfl : public content::ContentRendererClient { static void ApplyCustomMobileSettings(blink::WebView*); std::unique_ptr widget_; - std::unique_ptr wrt_url_parser_; std::unique_ptr render_thread_observer_; std::unique_ptr visited_link_reader_; bool javascript_can_open_windows_ = true; diff --git a/tizen_src/ewk/efl_integration/url_request_context_getter_efl.cc b/tizen_src/ewk/efl_integration/url_request_context_getter_efl.cc index 82a6dce..a53e96b 100644 --- a/tizen_src/ewk/efl_integration/url_request_context_getter_efl.cc +++ b/tizen_src/ewk/efl_integration/url_request_context_getter_efl.cc @@ -38,7 +38,7 @@ #include "network_delegate_efl.h" #include "services/network/public/cpp/network_switches.h" #include "url_request_interceptor_efl.h" -#include "wrt/wrt_file_protocol_handler.h" +#include "wrt/dynamicplugin.h" using net::SQLitePersistentCookieStore; @@ -205,8 +205,8 @@ net::URLRequestContext* URLRequestContextGetterEfl::GetURLRequestContext() { // Use WrtFileProtocolHandler for File URI scheme. set_protocol = job_factory->SetProtocolHandler( url::kFileScheme, - base::WrapUnique(new net::WrtFileProtocolHandler( - base::CreateTaskRunnerWithTraits( + base::WrapUnique(new net::FileProtocolHandler( + base::CreateTaskRunner( {base::MayBlock(), base::TaskPriority::BEST_EFFORT, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}) .get()))); @@ -344,4 +344,16 @@ void URLRequestContextGetterEfl::SetInterceptRequestCallback( } } +void URLRequestContextGetterEfl::SetDynamicPlugin( + const std::string& tizen_app_id, + DynamicPlugin* dynamic_plugin) { + if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { + content::GetIOThreadTaskRunner({}) + ->PostTask( // PostTaskWithTraits is deprecated + FROM_HERE, + base::BindOnce(&URLRequestContextGetterEfl::SetDynamicPlugin, this, + tizen_app_id, dynamic_plugin)); + return; + } +} }; // namespace content diff --git a/tizen_src/ewk/efl_integration/url_request_context_getter_efl.h b/tizen_src/ewk/efl_integration/url_request_context_getter_efl.h index 112d191..7dba57a 100644 --- a/tizen_src/ewk/efl_integration/url_request_context_getter_efl.h +++ b/tizen_src/ewk/efl_integration/url_request_context_getter_efl.h @@ -6,6 +6,7 @@ #ifndef _URL_REQUEST_CONTEXT_GETTER_EFL_H_ #define _URL_REQUEST_CONTEXT_GETTER_EFL_H_ +#include #include "base/memory/weak_ptr.h" #include "base/task/thread_pool.h" #include "content/public/browser/browser_context.h" @@ -21,6 +22,8 @@ #include "public/ewk_context.h" #include "public/ewk_cookie_manager_internal.h" +class DynamicPlugin; + namespace net { class CertVerifier; class HostResolver; @@ -63,6 +66,8 @@ class URLRequestContextGetterEfl : public net::URLRequestContextGetter { Ewk_Context* ewk_context, Ewk_Context_Intercept_Request_Callback callback, void* user_data); + void SetDynamicPlugin(const std::string& tizen_app_id, + DynamicPlugin* dynamic_plugin); protected: virtual ~URLRequestContextGetterEfl(); diff --git a/tizen_src/ewk/efl_integration/wrt/dynamicplugin.cc b/tizen_src/ewk/efl_integration/wrt/dynamicplugin.cc index 4fe4c47..4520178 100644 --- a/tizen_src/ewk/efl_integration/wrt/dynamicplugin.cc +++ b/tizen_src/ewk/efl_integration/wrt/dynamicplugin.cc @@ -2,86 +2,116 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "dynamicplugin.h" +#include "wrt/dynamicplugin.h" #include -#include "base/command_line.h" #include "base/logging.h" #include "common/content_switches_efl.h" +#include "wrt/wrt_dynamicplugin.h" namespace { -const char* const START_SESSION_FUNCTION = "DynamicPluginStartSession"; -const char* const STOP_SESSION_FUNCTION = "DynamicPluginStopSession"; -const char* const VERSION_FUNCTION = "DynamicPluginVersion"; +const char* const kStartSessionFunction = "DynamicPluginStartSession"; +const char* const kStopSessionFunction = "DynamicPluginStopSession"; +const char* const kVersionFunction = "DynamicPluginVersion"; + +typedef unsigned int (*VersionFunction)(void); +typedef void (*StartSessionFun_v0)(const char* tizen_app_id, + v8::Handle context, + int routing_handle, + double scale_factor, + const char* encoded_bundle, + const char* theme, + const char* baseURL); } DynamicPlugin::DynamicPlugin() - : handle_(0), - version_(0), - version_function_(0), - start_session_(0), - stop_session_(0) { - const base::CommandLine& commandLine = - *base::CommandLine::ForCurrentProcess(); - std::string injectedBundlePath = - commandLine.GetSwitchValueASCII(switches::kInjectedBundlePath); - if (injectedBundlePath.empty()) - return; - handle_ = dlopen(injectedBundlePath.c_str(), RTLD_LAZY); + : handle_(0), version_(0), start_session_(0), stop_session_(0) {} + +bool DynamicPlugin::Init(const std::string& injected_bundle_path) { + if (handle_ || injected_bundle_path.empty()) + return handle_ != nullptr; + + handle_ = dlopen(injected_bundle_path.c_str(), RTLD_LAZY); + if (!handle_) + LOG(ERROR) << "No handle to " << injected_bundle_path << " " << dlerror(); + return handle_ != nullptr; +} + +bool DynamicPlugin::InitRenderer(const std::string& injected_bundle_path) { if (!handle_) { - LOG(ERROR) << "No handle to " << injectedBundlePath.c_str() << " " - << dlerror() << "\n"; - return; + if (!Init(injected_bundle_path)) + return false; } - *reinterpret_cast(&version_function_) = - dlsym(handle_, VERSION_FUNCTION); - if (!version_function_) { - LOG(ERROR) << "No " << VERSION_FUNCTION << " symbol found!\n"; - } else { - version_ = version_function_(); + VersionFunction version_function = + reinterpret_cast(GetFunction(kVersionFunction)); + if (version_function) { + version_ = version_function(); if (version_ != 0 && version_ != 1) { LOG(ERROR) << "Unknown plugin version: " << version_ << "!\n"; - return; + return false; } } - *reinterpret_cast(&start_session_) = - dlsym(handle_, START_SESSION_FUNCTION); - if (!start_session_) - LOG(ERROR) << "No " << START_SESSION_FUNCTION << " symbol found!\n"; - *reinterpret_cast(&stop_session_) = - dlsym(handle_, STOP_SESSION_FUNCTION); - if (!stop_session_) - LOG(ERROR) << "No " << STOP_SESSION_FUNCTION << " symbol found!\n"; + start_session_ = reinterpret_cast( + GetFunction(kStartSessionFunction)); + stop_session_ = + reinterpret_cast(GetFunction(kStopSessionFunction)); + return start_session_ && stop_session_; } void DynamicPlugin::StartSession(const char* session_id, v8::Handle context, int routing_handle, - const void* session_blob) { + const void* session_blob, + double scale_factor, + const char* encoded_bundle, + const char* theme) const { if (!start_session_) return; - start_session_(session_id, context, routing_handle, session_blob); + switch (version_) { + case 0: { + auto startSession_v0 = + reinterpret_cast(start_session_); + startSession_v0(session_id, context, routing_handle, scale_factor, + encoded_bundle, theme, + reinterpret_cast(session_blob)); + break; + } + case 1: { + start_session_(session_id, context, routing_handle, session_blob); + break; + } + default: + return; + } } void DynamicPlugin::StopSession(const char* session_id, - v8::Handle context) { + v8::Handle context) const { if (!stop_session_) return; stop_session_(session_id, context); } +void* DynamicPlugin::GetFunction(const char* funcation_name) const { + if (!handle_) + return nullptr; + + void* function_addr = dlsym(handle_, funcation_name); + if (!function_addr) + LOG(ERROR) << "No " << funcation_name << " symbol found! " << dlerror(); + return function_addr; +} + DynamicPlugin::~DynamicPlugin() { if (handle_) dlclose(handle_); } -DynamicPlugin& DynamicPlugin::instance() { - static DynamicPlugin dynamicPlugin; - return dynamicPlugin; +DynamicPlugin& DynamicPlugin::Get(V8Widget::Type type) { + return WrtDynamicPlugin::Get(); } - diff --git a/tizen_src/ewk/efl_integration/wrt/dynamicplugin.h b/tizen_src/ewk/efl_integration/wrt/dynamicplugin.h index f71ac92..c822bd9 100644 --- a/tizen_src/ewk/efl_integration/wrt/dynamicplugin.h +++ b/tizen_src/ewk/efl_integration/wrt/dynamicplugin.h @@ -7,8 +7,7 @@ #include #include "v8/include/v8.h" - -typedef unsigned int (*VersionFunction)(void); +#include "wrt/v8widget.h" typedef void (*StartSessionFunction)(const char* session_id, v8::Handle context, @@ -20,24 +19,39 @@ typedef void (*StopSessionFunction)(const char* session_id, class DynamicPlugin { public: + virtual ~DynamicPlugin(); + virtual bool Init(const std::string& injectedBundlePath); + virtual bool InitRenderer(const std::string& injected_bundle_path); + + // Interface for WebApp URL Conversion + virtual void SetWidgetInfo(const std::string& tizen_app_id) = 0; + virtual bool CanHandleParseUrl(const std::string& scheme) const = 0; + virtual void ParseURL(std::string* old_url, + std::string* new_url, + const char* tizen_app_id, + bool* is_decrypted_file = nullptr) = 0; + void StartSession(const char* session_id, v8::Handle context, int routing_handle, - const void* session_blob); - void StopSession(const char* session_id, v8::Handle context); + const void* session_blob, + double scale_factor = 1.0f, + const char* encoded_bundle = nullptr, + const char* theme = nullptr) const; + void StopSession(const char* session_id, + v8::Handle context) const; - virtual ~DynamicPlugin(); + void* GetFunction(const char* funcation_name) const; + void* handle() const { return handle_; } - static DynamicPlugin& instance(); + static DynamicPlugin& Get(V8Widget::Type type); protected: DynamicPlugin(); - DynamicPlugin(const DynamicPlugin&); - DynamicPlugin& operator=(const DynamicPlugin&); + private: void* handle_; unsigned int version_; - VersionFunction version_function_; StartSessionFunction start_session_; StopSessionFunction stop_session_; }; diff --git a/tizen_src/ewk/efl_integration/wrt/v8widget.cc b/tizen_src/ewk/efl_integration/wrt/v8widget.cc index f6a8044..e2b99b5 100644 --- a/tizen_src/ewk/efl_integration/wrt/v8widget.cc +++ b/tizen_src/ewk/efl_integration/wrt/v8widget.cc @@ -6,48 +6,22 @@ #include "base/notreached.h" #include "wrt/dynamicplugin.h" -#include "wrt/wrt_dynamicplugin.h" +#include "wrt/wrtwidget.h" -V8Widget::V8Widget(Type type) : type_(type) {} - -V8Widget::~V8Widget() {} - -void V8Widget::SetId(const std::string& id) { - id_ = id; -} - -V8Widget::Type V8Widget::GetType() const { - return type_; -} - -bool V8Widget::ParseUrl(const GURL& url, GURL& new_url) { - if (id_.empty()) - return false; - - std::string old_url = url.possibly_invalid_spec(); - std::string s_new_url; - if (type_ == V8Widget::Type::WRT) - WrtDynamicPlugin::instance().ParseURL(&old_url, &s_new_url, id_.c_str()); - if (!s_new_url.empty()) { - new_url = GURL(s_new_url); - return true; - } - - return false; +// static +V8Widget* V8Widget::CreateWidget(Type type, + const base::CommandLine& command_line) { + return new WrtWidget(command_line); } void V8Widget::StopSession(v8::Handle context) { - if (!id_.empty() && !context.IsEmpty()) { - if (type_ == V8Widget::Type::WRT) - WrtDynamicPlugin::instance().StopSession(id_.c_str(), context); - } + if (plugin_ && !id_.empty() && !context.IsEmpty()) + plugin_->StopSession(id_.c_str(), context); } void V8Widget::StartSession(v8::Handle context, int routing_handle, - const void* session_blob) { - if (!id_.empty() && !context.IsEmpty()) { - if (type_ == V8Widget::Type::WRT) - NOTREACHED(); - } + const char* session_blob) { + if (plugin_ && !id_.empty() && !context.IsEmpty()) + plugin_->StartSession(id_.c_str(), context, routing_handle, session_blob); } diff --git a/tizen_src/ewk/efl_integration/wrt/v8widget.h b/tizen_src/ewk/efl_integration/wrt/v8widget.h index 7b08e43..2b69876 100644 --- a/tizen_src/ewk/efl_integration/wrt/v8widget.h +++ b/tizen_src/ewk/efl_integration/wrt/v8widget.h @@ -11,28 +11,51 @@ #include "url/gurl.h" #include "v8/include/v8.h" +class DynamicPlugin; +namespace base { +class CommandLine; +} +namespace content { +class RenderThreadObserver; +} + // Have to be created on the RenderThread. class V8Widget { public: enum class Type { HBBTV, WRT }; - explicit V8Widget(Type type); - virtual ~V8Widget() = 0; + virtual ~V8Widget(){}; + + virtual content::RenderThreadObserver* GetObserver() = 0; + + // TODO(is46.kim) Remove ParseUrl. + // These interfaces will no longer be called from renderer and will be called + // directly form browser. + virtual bool ParseUrl(const GURL& url, + GURL& new_url, + bool* is_decrypted_file = nullptr) { + // NOTIMPLEMENTED(); + return false; + } - void SetId(const std::string& id); - Type GetType() const; + void SetId(const std::string& id) { id_ = id; } + Type GetType() const { return type_; } + void SetPlugin(DynamicPlugin* plugin) { plugin_ = plugin; } virtual void StartSession(v8::Handle, int routing_handle, - const void* session_blob); + const char* session_blob); - virtual void StopSession(v8::Handle); + void StopSession(v8::Handle); - bool ParseUrl(const GURL& url, GURL& new_url); + static V8Widget* CreateWidget(Type type, + const base::CommandLine& command_line); protected: + explicit V8Widget(Type type) : type_(type), plugin_(nullptr) {} std::string id_; Type type_; + DynamicPlugin* plugin_; }; #endif // EWK_EFL_INTEGRATION_WRT_V8WIDGET_H_ diff --git a/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.cc b/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.cc index 6906770..e430b91 100644 --- a/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.cc +++ b/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.cc @@ -12,99 +12,92 @@ namespace { -const char* const SET_WIDGET_INFO_FUNCTION = "DynamicSetWidgetInfo"; -const char* const DATABASE_ATTACH_FUNCTION = "DynamicDatabaseAttach"; +const char* const kSetWidgetInfoFunction = "DynamicSetWidgetInfo"; +const char* const kDatabaseAttachFunction = "DynamicDatabaseAttach"; +const char* const kOnIpcMessageFunction = "DynamicOnIPCMessage"; #if BUILDFLAG(IS_TIZEN_TV) -const char* const URL_PARSING_FUNCTION = "DynamicTVUrlParsing"; +const char* const kUrlParsingFunction = "DynamicTVUrlParsing"; +const char* const kGetFileDecryptedDataBufferFunction = + "DynamicGetFileDecryptedDataBuffer"; #else -const char* const URL_PARSING_FUNCTION = "DynamicUrlParsing"; +const char* const kUrlParsingFunction = "DynamicUrlParsing"; #endif - -typedef void (*StartSessionFun_v0)(const char* tizen_app_id, - v8::Handle context, - int routing_handle, - double scale_factor, - const char* encoded_bundle, - const char* theme, - const char* baseURL); } // namespace WrtDynamicPlugin::WrtDynamicPlugin() : DynamicPlugin(), - parseURL_(0), + url_parser_(0), set_widget_info_(0), - database_attach_(0), - on_IPC_message_(0) { - *reinterpret_cast(&parseURL_) = dlsym(handle_, URL_PARSING_FUNCTION); - if (!parseURL_) - LOG(ERROR) << "No " << URL_PARSING_FUNCTION << " symbol found!\n"; - - *reinterpret_cast(&set_widget_info_) = - dlsym(handle_, SET_WIDGET_INFO_FUNCTION); - if (!set_widget_info_) - LOG(ERROR) << "No " << SET_WIDGET_INFO_FUNCTION << " symbol found!"; + on_IPC_message_(0) {} + +bool WrtDynamicPlugin::Init(const std::string& injected_bundle_path) { + if (!DynamicPlugin::Init(injected_bundle_path)) + return false; + set_widget_info_ = + reinterpret_cast(GetFunction(kSetWidgetInfoFunction)); + url_parser_ = reinterpret_cast(GetFunction(kUrlParsingFunction)); +#if BUILDFLAG(IS_TIZEN_TV) +#if !defined(EWK_BRINGUP) + get_file_encrypted_data_buffer_ = + reinterpret_cast( + GetFunction(kGetFileDecryptedDataBufferFunction)); + if (!get_file_encrypted_data_buffer_) + return false; +#endif // EWK_BRINGUP +#endif + return set_widget_info_ && url_parser_; +} - *reinterpret_cast(&database_attach_) = - dlsym(handle_, DATABASE_ATTACH_FUNCTION); - if (!database_attach_) { - LOG(ERROR) << "No " << DATABASE_ATTACH_FUNCTION << " symbol found!\n"; - return; - } +bool WrtDynamicPlugin::InitRenderer(const std::string& injected_bundle_path) { + if (!DynamicPlugin::InitRenderer(injected_bundle_path)) + return false; + database_attach_ = + reinterpret_cast(GetFunction(kDatabaseAttachFunction)); + if (!database_attach_) + return false; + + on_IPC_message_ = + reinterpret_cast(GetFunction(kOnIpcMessageFunction)); - *reinterpret_cast(&on_IPC_message_) = - dlsym(handle_, "DynamicOnIPCMessage"); - if (!on_IPC_message_) - LOG(ERROR) << "No DynamicOnIPCMessage symbol found!\n"; database_attach_(1); + return on_IPC_message_ && database_attach_; } void WrtDynamicPlugin::StartSession(const char* tizen_app_id, v8::Handle context, int routing_handle, - double scale_factor, - const char* encoded_bundle, - const char* theme, const char* baseURL) { - if (!start_session_ || !database_attach_) + if (!database_attach_) return; - switch (version_) { - case 0: { - auto startSession_v0 = - reinterpret_cast(start_session_); - startSession_v0(tizen_app_id, context, routing_handle, scale_factor, - encoded_bundle, theme, baseURL); - break; - } - case 1: { - DynamicPlugin::StartSession(tizen_app_id, context, routing_handle, - baseURL); - break; - } - default: - return; - } + DynamicPlugin::StartSession(tizen_app_id, context, routing_handle, baseURL); } void WrtDynamicPlugin::StopSession(const char* tizen_app_id, v8::Handle context) { - if (!stop_session_ || !database_attach_) + if (!database_attach_) return; DynamicPlugin::StopSession(tizen_app_id, context); } +bool WrtDynamicPlugin::CanHandleParseUrl(const std::string& scheme) const { + // xwalk handles only file and app scheme. + if (scheme == url::kFileScheme || scheme == "app") + return true; + return false; +} + void WrtDynamicPlugin::ParseURL(std::string* old_url, std::string* new_url, const char* tizen_app_id, bool* is_encrypted_file) { - if (!parseURL_ || !database_attach_) - return; - + if (url_parser_) { #if BUILDFLAG(IS_TIZEN_TV) - parseURL_(old_url, new_url, tizen_app_id, is_encrypted_file); + url_parser_(old_url, new_url, tizen_app_id, is_encrypted_file); #else - parseURL_(old_url, new_url, tizen_app_id); + url_parser_(old_url, new_url, tizen_app_id); #endif + } } void WrtDynamicPlugin::SetWidgetInfo(const std::string& tizen_app_id) { @@ -119,7 +112,7 @@ WrtDynamicPlugin::~WrtDynamicPlugin() { database_attach_(0); } -WrtDynamicPlugin& WrtDynamicPlugin::instance() { +WrtDynamicPlugin& WrtDynamicPlugin::Get() { static WrtDynamicPlugin dynamicPlugin; return dynamicPlugin; } diff --git a/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.h b/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.h index 7653e12..8f02125 100644 --- a/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.h +++ b/tizen_src/ewk/efl_integration/wrt/wrt_dynamicplugin.h @@ -29,24 +29,32 @@ typedef void (*DatabaseAttachFun)(int database_attach); class WrtDynamicPlugin : public DynamicPlugin { public: + // For Browser and Renderer + bool Init(const std::string& injected_bundle_path) override; + // Only for Renderer + bool InitRenderer(const std::string& injected_bundle_path) override; + void StartSession(const char* tizen_app_id, v8::Handle context, int routing_handle, - double scale_factor, - const char* encoded_bundle, - const char* theme, const char* baseURL); void StopSession(const char* tizen_app_id, v8::Handle context); + // TODO(is46.kim) : |WrtDynamicPlugin| was designed to run on the renderer + // with the injected bundle of xwalk. But currently, the implementation is + // changed to call from WrtUrlRequestInterceptor in browser IO Thread. File + // scheme conversion implementations should be separated only to browser side. + void SetWidgetInfo(const std::string& tizen_app_id) override; + bool CanHandleParseUrl(const std::string& scheme) const override; + void ParseURL(std::string* old_url, std::string* new_url, const char* tizen_app_id, - bool* is_encrypted_file = nullptr); + bool* is_decrypted_file = nullptr); - void SetWidgetInfo(const std::string& tizen_app_id); void MessageReceived(const Ewk_Wrt_Message_Data& data); - static WrtDynamicPlugin& instance(); + static WrtDynamicPlugin& Get(); ~WrtDynamicPlugin() override; private: @@ -55,7 +63,7 @@ class WrtDynamicPlugin : public DynamicPlugin { WrtDynamicPlugin(const WrtDynamicPlugin&) = delete; WrtDynamicPlugin& operator=(const WrtDynamicPlugin&) = delete; - ParseUrlFun parseURL_; + ParseUrlFun url_parser_; SetWidgetInfoFun set_widget_info_; DatabaseAttachFun database_attach_; OnIPCMessageFun on_IPC_message_; diff --git a/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.cc b/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.cc deleted file mode 100644 index 4e78072..0000000 --- a/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.cc +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) 2014,2015 Samsung Electronics. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "wrt_file_protocol_handler.h" - -#include "base/command_line.h" -#include "common/content_switches_efl.h" -#include "content/public/common/content_client.h" -#include "content/public/renderer/content_renderer_client.h" -#include "net/base/filename_util.h" -#include "net/url_request/url_request_data_job.h" -#include "net/url_request/url_request_error_job.h" -#include "net/url_request/url_request_file_dir_job.h" -#include "net/url_request/url_request_file_job.h" -#include "net/url_request/url_request_simple_job.h" - -#include "wrt/wrt_dynamicplugin.h" - -namespace net { - -class WrtURLRequestDataJob : public URLRequestSimpleJob { - public: - WrtURLRequestDataJob(URLRequest* request, - NetworkDelegate* network_delegate, - const GURL& data_url) - : URLRequestSimpleJob(request, network_delegate) { - data_url_ = data_url; - } - - int GetData(std::string* mime_type, - std::string* charset, - std::string* data, - CompletionOnceCallback callback) const override; - - private: - ~WrtURLRequestDataJob() override {} - GURL data_url_; -}; - -int WrtURLRequestDataJob::GetData(std::string* mime_type, - std::string* charset, - std::string* data, - CompletionOnceCallback callback) const { - if (!data_url_.is_valid()) - return ERR_INVALID_URL; - - return URLRequestDataJob::BuildResponse(data_url_, mime_type, charset, data, - nullptr); -} - -bool WrtFileProtocolHandler::GetWrtParsedUrl(const GURL& url, - GURL& parsed_url) const { - static std::string tizen_app_id = - base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( - switches::kTizenAppId); - if (tizen_app_id.empty()) - return false; - - std::string url_str = url.possibly_invalid_spec(); - std::string parsed_url_str; - bool is_encrypted_file; - // Need to check if variable is_encrypted_file is needed or not - // if we do not pass is_encrypted_file to ParseURL() we observe - // that code flow is blocked before ParseURL(). - WrtDynamicPlugin::instance().ParseURL( - &url_str, &parsed_url_str, tizen_app_id.c_str(), &is_encrypted_file); - if (!parsed_url_str.empty()) { - parsed_url = GURL(parsed_url_str); - return true; - } - return false; -} - -std::unique_ptr CreateJob(URLRequest* request) const { -#if !defined(EWK_BRINGUP) // FIXME: m94 bringup - GURL parsed_url; - if (GetWrtParsedUrl(request->url(), parsed_url)) { - // Data URI scheme for WRT encryption content - if (parsed_url.SchemeIs(url::kDataScheme)) - return new WrtURLRequestDataJob(request, network_delegate, parsed_url); - } else { - parsed_url = request->url(); - } - - base::FilePath file_path; - const bool is_file = FileURLToFilePath(parsed_url, &file_path); - - // Check file access permissions. - // FIXME: The third parameter of net::URLRequestErrorJob sould be - // absolute_path. - - if (!network_delegate || - !network_delegate->CanAccessFile(*request, file_path, file_path)) - return std::make_unique(request, ERR_ACCESS_DENIED); - - // We need to decide whether to create URLRequestFileJob for file access or - // URLRequestFileDirJob for directory access. To avoid accessing the - // filesystem, we only look at the path string here. - // The code in the URLRequestFileJob::Start() method discovers that a path, - // which doesn't end with a slash, should really be treated as a directory, - // and it then redirects to the URLRequestFileDirJob. - if (is_file && file_path.EndsWithSeparator() && file_path.IsAbsolute()) - return std::make_unique(request, file_path); - - // Use a regular file request job for all non-directories (including invalid - // file names). - return std::make_unique(request, file_path, - file_task_runner_); -#else - return URLRequestHttpJob::Create(request); -#endif -} - -} // namespace diff --git a/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.h b/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.h deleted file mode 100644 index ed2f7a9..0000000 --- a/tizen_src/ewk/efl_integration/wrt/wrt_file_protocol_handler.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2014,2015 Samsung Electronics. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef WRT_FILE_PROTOCOL_HANDLER -#define WRT_FILE_PROTOCOL_HANDLER - -#include "base/memory/ref_counted.h" -#include "net/url_request/url_request_job_factory.h" - -class GURL; - -namespace base { -class TaskRunner; -} - -namespace net { - -class NetworkDelegate; -class URLRequestJob; - -class WrtFileProtocolHandler : public URLRequestJobFactory::ProtocolHandler { - public: - explicit WrtFileProtocolHandler( - const scoped_refptr& file_task_runner) - : file_task_runner_(file_task_runner) {} - ~WrtFileProtocolHandler() override {} - - WrtFileProtocolHandler(const WrtFileProtocolHandler&) = delete; - WrtFileProtocolHandler& operator=(const WrtFileProtocolHandler&) = delete; - - std::unique_ptr CreateJob(URLRequest* request) const override; - bool IsSafeRedirectTarget(const GURL& location) const override { - return false; - } - - private: - bool GetWrtParsedUrl(const GURL& url, GURL& parsed_url) const; - - const scoped_refptr file_task_runner_; -}; - -} // namespace net - -#endif // WRT_FILE_PROTOCOL_HANDLER diff --git a/tizen_src/ewk/efl_integration/wrt/wrtwidget.cc b/tizen_src/ewk/efl_integration/wrt/wrtwidget.cc index c4fbde5..34347cb 100644 --- a/tizen_src/ewk/efl_integration/wrt/wrtwidget.cc +++ b/tizen_src/ewk/efl_integration/wrt/wrtwidget.cc @@ -2,8 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "wrtwidget.h" +#include "wrt/wrtwidget.h" +#include "base/strings/string_number_conversions.h" +#include "command_line_efl.h" +#include "common/content_switches_efl.h" #include "common/render_messages_ewk.h" #include "content/public/renderer/render_thread.h" #include "ipc/ipc_sync_channel.h" @@ -48,31 +51,31 @@ class WrtRenderThreadObserver : public content::RenderThreadObserver { IPC::SyncChannel* channel_; }; -WrtWidget::WrtWidget() - : V8Widget(V8Widget::Type::WRT), - scale_(0), - observer_(new WrtRenderThreadObserver(this)) { +WrtWidget::WrtWidget(const base::CommandLine& command_line) + : V8Widget(V8Widget::Type::WRT) { DCHECK(content::RenderThread::Get()) << "WrtWidget must be constructed on the render thread"; -} -WrtWidget::~WrtWidget() { - delete observer_; + std::string injected_bundle_path = + command_line.GetSwitchValueASCII(switches::kInjectedBundlePath); + CHECK(!injected_bundle_path.empty()); + WrtDynamicPlugin::Get().InitRenderer(injected_bundle_path); + SetPlugin(&WrtDynamicPlugin::Get()); + + observer_.reset(new WrtRenderThreadObserver(this)); + + SetWidgetInfo(command_line.GetSwitchValueASCII(switches::kTizenAppId)); } +WrtWidget::~WrtWidget() {} + content::RenderThreadObserver* WrtWidget::GetObserver() { - return observer_; + return observer_.get(); } -void WrtWidget::SetWidgetInfo(const std::string& tizen_app_id, - double scale_factor, - const std::string& theme, - const std::string& encoded_bundle) { +void WrtWidget::SetWidgetInfo(const std::string& tizen_app_id) { id_ = tizen_app_id; - scale_ = scale_factor; - theme_ = theme; - encoded_bundle_ = encoded_bundle; - WrtDynamicPlugin::instance().SetWidgetInfo(id_); + WrtDynamicPlugin::Get().SetWidgetInfo(id_); } bool WrtWidget::IsWidgetInfoSet() const { @@ -81,15 +84,14 @@ bool WrtWidget::IsWidgetInfoSet() const { void WrtWidget::StartSession(v8::Handle context, int routing_handle, - const void* session_blob) { + const char* session_blob) { if (!id_.empty() && !context.IsEmpty()) { - WrtDynamicPlugin::instance().StartSession( - id_.c_str(), context, routing_handle, scale_, encoded_bundle_.c_str(), - theme_.c_str(), reinterpret_cast(session_blob)); + WrtDynamicPlugin::Get().StartSession(id_.c_str(), context, routing_handle, + session_blob); } } void WrtWidget::MessageReceived(const Ewk_Wrt_Message_Data& data) { if (!id_.empty()) - WrtDynamicPlugin::instance().MessageReceived(data); + WrtDynamicPlugin::Get().MessageReceived(data); } diff --git a/tizen_src/ewk/efl_integration/wrt/wrtwidget.h b/tizen_src/ewk/efl_integration/wrt/wrtwidget.h index 5078964..8125115 100644 --- a/tizen_src/ewk/efl_integration/wrt/wrtwidget.h +++ b/tizen_src/ewk/efl_integration/wrt/wrtwidget.h @@ -18,15 +18,12 @@ class WrtRenderThreadObserver; // Have to be created on the RenderThread. class WrtWidget : public V8Widget { public: - WrtWidget(); + WrtWidget(const base::CommandLine& command_line); ~WrtWidget() override; - content::RenderThreadObserver* GetObserver(); + content::RenderThreadObserver* GetObserver() override; - void SetWidgetInfo(const std::string& tizen_app_id, - double scaleFactor, - const std::string& theme, - const std::string& encodedBundle); + void SetWidgetInfo(const std::string& tizen_app_id); bool IsWidgetInfoSet() const; @@ -34,13 +31,10 @@ class WrtWidget : public V8Widget { void StartSession(v8::Handle, int routing_handle, - const void* session_blob) override; + const char* session_blob) override; private: - double scale_; - std::string encoded_bundle_; - std::string theme_; - WrtRenderThreadObserver* observer_; + std::unique_ptr observer_; }; #endif // EWK_EFL_INTEGRATION_WRT_WRTWIDGET_H_ -- 2.7.4 From 5092db101889e7bfa804cc54daf9bcc07de19edf Mon Sep 17 00:00:00 2001 From: Surya Kumar Date: Fri, 24 Feb 2023 14:00:23 +0530 Subject: [PATCH 15/16] [M108 Migration] Fix WRTJS build errors This patch adds necessary changes to resolve dependency errors occurring during various wrtjs profile builds. Reference: https://review.tizen.org/gerrit/271777 Change-Id: I2a00b44c4d9b4d4b22d4c94462b3197ce1adf876 Signed-off-by: Surya Kumar --- packaging/chromium-efl.spec | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) mode change 100644 => 100755 packaging/chromium-efl.spec diff --git a/packaging/chromium-efl.spec b/packaging/chromium-efl.spec old mode 100644 new mode 100755 index e8e97a4..49fb87b --- a/packaging/chromium-efl.spec +++ b/packaging/chromium-efl.spec @@ -236,6 +236,11 @@ BuildRequires: pkgconfig(capi-ui-inputmethod) BuildRequires: pkgconfig(privileged-service) %endif +# node module is required for nmt and category public features. +%if "%{?profile}" != "tv" && "%{?profile}" != "wearable" && "%{?_with_da_profile}" != "1" +%define _support_node_module 1 +%endif + %description Browser Engine based on Chromium EFL (Shared Library) @@ -487,6 +492,13 @@ install -m 0644 tizen_src/ewk/efl_webview_app/efl_webview_app.png %{buildroot}%{ install -m 0644 "%{OUTPUT_FOLDER}"/pkgconfig/*.pc "%{buildroot}"%{_libdir}/pkgconfig/ install -m 0644 tizen_src/ewk/efl_integration/public/*.h "%{buildroot}"%{_includedir}/chromium-ewk/ install -m 0644 v8/include/*.h "%{buildroot}"%{_includedir}/v8/ +install -d "%{buildroot}"%{_includedir}/v8/cppgc +install -m 0644 v8/include/cppgc/common.h "%{buildroot}"%{_includedir}/v8/cppgc/ + +%if 0%{?_support_node_module} +install -d "%{buildroot}"%{_includedir}/node +install -m 0644 third_party/electron_node/src/*.h "%{buildroot}"%{_includedir}/node/ +%endif install -m 0755 "%{OUTPUT_FOLDER}"/libminigbm.so "%{buildroot}"%{_libdir} @@ -721,6 +733,10 @@ setcap cap_mac_admin=eip %{_bindir}/wrt-service %{_libdir}/pkgconfig/*.pc %{_includedir}/v8/* +%if 0%{?_support_node_module} +%{_includedir}/node/* +%endif + %if 0%{?__enable_wrt_js} %{_includedir}/wrt/* %endif -- 2.7.4 From 59e9bb5ecc915c1d0bad687770c8bd60b122db06 Mon Sep 17 00:00:00 2001 From: liuxd Date: Fri, 24 Feb 2023 09:39:34 +0800 Subject: [PATCH 16/16] [M108 Migration][VD] Fix IME focus issue 1. Add WebView focus and Widget show state check 2. Fix WebPage auto focus to input,ime have not focus in issue. refer: https://review.tizen.org/gerrit/#/c/282680/ Change-Id: I7c55cf139766af540119d4633a952816e264032d Signed-off-by: liuxd --- third_party/blink/renderer/core/dom/element.cc | 10 ++++++++++ .../blink/renderer/core/frame/web_frame_widget_impl.cc | 5 +++++ .../blink/renderer/core/frame/web_frame_widget_impl.h | 3 +++ third_party/blink/renderer/core/page/chrome_client.h | 3 +++ .../blink/renderer/core/page/chrome_client_impl.cc | 9 +++++++++ .../blink/renderer/core/page/chrome_client_impl.h | 3 +++ .../blink/renderer/platform/widget/widget_base.cc | 18 +++++++++++++++++- .../blink/renderer/platform/widget/widget_base.h | 5 +++++ 8 files changed, 55 insertions(+), 1 deletion(-) diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 6f4a5a2..6b8d7dd 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc @@ -5688,6 +5688,16 @@ void Element::Focus(const FocusParams& params) { chrome_client.ClearKeyboardTriggeredTooltip(*GetDocument().GetFrame()); } } +#if BUILDFLAG(IS_EFL) + if (!LocalFrame::HasTransientUserActivation(nullptr)) { + // Called when value of focused text field gets dirty, + // e.g. value is modified by script, not by user input. + GetDocument() + .GetPage() + ->GetChromeClient() + .DidUpdateTextOfFocusedElementByNonUserInput(*GetDocument().GetFrame()); + } +#endif } void Element::UpdateSelectionOnFocus( diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc index f96ba43..3ed5097 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc @@ -3510,6 +3510,11 @@ void WebFrameWidgetImpl::ShowVirtualKeyboardOnElementFocus() { widget_base_->ShowVirtualKeyboardOnElementFocus(); } +#if BUILDFLAG(IS_EFL) +void WebFrameWidgetImpl::DidUpdateTextOfFocusedElementByNonUserInput() { + widget_base_->DidUpdateTextOfFocusedElementByNonUserInput(); +} +#endif void WebFrameWidgetImpl::ProcessTouchAction(WebTouchAction touch_action) { widget_base_->ProcessTouchAction(touch_action); } diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h index 90e4b65..098e503 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h @@ -544,6 +544,9 @@ class CORE_EXPORT WebFrameWidgetImpl void ClearKeyboardTriggeredTooltip(); void ShowVirtualKeyboardOnElementFocus(); +#if BUILDFLAG(IS_EFL) + void DidUpdateTextOfFocusedElementByNonUserInput(); +#endif void ProcessTouchAction(WebTouchAction touch_action); void SetPanAction(mojom::blink::PanAction pan_action); diff --git a/third_party/blink/renderer/core/page/chrome_client.h b/third_party/blink/renderer/core/page/chrome_client.h index bee1063..316b8e7 100644 --- a/third_party/blink/renderer/core/page/chrome_client.h +++ b/third_party/blink/renderer/core/page/chrome_client.h @@ -502,6 +502,9 @@ class CORE_EXPORT ChromeClient : public GarbageCollected { // Input method editor related functions. virtual void ShowVirtualKeyboardOnElementFocus(LocalFrame&) {} +#if BUILDFLAG(IS_EFL) + virtual void DidUpdateTextOfFocusedElementByNonUserInput(LocalFrame&) {} +#endif virtual TransformationMatrix GetDeviceEmulationTransform() const { return TransformationMatrix(); } diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc index ec0e285..434c4b3 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl.cc +++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc @@ -1194,6 +1194,15 @@ void ChromeClientImpl::ShowVirtualKeyboardOnElementFocus(LocalFrame& frame) { ->ShowVirtualKeyboardOnElementFocus(); } +#if BUILDFLAG(IS_EFL) +void ChromeClientImpl::DidUpdateTextOfFocusedElementByNonUserInput( + LocalFrame& frame) { + WebLocalFrameImpl::FromFrame(frame) + ->LocalRootFrameWidget() + ->DidUpdateTextOfFocusedElementByNonUserInput(); +} +#endif + void ChromeClientImpl::OnMouseDown(Node& mouse_down_node) { if (auto* fill_client = AutofillClientFromFrame(mouse_down_node.GetDocument().GetFrame())) { diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.h b/third_party/blink/renderer/core/page/chrome_client_impl.h index 76433dc..42933c6 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl.h +++ b/third_party/blink/renderer/core/page/chrome_client_impl.h @@ -268,6 +268,9 @@ class CORE_EXPORT ChromeClientImpl final : public ChromeClient { void ShowVirtualKeyboardOnElementFocus(LocalFrame&) override; +#if BUILDFLAG(IS_EFL) + void DidUpdateTextOfFocusedElementByNonUserInput(LocalFrame&) override; +#endif TransformationMatrix GetDeviceEmulationTransform() const override; void OnMouseDown(Node&) override; diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc index 5f2147f..dbeadca 100644 --- a/third_party/blink/renderer/platform/widget/widget_base.cc +++ b/third_party/blink/renderer/platform/widget/widget_base.cc @@ -1210,8 +1210,15 @@ void WidgetBase::ShowVirtualKeyboardOnElementFocus() { UpdateTextInputState(); #elif BUILDFLAG(IS_EFL) // If webview hasn't focus, IME shouldn't be shown. - if (has_focus_) + if (has_focus_) { +#if BUILDFLAG(IS_TIZEN_TV) + LOG(INFO) << __FUNCTION__; + DidUpdateTextOfFocusedElementByNonUserInput(); +#else ShowVirtualKeyboard(); +#endif // endif defined(OS_TIZEN_TV_PRODUCT) + } + #else ShowVirtualKeyboard(); #endif @@ -1223,6 +1230,15 @@ void WidgetBase::ShowVirtualKeyboardOnElementFocus() { #endif } +#if BUILDFLAG(IS_EFL) +void WidgetBase::DidUpdateTextOfFocusedElementByNonUserInput() { + if (GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) { + LOG(INFO) << __FUNCTION__ << " set is_user_action_ FALSE"; + is_user_action_ = false; + ShowVirtualKeyboard(); + } +} +#endif void WidgetBase::ProcessTouchAction(cc::TouchAction touch_action) { if (!input_handler_.ProcessTouchAction(touch_action)) return; diff --git a/third_party/blink/renderer/platform/widget/widget_base.h b/third_party/blink/renderer/platform/widget/widget_base.h index f701e65..e1bda87 100644 --- a/third_party/blink/renderer/platform/widget/widget_base.h +++ b/third_party/blink/renderer/platform/widget/widget_base.h @@ -223,6 +223,11 @@ class PLATFORM_EXPORT WidgetBase : public mojom::blink::Widget, // Dispatch the virtual keyboard and update text input state. void ShowVirtualKeyboardOnElementFocus(); +#if BUILDFLAG(IS_EFL) + // Called when value of focused text field gets dirty, e.g. value is modified + // by script, not by user input. + void DidUpdateTextOfFocusedElementByNonUserInput(); +#endif // Process the touch action. void ProcessTouchAction(cc::TouchAction touch_action); -- 2.7.4