[M120 Migration][VD] Add DemuxerUrl based stream support 71/307771/5
authorzhishun.zhou <zhishun.zhou@samsung.com>
Tue, 12 Mar 2024 12:23:01 +0000 (20:23 +0800)
committerYanqing Lu <yanqing.lu@samsung.com>
Thu, 14 Mar 2024 09:59:30 +0000 (09:59 +0000)
Issue: DASH stream playback failed.
Reason: DASH Stream(except HBBTV case) use espp on M108.
        But DASH is not supported by ffmepgdemuxer.
Solution: Same as previous tizen version.
        DASH stream and HLS Stream use capi-player.

Patch from:
https://review.tizen.org/gerrit/#/c/300516/
https://review.tizen.org/gerrit/#/c/307183/

Change-Id: I4f33ccc4dead4db7c14d99af751090e5e15af888
Signed-off-by: xiaofang <fang.xiao@samsung.com>
Signed-off-by: zhishun.zhou <zhishun.zhou@samsung.com>
content/public/renderer/content_renderer_client.cc
content/public/renderer/content_renderer_client.h
content/renderer/media/media_factory.cc
third_party/blink/public/platform/web_media_player_source.h
third_party/blink/renderer/core/html/media/html_media_element.cc
tizen_src/chromium_impl/tizen/tizen_tv_platform.h

index 6d54932..85a765e 100644 (file)
@@ -24,6 +24,7 @@
 #include "content/public/renderer/render_frame.h"
 #include "media/base/media_url_demuxer.h"
 #include "third_party/blink/public/web/web_local_frame.h"
+#include "tizen_src/chromium_impl/tizen/tizen_tv_platform.h"
 #include "tizen_src/ewk/efl_integration/common/application_type.h"
 #endif
 
@@ -82,12 +83,47 @@ bool ContentRendererClient::DeferMediaLoad(RenderFrame* render_frame,
   return false;
 }
 
