#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"
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,
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;
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