[M120 Migration][HBBTV][MM] Support H5 drm error feature 63/307163/2
authorzhishun.zhou <zhishun.zhou@samsung.com>
Tue, 5 Mar 2024 13:00:49 +0000 (21:00 +0800)
committerBot Blink <blinkbot@samsung.com>
Wed, 6 Mar 2024 10:16:14 +0000 (10:16 +0000)
1. Set drm info for video decoding
2. Add drm error callback

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

Change-Id: Id33f5a2b83d3ea0afa34d3bd3d430e98de9e745b
Signed-off-by: peng1xiao <peng1.xiao@samsung.com>
Signed-off-by: zhishun.zhou <zhishun.zhou@samsung.com>
tizen_src/chromium_impl/media/filters/media_player_bridge_capi_tv.cc
tizen_src/chromium_impl/media/filters/media_player_bridge_capi_tv.h

index a741dfa..1dc2c6c 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "media/filters/media_player_bridge_capi_tv.h"
 
+#include "base/strings/string_split.h"
 #include "media/base/efl/media_player_util_efl.h"
 #include "tizen_src/chromium_impl/media/filters/media_player_tizen_client.h"
 
@@ -11,6 +12,14 @@ namespace {
 const int kSeekableTimeUpdateInterval = 500;
 }
 
+static void DrmErrorCb(int err_code, char* err_str, void* data) {
+  DCHECK(data);
+  media::MediaPlayerBridgeCapiTV* player =
+      static_cast<media::MediaPlayerBridgeCapiTV*>(data);
+
+  player->OnDrmError(err_code, err_str);
+}
+
 namespace media {
 
 MediaPlayerBridgeCapiTV::MediaPlayerBridgeCapiTV(const GURL& url,
@@ -47,8 +56,14 @@ void MediaPlayerBridgeCapiTV::Prepare() {
 
   if (GetMediaPlayerClient() &&
       GetMediaPlayerClient()->PlaybackNotificationEnabled() &&
-      blink::IsHbbTV() && !translated_url.empty())
-    url_ = media::GetCleanURL(translated_url);
+      blink::IsHbbTV()) {
+    if (!SetDrmInfo(drm_info)) {
+      LOG(ERROR) << "SetDrmInfo failed";
+      return;
+    }
+    if (!translated_url.empty())
+      url_ = media::GetCleanURL(translated_url);
+  }
 
   if (url_.spec().find(".mpd") != std::string::npos)
     stream_type_ = DASH_STREAM;
@@ -259,4 +274,67 @@ void MediaPlayerBridgeCapiTV::HandleDownloadableFontInfo(
                                                     type);
 }
 
+void MediaPlayerBridgeCapiTV::Initialize(VideoRendererSink* sink) {
+  player_set_drm_error_cb(player_, DrmErrorCb, this);
+  MediaPlayerBridgeCapi::Initialize(sink);
+}
+
+bool MediaPlayerBridgeCapiTV::SetDrmInfo(std::string& drm_info) {
+  // The DRM info from HbbTV comes as a JSON-like string in the following
+  // format:
+  // pair = Property ':' Value
+  // string = pair {',' pair}
+  std::vector<std::string> drm_info_pairs = base::SplitStringUsingSubstr(
+      drm_info, ", ", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+  for (auto it = drm_info_pairs.begin(); it != drm_info_pairs.end(); ++it) {
+    std::vector<std::string> drm_info_pair = base::SplitStringUsingSubstr(
+        *it, ": ", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+
+    if (drm_info_pair.size() != 2)
+      continue;
+
+    std::string trim_key = drm_info_pair.at(0);
+    std::string trim_value = drm_info_pair.at(1);
+    LOG(INFO) << "trim_key: " << trim_key.c_str()
+              << ",trim_value: " << trim_value.c_str();
+
+    if (!SetMediaDRMInfo(trim_key, trim_value)) {
+      LOG(ERROR)
+          << "MediaPlayerBridgeCapiTV::SetDrmInfo SetMediaDRMInfo failed";
+      return false;
+    }
+  }
+
+  return true;
+}
+
+bool MediaPlayerBridgeCapiTV::SetMediaDRMInfo(const std::string& type_data,
+                                              const std::string& value_data) {
+  LOG(INFO) << "player_set_drm_info(type_length(" << type_data.length() << ") "
+            << " value_length(" << value_data.length() << ")) ";
+  int ret = PLAYER_ERROR_INVALID_OPERATION;
+  const void* type_data_ptr = type_data.c_str();
+  const void* value_data_ptr = value_data.c_str();
+  player_drm_type_e drm_type = PLAYER_DRM_TYPE_PLAYREADY;
+  ret = player_set_drm_info(player_, type_data_ptr, type_data.length(),
+                            value_data_ptr, value_data.length(), drm_type);
+  if (ret != PLAYER_ERROR_NONE) {
+    MediaPlayerBridgeCapi::OnHandlePlayerError(ret, FROM_HERE);
+    return false;
+  }
+
+  return true;
+}
+
+void MediaPlayerBridgeCapiTV::OnDrmError(int err_code, char* err_str) {
+  LOG(ERROR) << "OnDrmError err_str[" << err_str << "]";
+  if (!task_runner_->BelongsToCurrentThread()) {
+    task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&MediaPlayerBridgeCapiTV::OnDrmError,
+                       weak_factory_.GetWeakPtr(), err_code, err_str));
+  }
+  MediaPlayerBridgeCapi::OnHandlePlayerError(err_code, FROM_HERE);
+}
+
 }  // namespace media
index 68f09cf..ecebe7d 100644 (file)
@@ -25,7 +25,7 @@ class MEDIA_EXPORT MediaPlayerBridgeCapiTV : public MediaPlayerBridgeCapi {
                           const std::string& user_agent,
                           double volume);
   ~MediaPlayerBridgeCapiTV() override;
-
+  void Initialize(VideoRendererSink* sink) override;
   bool Play() override;
   void Prepare() override;
   void Release() override;
@@ -38,10 +38,14 @@ class MEDIA_EXPORT MediaPlayerBridgeCapiTV : public MediaPlayerBridgeCapi {
                                   const std::string& data,
                                   int type);
 
+  void OnDrmError(int err_code, char* err_str);
+
  protected:
   void PlayerPrepared() override;
 
  private:
+  bool SetDrmInfo(std::string& drm_info);
+  bool SetMediaDRMInfo(const std::string&, const std::string&);
   void StartSeekableTimeUpdateTimer();
   void StopSeekableTimeUpdateTimer();
   void OnSeekableTimeUpdateTimerFired();