+#if defined(TIZEN_MULTIMEDIA) && BUILDFLAG(IS_TIZEN_TV)
+bool ContentRendererClient::DemuxerUrlNeeded(
+    const GURL& url,
+    const std::string content_mime_type) {
+  // Application_type.cc is not built with "build_chrome" flag
+#if !defined(BUILD_CHROME)
+  if (content::IsHbbTV() ||
+      ((GetProductType() == "LFD") && content::IsTIZENWRT()))
+    return true;
+#endif
+
+  /* some dash file don't set mime_type, need check file type */
+  if (url.spec().find(".mpd") != std::string::npos)
+    return true;
+
+  if (content_mime_type.empty())
+    return false;
+
+  const static std::set<std::string> demuxer_needed_mime_type{
+      "application/dash+xml",  "application/vnd.apple.mpegurl",
+      "application/x-mpegURL", "application/x-mpegurl",
+      "application/mpegurl",   "audio/mpegurl",
+      "audio/x-mpegurl"};
+  return demuxer_needed_mime_type.find(content_mime_type) !=
+         demuxer_needed_mime_type.end();
+}
+#endif
+
 std::unique_ptr<media::Demuxer> ContentRendererClient::OverrideDemuxerForUrl(
     RenderFrame* render_frame,
     const GURL& url,
+#if BUILDFLAG(IS_TIZEN_TV)
+    const std::string content_mime_type,
+#endif
     scoped_refptr<base::SequencedTaskRunner> task_runner) {
 #if defined(TIZEN_MULTIMEDIA) && BUILDFLAG(IS_TIZEN_TV)
-  if (blink::IsHbbTV()) {
+  bool is_demuxer_url_needed = DemuxerUrlNeeded(url, content_mime_type);
+  LOG(INFO) << "is_demuxer_url_needed : " << is_demuxer_url_needed
+            << ", content_mime_type: " << content_mime_type
+            << ", url: " << url.spec();
+  if (is_demuxer_url_needed) {
     blink::WebLocalFrame* frame = render_frame->GetWebFrame();
     return std::make_unique<media::MediaUrlDemuxer>(
         task_runner, url, frame->GetDocument().SiteForCookies(),
index 7f0d9f3..318f457 100644 (file)
@@ -188,8 +188,18 @@ class CONTENT_EXPORT ContentRendererClient {
   virtual std::unique_ptr<media::Demuxer> OverrideDemuxerForUrl(
       RenderFrame* render_frame,
       const GURL& url,
+#if BUILDFLAG(IS_TIZEN_TV)
+      const std::string content_mime_type,
+#endif
       scoped_refptr<base::SequencedTaskRunner> task_runner);
 
+#if defined(TIZEN_MULTIMEDIA) && BUILDFLAG(IS_TIZEN_TV)
+  // HLS/DASH stream not supported by ffmpeg, so need change to Tizen TV
+  // capi-player.
+  virtual bool DemuxerUrlNeeded(const GURL& url,
+                                const std::string content_mime_type);
+#endif
+
   // Allows the embedder to provide a WebSocketHandshakeThrottleProvider. If it
   // returns NULL then none will be used.
   virtual std::unique_ptr<blink::WebSocketHandshakeThrottleProvider>
index ef9d506..0cb2303 100644 (file)
@@ -491,8 +491,12 @@ blink::WebMediaPlayer* MediaFactory::CreateMediaPlayer(
       video_frame_compositor_task_runner, std::move(submitter));
 
   std::unique_ptr<media::Demuxer> demuxer_override =
-      GetContentClient()->renderer()->OverrideDemuxerForUrl(render_frame_, url,
-                                                            media_task_runner);
+      GetContentClient()->renderer()->OverrideDemuxerForUrl(
+          render_frame_, url,
+#if BUILDFLAG(IS_TIZEN_TV)
+          source.ContentMineType().Utf8(),
+#endif
+          media_task_runner);
 
 #if BUILDFLAG(ENABLE_CAST_RECEIVER)
   if (!demuxer_override && cast_streaming_resource_provider_) {
index 0863d0e..b42378c 100644 (file)
@@ -24,9 +24,19 @@ class BLINK_PLATFORM_EXPORT WebMediaPlayerSource {
   bool IsMediaStream() const;
   WebMediaStream GetAsMediaStream() const;
 
+#if BUILDFLAG(IS_TIZEN_TV)
+  const WebString& ContentMineType() const { return content_mime_type_; }
+  void SetContentMineType(const WebString& content_mime_type) {
+    content_mime_type_ = content_mime_type;
+  }
+#endif
+
  private:
   WebURL url_;
   WebMediaStream media_stream_;
+#if BUILDFLAG(IS_TIZEN_TV)
+  WebString content_mime_type_;
+#endif
 };
 
 }  // namespace blink
index d4eb2eb..abdb046 100644 (file)
@@ -1528,6 +1528,9 @@ void HTMLMediaElement::StartPlayerLoad() {
     return;
   }
 
+#if BUILDFLAG(IS_TIZEN_TV)
+  source.SetContentMineType(content_mime_type_);
+#endif
   web_media_player_ =
       frame->Client()->CreateWebMediaPlayer(*this, source, this);
 
index e54500d..f18b59e 100644 (file)
@@ -131,6 +131,21 @@ inline std::string GetTVChipset() {
   return chipset;
 }
 
+inline std::string GetProductType() {
+  const char key_producttype[] =
+      "com.samsung/featureconf/product_type_for_model_binding";
+  std::string product_type;
+  char* str = nullptr;
+  int ret = system_info_get_custom_string(key_producttype, &str);
+  if (ret != SYSTEM_INFO_ERROR_NONE) {
+    LOG(WARNING) << "Failed to get system info : " << key_producttype;
+  } else if (str) {
+    product_type = str;
+    free(str);
+  }
+  return product_type;
+}
+
 inline ResourceTableIndex GetResourceTableIndex() {
   const char rm_tbl_id_path[] = "/proc/device-tree/resource-manager/rm_tbl_idx";
   int rm_idx = -1;  // negative values are not used in RM table index