From: zhishun.zhou Date: Tue, 5 Mar 2024 06:08:38 +0000 (+0800) Subject: [M120 Migration][MM] Support webmedia playback state notification X-Git-Tag: submit/tizen/20240311.160013~30 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=65ddc4d548ff47b622db319d07facb8c0672b5e0;p=platform%2Fframework%2Fweb%2Fchromium-efl.git [M120 Migration][MM] Support webmedia playback state notification 1. webbrowser need playbackstart event to show miniplayer button, this patch implement ewk interface to notify player state to APP, at the same time it get translated url and drm information from APP; 2. Impement a switch kEnableMediaPlaybackNotification, set from ewk_settings_media_playback_notification_set; 3. Impement GetContentMIMEType from html media element and set it to esplayer; Patch from: https://review.tizen.org/gerrit/#/c/292410/ Change-Id: I88c787896baa4176769c3eb64214d94bee72ffaa Signed-off-by: xiaofang Signed-off-by: zhishun.zhou --- diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index c2d224827639..46ae83a13b3b 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -3229,6 +3229,12 @@ const blink::web_pref::WebPreferences WebContentsImpl::ComputeWebPreferences() { prefs.user_gesture_required_for_presentation = !command_line.HasSwitch( switches::kDisableGestureRequirementForPresentation); +#if BUILDFLAG(IS_TIZEN_TV) + // Disallow media playback notification by default. + prefs.media_playback_notification_enabled = + command_line.HasSwitch(switches::kEnableMediaPlaybackNotification); +#endif + #if BUILDFLAG(IS_TIZEN) if (command_line.HasSwitch(switches::kMaxRefreshRate)) { int refresh_rate = 0; diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index 8776ed2b4684..2bf3192ea36c 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h @@ -735,10 +735,17 @@ class CONTENT_EXPORT WebContentsDelegate { virtual void ExitPictureInPicture() {} #if BUILDFLAG(IS_TIZEN_TV) + virtual void NotifyPlaybackState(int state, + int player_id, + const std::string& url, + const std::string& mime_type, + bool* media_resource_acquired, + std::string* translated_url, + std::string* drm_info) {} // Notify Media State to Web browser virtual void NotifyMediaStateChanged(uint32_t type, uint32_t previous, - uint32_t current) {}; + uint32_t current) {} virtual bool IsHighBitRate() const { return false; } virtual void NotifyDownloadableFontInfo(const std::string& scheme_id_uri, const std::string& value, diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc index 7b03c23586ef..7f95a83d153c 100644 --- a/content/public/common/content_switches.cc +++ b/content/public/common/content_switches.cc @@ -1078,6 +1078,9 @@ const char kMaxRefreshRate[] = "max-refresh-rate"; #endif #if BUILDFLAG(IS_TIZEN_TV) +// Enables media playback notification for other applications +const char kEnableMediaPlaybackNotification[] = + "enable-media-playback-notification"; // Enables dual decoding for webrtc video call const char kDualDecodingWebRTC[] = "enable-webrtc-dual-decoding"; // Enables multiplayers feature for web app diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h index 886b0f97d644..a851eedbd1ee 100644 --- a/content/public/common/content_switches.h +++ b/content/public/common/content_switches.h @@ -300,6 +300,7 @@ CONTENT_EXPORT extern const char kMaxRefreshRate[]; #endif #if BUILDFLAG(IS_TIZEN_TV) +CONTENT_EXPORT extern const char kEnableMediaPlaybackNotification[]; CONTENT_EXPORT extern const char kDualDecodingWebRTC[]; CONTENT_EXPORT extern const char kEnableMultiPlayerForWebapp[]; #endif diff --git a/media/base/pipeline.h b/media/base/pipeline.h index 8e1f2216a9cb..a2e455465bba 100644 --- a/media/base/pipeline.h +++ b/media/base/pipeline.h @@ -278,6 +278,9 @@ class MEDIA_EXPORT Pipeline { #if defined(TIZEN_VIDEO_HOLE) virtual void SetMediaGeometry(const gfx::RectF rect_f) = 0; #endif +#if BUILDFLAG(IS_TIZEN_TV) + virtual void SetContentMimeType(const std::string& mime_type) = 0; +#endif }; } // namespace media diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc index 2b991e6492a0..bf67b12a8689 100644 --- a/media/base/pipeline_impl.cc +++ b/media/base/pipeline_impl.cc @@ -110,6 +110,9 @@ class PipelineImpl::RendererWrapper final : public DemuxerHost, #if defined(TIZEN_VIDEO_HOLE) void SetMediaGeometry(const gfx::RectF rect_f); #endif +#if BUILDFLAG(IS_TIZEN_TV) + void SetContentMimeType(const std::string& mime_type); +#endif // |enabled_track_ids| contains track ids of enabled audio tracks. void OnEnabledAudioTracksChanged( @@ -268,6 +271,10 @@ class PipelineImpl::RendererWrapper final : public DemuxerHost, bool is_video_hole_; #endif +#if BUILDFLAG(IS_TIZEN_TV) + std::string mime_type_; +#endif + // Whether we've received the audio/video ended events. bool renderer_ended_; @@ -677,6 +684,16 @@ void PipelineImpl::RendererWrapper::SetMediaGeometry(const gfx::RectF rect_f) { } #endif +#if BUILDFLAG(IS_TIZEN_TV) +void PipelineImpl::RendererWrapper::SetContentMimeType( + const std::string& mime_type) { + DCHECK(media_task_runner_->RunsTasksInCurrentSequence()); + mime_type_ = mime_type; + if (shared_state_.renderer) + shared_state_.renderer->SetContentMimeType(mime_type_); +} +#endif + void PipelineImpl::RendererWrapper::CreateRendererInternal( PipelineStatusCallback done_cb) { DVLOG(1) << __func__; @@ -1165,6 +1182,10 @@ void PipelineImpl::RendererWrapper::CompleteSeek(base::TimeDelta seek_time, return; } +#if BUILDFLAG(IS_TIZEN_TV) + shared_state_.renderer->SetContentMimeType(mime_type_); +#endif + shared_state_.renderer->StartPlayingFrom( std::max(seek_time, demuxer_->GetStartTime())); { @@ -1300,6 +1321,12 @@ void PipelineImpl::RendererWrapper::InitializeRenderer( LOG(INFO) << __func__ << " call SetVideoHole : " << is_video_hole_; shared_state_.renderer->SetVideoHole(is_video_hole_); #endif +#if BUILDFLAG(IS_TIZEN_TV) + // We need to set the mime type before Initialize() in the case of URL streams + // where the content is dash, because the Initialize() calls prepare in this + // case, and the player needs the mime type to configure itself correctly. + shared_state_.renderer->SetContentMimeType(mime_type_); +#endif // Initialize Renderer and report timeout UMA. std::string uma_name = "Media.InitializeRendererTimeout"; @@ -1832,6 +1859,16 @@ void PipelineImpl::OnBufferingStateChange(BufferingState state, client_->OnBufferingStateChange(state, reason); } +#if BUILDFLAG(IS_TIZEN_TV) +void PipelineImpl::SetContentMimeType(const std::string& mime_type) { + DVLOG(2) << __func__ << "(" << mime_type << ")"; + DCHECK(thread_checker_.CalledOnValidThread()); + media_task_runner_->PostTask( + FROM_HERE, + base::BindOnce(&RendererWrapper::SetContentMimeType, + base::Unretained(renderer_wrapper_.get()), mime_type)); +} +#endif void PipelineImpl::OnDurationChange(base::TimeDelta duration) { DVLOG(2) << __func__; DCHECK(thread_checker_.CalledOnValidThread()); diff --git a/media/base/pipeline_impl.h b/media/base/pipeline_impl.h index 6d1adf6d8a19..cc738ac68730 100644 --- a/media/base/pipeline_impl.h +++ b/media/base/pipeline_impl.h @@ -174,6 +174,9 @@ class MEDIA_EXPORT PipelineImpl : public Pipeline { void OnFallback(PipelineStatus fallback); void OnEnded(); void OnMetadata(const PipelineMetadata& metadata); +#if BUILDFLAG(IS_TIZEN_TV) + void SetContentMimeType(const std::string& mime_type) override; +#endif void OnBufferingStateChange(BufferingState state, BufferingStateChangeReason reason); void OnDurationChange(base::TimeDelta duration); diff --git a/media/base/renderer.h b/media/base/renderer.h index 20b0330ea0f5..1dc4f6b02a8c 100644 --- a/media/base/renderer.h +++ b/media/base/renderer.h @@ -107,6 +107,10 @@ class MEDIA_EXPORT Renderer { virtual void SetMediaGeometry(const gfx::RectF& rect) {} #endif +#if BUILDFLAG(IS_TIZEN_TV) + virtual void SetContentMimeType(const std::string& mime_type) {} +#endif + // Starts rendering from |time|. virtual void StartPlayingFrom(base::TimeDelta time) = 0; diff --git a/media/filters/pipeline_controller.cc b/media/filters/pipeline_controller.cc index 26a9dccb77b2..32cd7d5af7c8 100644 --- a/media/filters/pipeline_controller.cc +++ b/media/filters/pipeline_controller.cc @@ -476,4 +476,10 @@ void PipelineController::OnTrackChangeComplete() { Dispatch(); } +#if BUILDFLAG(IS_TIZEN_TV) +void PipelineController::SetContentMimeType(const std::string& mime_type) { + if (pipeline_) + pipeline_->SetContentMimeType(mime_type); +} +#endif } // namespace media diff --git a/media/filters/pipeline_controller.h b/media/filters/pipeline_controller.h index 152a2ff2fa09..071ce065a585 100644 --- a/media/filters/pipeline_controller.h +++ b/media/filters/pipeline_controller.h @@ -163,6 +163,9 @@ class MEDIA_EXPORT PipelineController { void SetMediaGeometry(gfx::RectF rect_f); #endif +#if BUILDFLAG(IS_TIZEN_TV) + void SetContentMimeType(const std::string& mime_type); +#endif private: // Attempts to make progress from the current state to the target state. void Dispatch(); diff --git a/media/mojo/clients/mojo_renderer.cc b/media/mojo/clients/mojo_renderer.cc index f51b9b476cf5..3a2a101eaa8b 100644 --- a/media/mojo/clients/mojo_renderer.cc +++ b/media/mojo/clients/mojo_renderer.cc @@ -343,6 +343,16 @@ void MojoRenderer::OnStatisticsUpdate(const PipelineStatistics& stats) { client_->OnStatisticsUpdate(stats); } +#if BUILDFLAG(IS_TIZEN_TV) +void MojoRenderer::SetContentMimeType(const std::string& mime_type) { + DVLOG(2) << __func__ << " mime_type : " << mime_type; + DCHECK(task_runner_->RunsTasksInCurrentSequence()); + + if (remote_renderer_.is_bound()) + remote_renderer_->SetContentMimeType(mime_type); +} +#endif + void MojoRenderer::OnWaiting(WaitingReason reason) { DVLOG(1) << __func__; DCHECK(task_runner_->RunsTasksInCurrentSequence()); diff --git a/media/mojo/clients/mojo_renderer.h b/media/mojo/clients/mojo_renderer.h index bc24925e336a..918f3d2644b6 100644 --- a/media/mojo/clients/mojo_renderer.h +++ b/media/mojo/clients/mojo_renderer.h @@ -76,6 +76,10 @@ class MojoRenderer : public Renderer, public mojom::RendererClient { void SetMediaGeometry(const gfx::RectF& rect) override; #endif +#if BUILDFLAG(IS_TIZEN_TV) + void SetContentMimeType(const std::string& mime_type) override; +#endif + private: // mojom::RendererClient implementation, dispatched on the |task_runner_|. void OnTimeUpdate(base::TimeDelta time, diff --git a/media/mojo/clients/mojo_renderer_wrapper.cc b/media/mojo/clients/mojo_renderer_wrapper.cc index fda7f0d7175c..823956fb353b 100644 --- a/media/mojo/clients/mojo_renderer_wrapper.cc +++ b/media/mojo/clients/mojo_renderer_wrapper.cc @@ -76,4 +76,11 @@ base::TimeDelta MojoRendererWrapper::GetMediaTime() { return mojo_renderer_->GetMediaTime(); } +#if BUILDFLAG(IS_TIZEN_TV) +void MojoRendererWrapper::SetContentMimeType(const std::string& mime_type) { + if (mojo_renderer_) + mojo_renderer_->SetContentMimeType(mime_type); +} +#endif + } // namespace media diff --git a/media/mojo/clients/mojo_renderer_wrapper.h b/media/mojo/clients/mojo_renderer_wrapper.h index eee5a7140109..d0e1db3d708b 100644 --- a/media/mojo/clients/mojo_renderer_wrapper.h +++ b/media/mojo/clients/mojo_renderer_wrapper.h @@ -48,6 +48,10 @@ class MojoRendererWrapper : public Renderer { void SetMediaGeometry(const gfx::RectF& rect) override; #endif +#if BUILDFLAG(IS_TIZEN_TV) + void SetContentMimeType(const std::string& mime_type) override; +#endif + base::TimeDelta GetMediaTime() override; private: diff --git a/media/mojo/mojom/renderer.mojom b/media/mojo/mojom/renderer.mojom index 82a834751dcc..4efe13d754a2 100644 --- a/media/mojo/mojom/renderer.mojom +++ b/media/mojo/mojom/renderer.mojom @@ -67,6 +67,9 @@ interface Renderer { [EnableIf=tizen_multimedia] ToggleFullscreenMode(bool is_fullscreen) => (); + + [EnableIf=is_tizen_tv] + SetContentMimeType(string mime_type); }; // A Mojo equivalent of media::RendererClient. See media/mojo/README.md diff --git a/media/mojo/services/mojo_renderer_service.cc b/media/mojo/services/mojo_renderer_service.cc index ce09ae417eec..4b2b405b0847 100644 --- a/media/mojo/services/mojo_renderer_service.cc +++ b/media/mojo/services/mojo_renderer_service.cc @@ -209,6 +209,14 @@ void MojoRendererService::OnStatisticsUpdate(const PipelineStatistics& stats) { client_->OnStatisticsUpdate(stats); } +#if BUILDFLAG(IS_TIZEN_TV) +void MojoRendererService::SetContentMimeType(const std::string& mime_type) { + DVLOG(3) << __func__ << ", mime_type: " << mime_type; + if (renderer_) + renderer_->SetContentMimeType(mime_type); +} +#endif + void MojoRendererService::OnBufferingStateChange( BufferingState state, BufferingStateChangeReason reason) { diff --git a/media/mojo/services/mojo_renderer_service.h b/media/mojo/services/mojo_renderer_service.h index 87f08d0768fa..d15ec8716c10 100644 --- a/media/mojo/services/mojo_renderer_service.h +++ b/media/mojo/services/mojo_renderer_service.h @@ -82,6 +82,10 @@ class MEDIA_MOJO_EXPORT MojoRendererService final : public mojom::Renderer, void SetMediaGeometry(const gfx::RectF& rect) final; #endif +#if BUILDFLAG(IS_TIZEN_TV) + void SetContentMimeType(const std::string& mime_type) final; +#endif + private: enum State { STATE_UNINITIALIZED, diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc index d4ac4b84f8f0..0d759e0cea48 100644 --- a/net/base/mime_util.cc +++ b/net/base/mime_util.cc @@ -233,6 +233,9 @@ static const MimeInfo kSecondaryMappings[] = { {"text/x-sh", "sh"}, {"text/xml", "xsl,xbl,xslt"}, {"video/mpeg", "mpeg,mpg"}, +#if BUILDFLAG(IS_TIZEN_TV) + {"application/dash+xml", "mpd"}, +#endif }; // Finds mime type of |ext| from |mappings|. 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 8cf918bea502..1c09ddfe60b3 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 @@ -263,6 +263,8 @@ bool StructTraitsallow_file_access_from_external_urls = data.allow_file_access_from_external_urls(); + out->media_playback_notification_enabled = + data.media_playback_notification_enabled(); #endif return true; } 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 67c5df83d570..cb56a6a60988 100644 --- a/third_party/blink/public/common/web_preferences/web_preferences.h +++ b/third_party/blink/public/common/web_preferences/web_preferences.h @@ -320,6 +320,10 @@ struct BLINK_COMMON_EXPORT WebPreferences { unsigned tizen_version_release = 0; #endif +#if BUILDFLAG(IS_TIZEN_TV) + bool media_playback_notification_enabled = false; +#endif + // Whether download UI should be hidden on this page. bool hide_download_ui; 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 c4a015367ac1..0ed0971c958c 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 @@ -184,6 +184,11 @@ struct BLINK_COMMON_EXPORT StructTraitsSetMediaPlaybackNotificationEnabled(enabled); +} + +bool WebSettingsImpl::MediaPlaybackNotificationEnabled() { + return settings_->MediaPlaybackNotificationEnabled(); +} +#endif + #if defined(TIZEN_VIDEO_HOLE) void WebSettingsImpl::SetVideoHoleEnabled(bool enabled) { settings_->SetVideoHoleEnabled(enabled); 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 7a2a4ca38698..f64d55d3f464 100644 --- a/third_party/blink/renderer/core/exported/web_settings_impl.h +++ b/third_party/blink/renderer/core/exported/web_settings_impl.h @@ -243,6 +243,8 @@ class CORE_EXPORT WebSettingsImpl final : public WebSettings { #if BUILDFLAG(IS_TIZEN_TV) void SetAllowFileAccessFromExternalURLs(bool) override; bool AllowFileAccessFromExternalURLs() override; + void SetMediaPlaybackNotificationEnabled(bool) override; + bool MediaPlaybackNotificationEnabled() 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 e50ecae9b446..9684d22e129a 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc @@ -1786,6 +1786,8 @@ void WebView::ApplyWebPreferences(const web_pref::WebPreferences& prefs, #if BUILDFLAG(IS_TIZEN_TV) settings->SetAllowFileAccessFromExternalURLs( prefs.allow_file_access_from_external_urls); + settings->SetMediaPlaybackNotificationEnabled( + prefs.media_playback_notification_enabled); #endif #if BUILDFLAG(IS_EFL) diff --git a/third_party/blink/renderer/core/frame/settings.h b/third_party/blink/renderer/core/frame/settings.h index d4891f836710..f424df97f505 100644 --- a/third_party/blink/renderer/core/frame/settings.h +++ b/third_party/blink/renderer/core/frame/settings.h @@ -87,6 +87,15 @@ class CORE_EXPORT Settings { void SetDelegate(SettingsDelegate*); +#if BUILDFLAG(IS_TIZEN_TV) + void SetMediaPlaybackNotificationEnabled(bool enabled) { + media_playback_notification_enabled_ = enabled; + } + bool MediaPlaybackNotificationEnabled() const { + return media_playback_notification_enabled_; + } +#endif + private: void Invalidate(SettingsDelegate::ChangeType); @@ -94,6 +103,10 @@ class CORE_EXPORT Settings { GenericFontFamilySettings generic_font_family_settings_; +#if BUILDFLAG(IS_TIZEN_TV) + bool media_playback_notification_enabled_ : 1 = false; +#endif + #if BUILDFLAG(IS_EFL) struct { unsigned major; diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc index 6c6014bcce6f..919f5265bcff 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.cc +++ b/third_party/blink/renderer/core/html/media/html_media_element.cc @@ -1353,6 +1353,11 @@ void HTMLMediaElement::LoadResource(const WebMediaPlayerSource& source, return; } +#if BUILDFLAG(IS_TIZEN_TV) + ContentType cont_type(content_type); + content_mime_type_ = cont_type.GetType().DeprecatedLower(); +#endif + // The resource fetch algorithm SetNetworkState(kNetworkLoading); @@ -4029,6 +4034,33 @@ void HTMLMediaElement::ContextDestroyed() { removed_from_document_timer_.Stop(); } +#if BUILDFLAG(IS_TIZEN_TV) +WebString HTMLMediaElement::GetContentMIMEType() { + // If the MIME type is missing or is not meaningful, try to figure it out from + // the URL. + if (content_mime_type_.empty() || + content_mime_type_ == "application/octet-stream" || + content_mime_type_ == "text/plain") { + if (current_src_.GetSourceIfVisible().ProtocolIsData()) + content_mime_type_ = + MimeTypeFromDataURL(current_src_.GetSourceIfVisible().GetString()); + else { + String last_path_component = + current_src_.GetSourceIfVisible().LastPathComponent(); + size_t pos = last_path_component.ReverseFind('.'); + if (pos != kNotFound) { + String extension = last_path_component.Substring(pos + 1); + String media_type = + MIMETypeRegistry::GetMIMETypeForExtension(extension); + if (!media_type.empty()) + content_mime_type_ = media_type; + } + } + } + return WebString(content_mime_type_); +} +#endif + bool HTMLMediaElement::HasPendingActivity() const { const auto result = HasPendingActivityInternal(); // TODO(dalecurtis): Replace c-style casts in followup patch. diff --git a/third_party/blink/renderer/core/html/media/html_media_element.h b/third_party/blink/renderer/core/html/media/html_media_element.h index 1613b3a7a828..17e783fd47e6 100644 --- a/third_party/blink/renderer/core/html/media/html_media_element.h +++ b/third_party/blink/renderer/core/html/media/html_media_element.h @@ -380,6 +380,10 @@ class CORE_EXPORT HTMLMediaElement WebMediaPlayer::LoadType GetLoadType() const; +#if BUILDFLAG(IS_TIZEN_TV) + WebString GetContentMIMEType() override; +#endif + bool HasMediaSource() const { return media_source_attachment_.get(); } // Return true if element is paused and won't resume automatically if it @@ -866,6 +870,9 @@ class CORE_EXPORT HTMLMediaElement bool live_playback_complete_ : 1; #endif +#if BUILDFLAG(IS_TIZEN_TV) + String content_mime_type_; +#endif // Set if the user has used the context menu to set the visibility of the // controls. absl::optional user_wants_controls_visible_; diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.cc b/third_party/blink/renderer/platform/media/web_media_player_impl.cc index 27d5c3d13eef..47767d05b686 100644 --- a/third_party/blink/renderer/platform/media/web_media_player_impl.cc +++ b/third_party/blink/renderer/platform/media/web_media_player_impl.cc @@ -2997,6 +2997,11 @@ media::PipelineStatus WebMediaPlayerImpl::OnDemuxerCreated( if (start_type != media::Pipeline::StartType::kNormal) { attempting_suspended_start_ = true; } +#if BUILDFLAG(IS_TIZEN_TV) + blink::WebString content_mime_type = + blink::WebString(client_->GetContentMIMEType()); + pipeline_controller_->SetContentMimeType(content_mime_type.Utf8()); +#endif pipeline_controller_->Start(start_type, demuxer, this, is_streaming, is_static); diff --git a/tizen_src/chromium_impl/content/browser/media/tizen_renderer_impl.cc b/tizen_src/chromium_impl/content/browser/media/tizen_renderer_impl.cc index e380885c1054..dc2c609d2a5a 100644 --- a/tizen_src/chromium_impl/content/browser/media/tizen_renderer_impl.cc +++ b/tizen_src/chromium_impl/content/browser/media/tizen_renderer_impl.cc @@ -60,6 +60,9 @@ TizenRendererImpl::TizenRendererImpl( volume_(kDefaultVolume), #if defined(TIZEN_VIDEO_HOLE) video_rect_(gfx::RectF()), +#endif +#if BUILDFLAG(IS_TIZEN_TV) + notify_playback_state_(media::kPlaybackStop), #endif renderer_extension_receiver_(this, std::move(renderer_extension_receiver)), @@ -472,6 +475,53 @@ void TizenRendererImpl::OnStatisticsUpdate( const media::PipelineStatistics& stats) { NOTIMPLEMENTED(); } +#if BUILDFLAG(IS_TIZEN_TV) +void TizenRendererImpl::SetContentMimeType(const std::string& mime_type) { + mime_type_ = mime_type; + if (media_player_) + media_player_->SetContentMimeType(mime_type); +} + +bool TizenRendererImpl::PlaybackNotificationEnabled() { + content::WebContents* web_contents = GetWebContents(); + if (!web_contents) { + LOG(ERROR) << "web_contents is nullptr"; + return false; + } + blink::web_pref::WebPreferences web_preference = + web_contents->GetOrCreateWebPreferences(); + bool enable = web_preference.media_playback_notification_enabled; + LOG(INFO) << "media_playback_notification_enabled:" << enable; + return enable; +} + +void TizenRendererImpl::NotifyPlaybackState(int state, + int player_id, + const std::string& url, + const std::string& mime_type, + bool* media_resource_acquired, + std::string* translated_url, + std::string* drm_info) { + if (!PlaybackNotificationEnabled()) + return; + content::WebContentsDelegate* web_contents_delegate = + GetWebContentsDelegate(); + if (!web_contents_delegate) { + LOG(ERROR) << "GetWebContentsDelegate failed"; + return; + } + + if (notify_playback_state_ < media::kPlaybackReady && + state == media::kPlaybackStop) { + LOG(ERROR) << "player not Ready but notify Stop"; + } + + notify_playback_state_ = state; + web_contents_delegate->NotifyPlaybackState(state, player_id, url, mime_type, + media_resource_acquired, + translated_url, drm_info); +} +#endif void TizenRendererImpl::OnSeekableTimeChange(base::TimeDelta min_time, base::TimeDelta max_time, diff --git a/tizen_src/chromium_impl/content/browser/media/tizen_renderer_impl.h b/tizen_src/chromium_impl/content/browser/media/tizen_renderer_impl.h index bac09713b64a..d9e66cd1328b 100644 --- a/tizen_src/chromium_impl/content/browser/media/tizen_renderer_impl.h +++ b/tizen_src/chromium_impl/content/browser/media/tizen_renderer_impl.h @@ -114,6 +114,18 @@ class CONTENT_EXPORT TizenRendererImpl void OnVideoSizeChange(const gfx::Size& size) override; void OnDurationChange(base::TimeDelta duration) override; void OnBufferUpdate(base::TimeDelta time) override; + +#if BUILDFLAG(IS_TIZEN_TV) + bool PlaybackNotificationEnabled(); + void NotifyPlaybackState(int state, + int player_id = 0, + const std::string& url = "", + const std::string& mime_type = "", + bool* media_resource_acquired = NULL, + std::string* translated_url = NULL, + std::string* drm_info = NULL) override; +#endif + #if defined(TIZEN_TBM_SUPPORT) void OnNewTbmFrameAvailable(uint32_t player_id, gfx::TbmBufferHandle tbm_handle, @@ -138,6 +150,10 @@ class CONTENT_EXPORT TizenRendererImpl gfx::Rect GetViewportRect() const; #endif +#if BUILDFLAG(IS_TIZEN_TV) + void SetContentMimeType(const std::string& mime_type) override; +#endif + private: const float kDefaultVolume = 1.0; @@ -214,6 +230,14 @@ class CONTENT_EXPORT TizenRendererImpl gfx::RectF video_rect_; #endif +#if BUILDFLAG(IS_TIZEN_TV) + int notify_playback_state_; + // Stores the mime type. Required for URL streams which are DASH + // content, so that we can set it to the media_player_ before calling + // initialize / prepare. + std::string mime_type_; +#endif + WebContents* web_contents_ = nullptr; base::WeakPtrFactory weak_factory_{this}; diff --git a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi.h b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi.h index a3c7f2779c9c..4085727116b8 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi.h +++ b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi.h @@ -125,7 +125,9 @@ class MEDIA_EXPORT MediaPlayerBridgeCapi : public MediaPlayerTizen { uint32_t length, base::TimeDelta timestamp); #endif - MediaPlayerTizenClient* GetMediaPlayerClient() const { return client_; } + MediaPlayerTizenClient* GetMediaPlayerClient() const override { + return client_; + } player_state_e GetPlayerState(); // Both used by Tizen TV and other platform @@ -137,7 +139,7 @@ class MEDIA_EXPORT MediaPlayerBridgeCapi : public MediaPlayerTizen { virtual void UpdateDuration(); GURL url_; - int player_id_ = 0;; + int player_id_ = 0; int delayed_player_state_; player_h player_ = nullptr; diff --git a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_tv.cc b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_tv.cc index da8a9a5f1d74..a741dfa28f76 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_tv.cc +++ b/tizen_src/chromium_impl/media/filters/media_player_bridge_capi_tv.cc @@ -32,24 +32,61 @@ void MediaPlayerBridgeCapiTV::SetContentMimeType(const std::string& mime_type) { } void MediaPlayerBridgeCapiTV::Prepare() { + bool media_resource_acquired = false; + std::string translated_url; + std::string drm_info; + + if (GetMediaPlayerClient()) + GetMediaPlayerClient()->NotifyPlaybackState( + kPlaybackLoad, player_id_, url_.spec(), mime_type_, + &media_resource_acquired, &translated_url, &drm_info); + + LOG(INFO) << "media_resource_acquired: " << media_resource_acquired + << ",translated_url:" << translated_url + << ",drm_info: " << drm_info; + + if (GetMediaPlayerClient() && + GetMediaPlayerClient()->PlaybackNotificationEnabled() && + blink::IsHbbTV() && !translated_url.empty()) + url_ = media::GetCleanURL(translated_url); + + if (url_.spec().find(".mpd") != std::string::npos) + stream_type_ = DASH_STREAM; + else if (url_.spec().find(".m3u") != std::string::npos) + stream_type_ = HLS_STREAM; + else if (mime_type_.find("application/dash+xml") != std::string::npos) { + char steaming_type_dash[] = "DASH"; + char steaming_type_dash_ex[] = "DASHEX"; + player_set_streaming_type( + player_, blink::IsHbbTV() ? steaming_type_dash_ex : steaming_type_dash); + stream_type_ = DASH_STREAM; + } if (blink::IsHbbTV() && CheckHighBitRate() && stream_type_ == DASH_STREAM) AppendUrlHighBitRate(url_.spec()); MediaPlayerBridgeCapi::Prepare(); + if (GetMediaPlayerClient()) + GetMediaPlayerClient()->NotifyPlaybackState(kPlaybackReady, player_id_); } void MediaPlayerBridgeCapiTV::Release() { StopSeekableTimeUpdateTimer(); MediaPlayerBridgeCapi::Release(); + if (GetMediaPlayerClient()) + GetMediaPlayerClient()->NotifyPlaybackState(kPlaybackStop, player_id_); } bool MediaPlayerBridgeCapiTV::Play() { if (!MediaPlayerBridgeCapi::Play()) return false; + if (GetMediaPlayerClient()) + GetMediaPlayerClient()->NotifyPlaybackState(kPlaybackStart, player_id_); return true; } void MediaPlayerBridgeCapiTV::PlaybackCompleteUpdate() { MediaPlayerBridgeCapi::PlaybackCompleteUpdate(); + if (GetMediaPlayerClient()) + GetMediaPlayerClient()->NotifyPlaybackState(kPlaybackFinish, player_id_); } // namespace media void MediaPlayerBridgeCapiTV::PlayerPrepared() { diff --git a/tizen_src/chromium_impl/media/filters/media_player_esplusplayer.h b/tizen_src/chromium_impl/media/filters/media_player_esplusplayer.h index 2aecbd43ec5c..3727dd664ad8 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_esplusplayer.h +++ b/tizen_src/chromium_impl/media/filters/media_player_esplusplayer.h @@ -115,7 +115,9 @@ class MEDIA_EXPORT MediaPlayerESPlusPlayer : public MediaPlayerTizen { const media::AudioDecoderConfig& audio_config, esplusplayer_audio_stream_info* audio_stream_info); virtual bool ReadFromBufferQueue(DemuxerStream::Type type); - MediaPlayerTizenClient* GetMediaPlayerClient() const { return client_; } + MediaPlayerTizenClient* GetMediaPlayerClient() const override { + return client_; + } virtual esplusplayer_submit_status SubmitEsPacket( DemuxerStream::Type type, scoped_refptr buffer); diff --git a/tizen_src/chromium_impl/media/filters/media_player_esplusplayer_tv.cc b/tizen_src/chromium_impl/media/filters/media_player_esplusplayer_tv.cc index 00c53d1efb14..839fcd8cfbf2 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_esplusplayer_tv.cc +++ b/tizen_src/chromium_impl/media/filters/media_player_esplusplayer_tv.cc @@ -21,6 +21,8 @@ MediaPlayerESPlusPlayerTV::~MediaPlayerESPlusPlayerTV() { void MediaPlayerESPlusPlayerTV::Initialize(VideoRendererSink* sink) { LOG(INFO) << "(" << static_cast(this) << ") " << __func__; MediaPlayerESPlusPlayer::Initialize(sink); + if (GetMediaPlayerClient()) + GetMediaPlayerClient()->NotifyPlaybackState(kPlaybackLoad, player_id_); } void MediaPlayerESPlusPlayerTV::InitializeStreamConfig( @@ -32,17 +34,24 @@ void MediaPlayerESPlusPlayerTV::InitializeStreamConfig( bool MediaPlayerESPlusPlayerTV::Play() { LOG(INFO) << "(" << static_cast(this) << ") " << __func__; + if (GetMediaPlayerClient()) + GetMediaPlayerClient()->NotifyPlaybackState(kPlaybackStart, player_id_, "", + "", NULL, NULL, NULL); return MediaPlayerESPlusPlayer::Play(); } void MediaPlayerESPlusPlayerTV::Prepare() { LOG(INFO) << "(" << static_cast(this) << ") " << __func__; MediaPlayerESPlusPlayer::Prepare(); + if (GetMediaPlayerClient()) + GetMediaPlayerClient()->NotifyPlaybackState(kPlaybackStop, player_id_); } void MediaPlayerESPlusPlayerTV::Release() { LOG(INFO) << "(" << static_cast(this) << ") " << __func__; MediaPlayerESPlusPlayer::Release(); + if (GetMediaPlayerClient()) + GetMediaPlayerClient()->NotifyPlaybackState(kPlaybackStop, player_id_); } void MediaPlayerESPlusPlayerTV::PostPrepareComplete() { @@ -125,6 +134,8 @@ void MediaPlayerESPlusPlayerTV::OnPrepareComplete(bool result) { void MediaPlayerESPlusPlayerTV::OnEos() { MediaPlayerESPlusPlayer::OnEos(); + if (GetMediaPlayerClient()) + GetMediaPlayerClient()->NotifyPlaybackState(kPlaybackFinish, player_id_); } } // namespace media diff --git a/tizen_src/chromium_impl/media/filters/media_player_tizen.h b/tizen_src/chromium_impl/media/filters/media_player_tizen.h index c097ec184619..0835ecfa0479 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_tizen.h +++ b/tizen_src/chromium_impl/media/filters/media_player_tizen.h @@ -36,6 +36,16 @@ enum class PlayerRole { LocalCaptureStream = RemotePeerStream << 1 }; +enum PlaybackState { + kPlaybackLoad = 0, + // kPlaybackReady: player with both audio and video starts prepare and will + // acquire audio and video resources (if they are not already taken) + kPlaybackReady, + kPlaybackStart, + kPlaybackFinish, + kPlaybackStop, +}; + using PlayerRoleFlags = media::Flags; DEFINE_OPERATORS_FOR_FLAGS(MediaTypeFlags) @@ -72,7 +82,9 @@ class MEDIA_EXPORT MediaPlayerTizen { virtual void SetVolume(double volume) = 0; virtual base::TimeDelta GetCurrentTime() = 0; - virtual MediaPlayerTizenClient* GetMediaPlayerClient() const {return nullptr;} + virtual MediaPlayerTizenClient* GetMediaPlayerClient() const { + return nullptr; + } virtual void ToggleFullscreenMode(bool is_fullscreen) {} #if defined(TIZEN_TBM_SUPPORT) diff --git a/tizen_src/chromium_impl/media/filters/media_player_tizen_client.h b/tizen_src/chromium_impl/media/filters/media_player_tizen_client.h index 71cb20d71b82..95078d009457 100644 --- a/tizen_src/chromium_impl/media/filters/media_player_tizen_client.h +++ b/tizen_src/chromium_impl/media/filters/media_player_tizen_client.h @@ -55,6 +55,14 @@ class MEDIA_EXPORT MediaPlayerTizenClient { #endif #if BUILDFLAG(IS_TIZEN_TV) + virtual bool PlaybackNotificationEnabled() = 0; + virtual void NotifyPlaybackState(int state, + int player_id = 0, + const std::string& url = "", + const std::string& mime_type = "", + bool* media_resource_acquired = NULL, + std::string* translated_url = NULL, + std::string* drm_info = NULL) = 0; virtual content::WebContentsDelegate* GetWebContentsDelegate() const = 0; #endif }; diff --git a/tizen_src/ewk/efl_integration/BUILD.gn b/tizen_src/ewk/efl_integration/BUILD.gn index aebebfda35ac..dcd44ee52f43 100644 --- a/tizen_src/ewk/efl_integration/BUILD.gn +++ b/tizen_src/ewk/efl_integration/BUILD.gn @@ -543,6 +543,7 @@ shared_library("chromium-ewk") { "public/ewk_media_parental_rating_info.h", "public/ewk_media_parental_rating_info_product.h", "public/ewk_media_playback_info.cc", + "public/ewk_media_playback_info.h", "public/ewk_media_playback_info_product.h", "public/ewk_media_subtitle_info.cc", "public/ewk_media_subtitle_info_product.h", diff --git a/tizen_src/ewk/efl_integration/eweb_view.cc b/tizen_src/ewk/efl_integration/eweb_view.cc index 9e830c0c73bb..d7594ff08b26 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.cc +++ b/tizen_src/ewk/efl_integration/eweb_view.cc @@ -103,6 +103,7 @@ #include "devtools_port_manager.h" #include "private/ewk_file_chooser_request_private.h" #include "public/ewk_media_downloadable_font_info.h" +#include "public/ewk_media_playback_info_product.h" #include "public/ewk_user_media_internal.h" #endif @@ -3436,6 +3437,64 @@ void EWebView::NotifyDownloadableFontInfo(const char* scheme_id_uri, ewkMediaDownloadableFontInfoDelete(info); } +std::vector EWebView::NotifyPlaybackState(int state, + int player_id, + const char* url, + const char* mime_type) { + std::vector data; + Ewk_Media_Playback_Info* playback_info = + ewkMediaPlaybackInfoCreate(player_id, url, mime_type); + + LOG(INFO) + << "player_id:" << player_id << ",state: " << state + << "(0-load : 1-videoready : 2-ready : 3-start : 4-finish : 5-stop)"; + switch (state) { + case kPlaybackLoad: + SmartCallback().call( + static_cast(playback_info)); + break; + case kPlaybackReady: + SmartCallback().call( + static_cast(playback_info)); + break; + case kPlaybackStart: + SmartCallback().call( + static_cast(playback_info)); + break; + case kPlaybackFinish: + SmartCallback().call( + static_cast(playback_info)); + break; + case kPlaybackStop: + SmartCallback().call( + static_cast(playback_info)); + break; + default: + NOTREACHED(); + data.push_back(""); + ewkMediaPlaybackInfoDelete(playback_info); + return data; + } + + bool media_resource_acquired = + ewk_media_playback_info_media_resource_acquired_get(playback_info) + ? true + : false; + data.push_back(media_resource_acquired ? "mediaResourceAcquired" : ""); + const char* translated_url = + ewk_media_playback_info_translated_url_get(playback_info); + data.push_back(translated_url ? std::string(translated_url) : ""); + const char* drm_info = ewk_media_playback_info_drm_info_get(playback_info); + data.push_back(drm_info ? std::string(drm_info) : ""); + + LOG(INFO) << "evasObject: " << ewk_view_ + << ", media_resource_acquired :" << media_resource_acquired + << ", translated_url:" << translated_url + << ", drm_info:" << drm_info; + ewkMediaPlaybackInfoDelete(playback_info); + return data; +} + void EWebView::NotifyMediaStateChanged(uint32_t device_type, uint32_t previous, uint32_t current) { diff --git a/tizen_src/ewk/efl_integration/eweb_view.h b/tizen_src/ewk/efl_integration/eweb_view.h index 6cb3204d8f9c..5cb50584888a 100644 --- a/tizen_src/ewk/efl_integration/eweb_view.h +++ b/tizen_src/ewk/efl_integration/eweb_view.h @@ -380,6 +380,10 @@ class EWebView { const char* value, const char* data, int type); + std::vector NotifyPlaybackState(int state, + int player_id, + const char* url, + const char* mime_type); #endif // IS_TIZEN_TV void SetSessionTimeout(uint64_t timeout); double GetTextZoomFactor() const; @@ -983,6 +987,16 @@ class EWebView { bool is_high_bitrate_ = false; base::OnceClosure pending_setfocus_closure_; + + enum PlaybackState { + kPlaybackLoad = 0, + // kPlaybackReady: player with both audio and video starts prepare and will + // acquire audio and video resources (if they are not already taken) + kPlaybackReady, + kPlaybackStart, + kPlaybackFinish, + kPlaybackStop, + }; #endif std::unique_ptr<_Ewk_Back_Forward_List> back_forward_list_; 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 4f36ddbbacd1..4d4059434865 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 @@ -40,42 +40,45 @@ struct _Ewk_Media_Playback_Info { const char* ewk_media_playback_info_media_url_get( Ewk_Media_Playback_Info* data) { - LOG_EWK_API_MOCKUP(); - return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0); + return data->media_url; } const char* ewk_media_playback_info_mime_type_get( Ewk_Media_Playback_Info* data) { - LOG_EWK_API_MOCKUP(); - return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0); + return data->mime_type; } const char* ewk_media_playback_info_translated_url_get( Ewk_Media_Playback_Info* data) { - LOG_EWK_API_MOCKUP(); - return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0); + return data->translated_url; } const char* ewk_media_playback_info_drm_info_get( Ewk_Media_Playback_Info* data) { - LOG_EWK_API_MOCKUP(); - return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0); + return data->drm_info; } void ewk_media_playback_info_media_resource_acquired_set( Ewk_Media_Playback_Info* data, Eina_Bool media_resource_acquired) { - LOG_EWK_API_MOCKUP(); + if(data) + data->media_resource_acquired = media_resource_acquired; } void ewk_media_playback_info_translated_url_set(Ewk_Media_Playback_Info* data, const char* translated_url) { - LOG_EWK_API_MOCKUP(); + if(data) + data->translated_url = eina_stringshare_add(translated_url ? translated_url : ""); } void ewk_media_playback_info_drm_info_set(Ewk_Media_Playback_Info* data, const char* drm_info) { - LOG_EWK_API_MOCKUP(); + if(data) + data->drm_info = eina_stringshare_add(drm_info ? drm_info : ""); } Ewk_Hardware_Decoders ewk_media_playback_info_decoder_get( @@ -93,8 +96,8 @@ void ewk_media_playback_info_decoder_set( const int ewk_media_playback_info_video_id_get(Ewk_Media_Playback_Info* data) { - LOG_EWK_API_MOCKUP(); - return 0; + EINA_SAFETY_ON_NULL_RETURN_VAL(data, 0); + return data->video_id; } Ewk_Media_Playback_Info* ewkMediaPlaybackInfoCreate(const int player_id, @@ -102,21 +105,26 @@ Ewk_Media_Playback_Info* ewkMediaPlaybackInfoCreate(const int player_id, const char* mime_type) { #if BUILDFLAG(IS_TIZEN_TV) - LOG_EWK_API_MOCKUP(); - return NULL; + Ewk_Media_Playback_Info* playback_info = new Ewk_Media_Playback_Info; + playback_info->video_id = player_id; + playback_info->media_url = eina_stringshare_add(url ? url : ""); + playback_info->mime_type = eina_stringshare_add(mime_type ? mime_type : ""); + playback_info->media_resource_acquired = false; + playback_info->translated_url = 0; + playback_info->drm_info = 0; + return playback_info; #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; + EINA_SAFETY_ON_NULL_RETURN_VAL(data, false); + return data->media_resource_acquired; #else LOG_EWK_API_MOCKUP("Only for Tizen TV."); return EINA_FALSE; @@ -126,7 +134,18 @@ Eina_Bool ewk_media_playback_info_media_resource_acquired_get( void ewkMediaPlaybackInfoDelete(Ewk_Media_Playback_Info* data) { #if BUILDFLAG(IS_TIZEN_TV) - LOG_EWK_API_MOCKUP(); + if(!data) + return; + + if (data->media_url) + eina_stringshare_del(data->media_url); + if (data->mime_type) + eina_stringshare_del(data->mime_type); + if (data->translated_url) + eina_stringshare_del(data->translated_url); + if (data->drm_info) + eina_stringshare_del(data->drm_info); + delete data; #else LOG_EWK_API_MOCKUP("Only for Tizen TV."); #endif diff --git a/tizen_src/ewk/efl_integration/public/ewk_settings.cc b/tizen_src/ewk/efl_integration/public/ewk_settings.cc index 9f6b71b47f21..5870cb32d3b2 100644 --- a/tizen_src/ewk/efl_integration/public/ewk_settings.cc +++ b/tizen_src/ewk/efl_integration/public/ewk_settings.cc @@ -729,13 +729,25 @@ void ewk_settings_default_audio_input_device_set(Ewk_Settings* settings, const c void ewk_settings_media_playback_notification_set(Ewk_Settings* settings, Eina_Bool enabled) { +#if BUILDFLAG(IS_TIZEN_TV) + EINA_SAFETY_ON_NULL_RETURN(settings); + LOG(INFO) << " set playback notification enabled:" << enabled; + settings->getPreferences().media_playback_notification_enabled = enabled; + ewkUpdateWebkitPreferences(settings->ewk_view()); +#else LOG_EWK_API_MOCKUP(); +#endif } Eina_Bool ewk_settings_media_playback_notification_get(const Ewk_Settings* settings) { +#if BUILDFLAG(IS_TIZEN_TV) + EINA_SAFETY_ON_NULL_RETURN_VAL(settings, false); + return settings->getPreferences().media_playback_notification_enabled; +#else LOG_EWK_API_MOCKUP(); return EINA_FALSE; +#endif } void ewk_settings_media_subtitle_notification_set(Ewk_Settings *settings, Eina_Bool enabled) diff --git a/tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc b/tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc index f8a52dcedff3..030db1bd1c61 100644 --- a/tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc +++ b/tizen_src/ewk/efl_integration/web_contents_delegate_efl.cc @@ -797,5 +797,27 @@ void WebContentsDelegateEfl::NotifyDownloadableFontInfo( web_view_->NotifyDownloadableFontInfo(scheme_id_uri.c_str(), value.c_str(), data.c_str(), type); } + +void WebContentsDelegateEfl::NotifyPlaybackState(int state, + int player_id, + const std::string& url, + const std::string& mime_type, + bool* media_resource_acquired, + std::string* translated_url, + std::string* drm_info) { + if (!web_view_) + return; + std::vector data = web_view_->NotifyPlaybackState( + state, player_id, url.empty() ? "" : url.c_str(), + mime_type.empty() ? "" : mime_type.c_str()); + if (data.size()) { + if (media_resource_acquired) + *media_resource_acquired = !data.at(0).empty() ? true : false; + if (translated_url) + *translated_url = data.at(1); + if (drm_info) + *drm_info = data.at(2); + } +} #endif } // namespace content diff --git a/tizen_src/ewk/efl_integration/web_contents_delegate_efl.h b/tizen_src/ewk/efl_integration/web_contents_delegate_efl.h index 42fb4c7e5b86..a056dce0755f 100644 --- a/tizen_src/ewk/efl_integration/web_contents_delegate_efl.h +++ b/tizen_src/ewk/efl_integration/web_contents_delegate_efl.h @@ -81,6 +81,13 @@ class WebContentsDelegateEfl : public WebContentsDelegate { const std::string& value, const std::string& data, int type) override; + void NotifyPlaybackState(int state, + int player_id, + const std::string& url, + const std::string& mime_type, + bool* media_resource_acquired, + std::string* translated_url, + std::string* drm_info) override; #endif void RequestCertificateConfirm( WebContents* web_contents,