Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(810)

Unified Diff: webkit/media/android/media_source_delegate.cc

Issue 14247018: Implement WebRTC in Chrome for TV (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed some comments Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/media/android/media_source_delegate.cc
diff --git a/webkit/media/android/media_source_delegate.cc b/webkit/media/android/media_source_delegate.cc
index dd87330b50d1396792f4f0283b190ec0f76f8fa4..26f7836b230c7ded1fd045e78969e90a6f148915 100644
--- a/webkit/media/android/media_source_delegate.cc
+++ b/webkit/media/android/media_source_delegate.cc
@@ -21,9 +21,11 @@
#include "webkit/media/webmediaplayer_util.h"
#include "webkit/media/webmediasourceclient_impl.h"
+using media::DemuxerHost;
using media::DemuxerStream;
using media::MediaPlayerHostMsg_DemuxerReady_Params;
using media::MediaPlayerHostMsg_ReadFromDemuxerAck_Params;
+using media::PipelineStatusCB;
using WebKit::WebMediaPlayer;
using WebKit::WebString;
@@ -59,73 +61,195 @@ static void LogMediaSourceError(const scoped_refptr<media::MediaLog>& media_log,
media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error));
}
-MediaSourceDelegate::MediaSourceDelegate(
- WebKit::WebFrame* frame,
- WebKit::WebMediaPlayerClient* client,
- WebMediaPlayerProxyAndroid* proxy,
- int player_id,
- media::MediaLog* media_log)
- : weak_this_(this),
- client_(client),
- proxy_(proxy),
- player_id_(player_id),
- media_log_(media_log),
- audio_params_(new MediaPlayerHostMsg_ReadFromDemuxerAck_Params),
- video_params_(new MediaPlayerHostMsg_ReadFromDemuxerAck_Params),
- seeking_(false) {
- if (WebKit::WebRuntimeFeatures::isEncryptedMediaEnabled()) {
- decryptor_.reset(new ProxyDecryptor(
- client,
- frame,
- BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnKeyAdded),
- BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnKeyError),
- BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnKeyMessage),
- BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnNeedKey)));
- decryptor_->SetDecryptorReadyCB(
- BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDecryptorReady));
+// KeyHandlingDemuxer ----------------------------------------------------------
+
+class KeyHandlingDemuxer : public media::Demuxer {
+ public:
+ explicit KeyHandlingDemuxer(media::Demuxer* demuxer);
+ virtual ~KeyHandlingDemuxer();
+
+ virtual WebKit::WebMediaPlayer::MediaKeyException GenerateKeyRequest(
+ const WebKit::WebString& key_system,
+ const unsigned char* init_data,
+ unsigned init_data_length) {
+ return WebKit::WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
}
+ virtual WebKit::WebMediaPlayer::MediaKeyException AddKey(
+ const WebKit::WebString& key_system,
+ const unsigned char* key,
+ unsigned key_length,
+ const unsigned char* init_data,
+ unsigned init_data_length,
+ const WebKit::WebString& session_id) {
+ return WebKit::WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
+ }
+ virtual WebKit::WebMediaPlayer::MediaKeyException CancelKeyRequest(
+ const WebKit::WebString& key_system,
+ const WebKit::WebString& session_id) {
+ return WebKit::WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
+ }
+ virtual int GetDurationMs() { return -1; }
+
+ // media::Demuxer implementation
+ virtual void Initialize(DemuxerHost* host, const PipelineStatusCB& status_cb)
+ OVERRIDE;
+ virtual void SetPlaybackRate(float playback_rate) OVERRIDE;
+ virtual void Seek(base::TimeDelta time, const PipelineStatusCB& status_cb)
+ OVERRIDE;
+ virtual void Stop(const base::Closure& callback) OVERRIDE;
+ virtual void OnAudioRendererDisabled() OVERRIDE;
+ virtual DemuxerStream* GetStream(DemuxerStream::Type type) OVERRIDE;
+ virtual base::TimeDelta GetStartTime() const OVERRIDE;
+
+ protected:
+ scoped_ptr<media::Demuxer> demuxer_;
+};
+
+KeyHandlingDemuxer::KeyHandlingDemuxer(media::Demuxer* demuxer)
+ : demuxer_(demuxer) {}
+
+KeyHandlingDemuxer::~KeyHandlingDemuxer() {}
+
+void KeyHandlingDemuxer::Initialize(DemuxerHost* host,
+ const PipelineStatusCB& status_cb) {
+ demuxer_->Initialize(host, status_cb);
}
-MediaSourceDelegate::~MediaSourceDelegate() {}
+void KeyHandlingDemuxer::SetPlaybackRate(float playback_rate) {
+ demuxer_->SetPlaybackRate(playback_rate);
+}
-void MediaSourceDelegate::Initialize(
- scoped_ptr<WebKit::WebMediaSource> media_source,
- const UpdateNetworkStateCB& update_network_state_cb) {
- DCHECK(media_source);
- media_source_ = media_source.Pass();
- update_network_state_cb_ = update_network_state_cb;
-
- chunk_demuxer_.reset(new media::ChunkDemuxer(
- BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerOpened),
- BIND_TO_RENDER_LOOP_2(&MediaSourceDelegate::OnNeedKey, "", ""),
- base::Bind(&LogMediaSourceError, media_log_)));
- chunk_demuxer_->Initialize(this,
- BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerInitDone));
+void KeyHandlingDemuxer::Seek(base::TimeDelta time,
+ const PipelineStatusCB& status_cb) {
+ demuxer_->Seek(time, status_cb);
}
-const WebKit::WebTimeRanges& MediaSourceDelegate::Buffered() {
- buffered_web_time_ranges_ =
- ConvertToWebTimeRanges(buffered_time_ranges_);
- return buffered_web_time_ranges_;
+void KeyHandlingDemuxer::Stop(const base::Closure& callback) {
+ demuxer_->Stop(callback);
}
-size_t MediaSourceDelegate::DecodedFrameCount() const {
- return statistics_.video_frames_decoded;
+void KeyHandlingDemuxer::OnAudioRendererDisabled() {
+ demuxer_->OnAudioRendererDisabled();
}
-size_t MediaSourceDelegate::DroppedFrameCount() const {
- return statistics_.video_frames_dropped;
+DemuxerStream* KeyHandlingDemuxer::GetStream(
+ DemuxerStream::Type type) {
+ return demuxer_->GetStream(type);
}
-size_t MediaSourceDelegate::AudioDecodedByteCount() const {
- return statistics_.audio_bytes_decoded;
+base::TimeDelta KeyHandlingDemuxer::GetStartTime() const {
+ return demuxer_->GetStartTime();
}
-size_t MediaSourceDelegate::VideoDecodedByteCount() const {
- return statistics_.video_bytes_decoded;
+// KeyHandlingChunkDemuxer -----------------------------------------------------
+
+namespace {
+
+class KeyHandlingChunkDemuxer : public KeyHandlingDemuxer {
+ public:
+ typedef base::Callback<void(const std::string& key_system)> NotifyDemuxerCB;
+
+ KeyHandlingChunkDemuxer(WebKit::WebFrame* frame,
+ WebKit::WebMediaPlayerClient* client,
+ WebKit::WebMediaSource* media_source,
+ scoped_refptr<media::MediaLog> media_log,
+ NotifyDemuxerCB notify_demuxer_cb);
+ virtual ~KeyHandlingChunkDemuxer();
+
+ // KeyHandlingDemuxer
+ virtual WebKit::WebMediaPlayer::MediaKeyException GenerateKeyRequest(
+ const WebKit::WebString& key_system,
+ const unsigned char* init_data,
+ unsigned init_data_length) OVERRIDE;
+ virtual WebKit::WebMediaPlayer::MediaKeyException AddKey(
+ const WebKit::WebString& key_system,
+ const unsigned char* key,
+ unsigned key_length,
+ const unsigned char* init_data,
+ unsigned init_data_length,
+ const WebKit::WebString& session_id) OVERRIDE;
+ virtual WebKit::WebMediaPlayer::MediaKeyException CancelKeyRequest(
+ const WebKit::WebString& key_system,
+ const WebKit::WebString& session_id) OVERRIDE;
+ virtual int GetDurationMs() OVERRIDE;
+
+ // media::Demuxer
+ virtual void Seek(base::TimeDelta time, const PipelineStatusCB& status_cb)
+ OVERRIDE;
+
+ private:
+ // Callbacks for ChunkDemuxer & Decryptor.
+ void OnDemuxerOpened();
+ void OnKeyAdded(const std::string& key_system, const std::string& session_id);
+ void OnKeyError(const std::string& key_system,
+ const std::string& session_id,
+ media::Decryptor::KeyError error_code,
+ int system_code);
+ void OnKeyMessage(const std::string& key_system,
+ const std::string& session_id,
+ const std::string& message,
+ const std::string& default_url);
+ void OnNeedKey(const std::string& key_system,
+ const std::string& type,
+ const std::string& session_id,
+ scoped_ptr<uint8[]> init_data,
+ int init_data_size);
+ void OnDecryptorReady(media::Decryptor*);
+
+ base::WeakPtrFactory<KeyHandlingChunkDemuxer> weak_this_;
+ media::ChunkDemuxer* chunk_demuxer_;
+ WebKit::WebMediaPlayerClient* client_;
+ scoped_refptr<media::MediaLog> media_log_;
+
+ // The decryptor that manages decryption keys and decrypts encrypted frames.
+ scoped_ptr<ProxyDecryptor> decryptor_;
+
+ // The currently selected key system. Empty string means that no key system
+ // has been selected.
+ WebKit::WebString current_key_system_;
+
+ // Temporary for EME v0.1. In the future the init data type should be passed
+ // through GenerateKeyRequest() directly from WebKit.
+ std::string init_data_type_;
+
+ NotifyDemuxerCB notify_demuxer_cb_;
+
+ scoped_ptr<WebKit::WebMediaSource> media_source_;
+};
+
+KeyHandlingChunkDemuxer::KeyHandlingChunkDemuxer(
+ WebKit::WebFrame* frame,
+ WebKit::WebMediaPlayerClient* client,
+ WebKit::WebMediaSource* media_source,
+ scoped_refptr<media::MediaLog> media_log,
+ NotifyDemuxerCB notify_demuxer_cb)
+ : KeyHandlingDemuxer(NULL),
+ weak_this_(this),
+ client_(client),
+ media_log_(media_log),
+ notify_demuxer_cb_(notify_demuxer_cb) {
+ chunk_demuxer_ = new media::ChunkDemuxer(
+ BIND_TO_RENDER_LOOP(&KeyHandlingChunkDemuxer::OnDemuxerOpened),
+ BIND_TO_RENDER_LOOP_2(&KeyHandlingChunkDemuxer::OnNeedKey, "", ""),
+ base::Bind(&LogMediaSourceError, media_log));
+ demuxer_.reset(chunk_demuxer_);
+ media_source_.reset(media_source);
+ if (WebKit::WebRuntimeFeatures::isEncryptedMediaEnabled()) {
+ decryptor_.reset(new ProxyDecryptor(
+ client,
+ frame,
+ BIND_TO_RENDER_LOOP(&KeyHandlingChunkDemuxer::OnKeyAdded),
+ BIND_TO_RENDER_LOOP(&KeyHandlingChunkDemuxer::OnKeyError),
+ BIND_TO_RENDER_LOOP(&KeyHandlingChunkDemuxer::OnKeyMessage),
+ BIND_TO_RENDER_LOOP(&KeyHandlingChunkDemuxer::OnNeedKey)));
+ decryptor_->SetDecryptorReadyCB(
+ BIND_TO_RENDER_LOOP(&KeyHandlingChunkDemuxer::OnDecryptorReady));
+ }
}
-WebMediaPlayer::MediaKeyException MediaSourceDelegate::GenerateKeyRequest(
+KeyHandlingChunkDemuxer::~KeyHandlingChunkDemuxer() {}
+
+WebMediaPlayer::MediaKeyException KeyHandlingChunkDemuxer::GenerateKeyRequest(
const WebString& key_system,
const unsigned char* init_data,
size_t init_data_length) {
@@ -155,7 +279,7 @@ WebMediaPlayer::MediaKeyException MediaSourceDelegate::GenerateKeyRequest(
return WebMediaPlayer::MediaKeyExceptionNoError;
}
-WebMediaPlayer::MediaKeyException MediaSourceDelegate::AddKey(
+WebMediaPlayer::MediaKeyException KeyHandlingChunkDemuxer::AddKey(
const WebString& key_system,
const unsigned char* key,
size_t key_length,
@@ -181,7 +305,7 @@ WebMediaPlayer::MediaKeyException MediaSourceDelegate::AddKey(
return WebMediaPlayer::MediaKeyExceptionNoError;
}
-WebMediaPlayer::MediaKeyException MediaSourceDelegate::CancelKeyRequest(
+WebMediaPlayer::MediaKeyException KeyHandlingChunkDemuxer::CancelKeyRequest(
const WebString& key_system,
const WebString& session_id) {
if (!IsSupportedKeySystem(key_system))
@@ -194,13 +318,175 @@ WebMediaPlayer::MediaKeyException MediaSourceDelegate::CancelKeyRequest(
return WebMediaPlayer::MediaKeyExceptionNoError;
}
+int KeyHandlingChunkDemuxer::GetDurationMs() {
+ double duration_ms = chunk_demuxer_->GetDuration() * 1000;
+ if (duration_ms > std::numeric_limits<int>::max())
Ami GONE FROM CHROMIUM 2013/05/01 22:01:37 this is still pretty fishy...
wonsik 2013/05/02 15:22:00 Logged warning.
+ duration_ms = std::numeric_limits<int>::max();
+ return duration_ms;
+}
+
+void KeyHandlingChunkDemuxer::Seek(base::TimeDelta time,
+ const PipelineStatusCB& status_cb) {
+ chunk_demuxer_->StartWaitingForSeek();
+ chunk_demuxer_->Seek(time, status_cb);
+}
+
+void KeyHandlingChunkDemuxer::OnKeyError(const std::string& key_system,
+ const std::string& session_id,
+ media::Decryptor::KeyError error_code,
+ int system_code) {
+ client_->keyError(
+ WebString::fromUTF8(key_system),
+ WebString::fromUTF8(session_id),
+ static_cast<WebKit::WebMediaPlayerClient::MediaKeyErrorCode>(error_code),
+ system_code);
+}
+
+void KeyHandlingChunkDemuxer::OnKeyMessage(const std::string& key_system,
+ const std::string& session_id,
+ const std::string& message,
+ const std::string& default_url) {
+ const GURL default_url_gurl(default_url);
+ DLOG_IF(WARNING, !default_url.empty() && !default_url_gurl.is_valid())
+ << "Invalid URL in default_url: " << default_url;
+
+ client_->keyMessage(WebString::fromUTF8(key_system),
+ WebString::fromUTF8(session_id),
+ reinterpret_cast<const uint8*>(message.data()),
+ message.size(),
+ default_url_gurl);
+}
+
+void KeyHandlingChunkDemuxer::OnKeyAdded(const std::string& key_system,
+ const std::string& session_id) {
+ notify_demuxer_cb_.Run(key_system);
+ client_->keyAdded(WebString::fromUTF8(key_system),
+ WebString::fromUTF8(session_id));
+}
+
+void KeyHandlingChunkDemuxer::OnNeedKey(const std::string& key_system,
+ const std::string& session_id,
+ const std::string& type,
+ scoped_ptr<uint8[]> init_data,
+ int init_data_size) {
+ // Do not fire NeedKey event if encrypted media is not enabled.
+ if (!decryptor_)
+ return;
+
+ CHECK(init_data_size >= 0);
+ DCHECK(init_data_type_.empty() || type.empty() || type == init_data_type_);
+ if (init_data_type_.empty())
+ init_data_type_ = type;
+
+ client_->keyNeeded(WebString::fromUTF8(key_system),
+ WebString::fromUTF8(session_id),
+ init_data.get(),
+ init_data_size);
+}
+
+void KeyHandlingChunkDemuxer::OnDecryptorReady(media::Decryptor* decryptor) {}
+
+void KeyHandlingChunkDemuxer::OnDemuxerOpened() {
+ media_source_->open(new WebMediaSourceClientImpl(
+ chunk_demuxer_, base::Bind(&LogMediaSourceError, media_log_)));
+}
+
+} // anonymous namespace
+
+// MediaSourceDelegate ---------------------------------------------------------
+
+MediaSourceDelegate::MediaSourceDelegate(
+ WebMediaPlayerProxyAndroid* proxy,
+ int player_id,
+ const UpdateNetworkStateCB& update_network_state_cb)
+ : weak_this_(this),
+ proxy_(proxy),
+ player_id_(player_id),
+ update_network_state_cb_(update_network_state_cb),
+ audio_params_(new MediaPlayerHostMsg_ReadFromDemuxerAck_Params),
+ video_params_(new MediaPlayerHostMsg_ReadFromDemuxerAck_Params),
+ seeking_(false),
+ low_latency_mode_(false) {
+}
+
+MediaSourceDelegate::~MediaSourceDelegate() {}
+
+void MediaSourceDelegate::InitializeMediaSource(
+ WebKit::WebFrame * frame,
+ WebKit::WebMediaPlayerClient * client,
+ WebKit::WebMediaSource* media_source,
+ media::MediaLog * media_log) {
+ DCHECK(media_source);
+ demuxer_.reset(new KeyHandlingChunkDemuxer(
+ frame,
+ client,
+ media_source,
+ scoped_refptr<media::MediaLog>(media_log),
+ BIND_TO_RENDER_LOOP(&MediaSourceDelegate::NotifyDemuxerReady)));
+ demuxer_->Initialize(this,
+ BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerInitDone));
+}
+
+void MediaSourceDelegate::InitializeMediaStream(media::Demuxer* demuxer) {
+ DCHECK(demuxer);
+ low_latency_mode_ = true;
+ demuxer_.reset(new KeyHandlingDemuxer(demuxer));
+ demuxer_->Initialize(this,
+ BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerInitDone));
+}
+
+const WebKit::WebTimeRanges& MediaSourceDelegate::Buffered() {
+ buffered_web_time_ranges_ =
+ ConvertToWebTimeRanges(buffered_time_ranges_);
+ return buffered_web_time_ranges_;
+}
+
+unsigned MediaSourceDelegate::DecodedFrameCount() const {
+ return statistics_.video_frames_decoded;
+}
+
+unsigned MediaSourceDelegate::DroppedFrameCount() const {
+ return statistics_.video_frames_dropped;
+}
+
+unsigned MediaSourceDelegate::AudioDecodedByteCount() const {
+ return statistics_.audio_bytes_decoded;;
+}
+
+unsigned MediaSourceDelegate::VideoDecodedByteCount() const {
+ return statistics_.video_bytes_decoded;
+}
+
+WebMediaPlayer::MediaKeyException MediaSourceDelegate::GenerateKeyRequest(
+ const WebString& key_system,
+ const unsigned char* init_data,
+ unsigned init_data_length) {
+ return demuxer_->GenerateKeyRequest(key_system, init_data, init_data_length);
+}
+
+WebMediaPlayer::MediaKeyException MediaSourceDelegate::AddKey(
+ const WebString& key_system,
+ const unsigned char* key,
+ unsigned key_length,
+ const unsigned char* init_data,
+ unsigned init_data_length,
+ const WebString& session_id) {
+ return demuxer_->AddKey(
+ key_system, key, key_length, init_data, init_data_length, session_id);
+}
+
+WebMediaPlayer::MediaKeyException MediaSourceDelegate::CancelKeyRequest(
+ const WebString& key_system,
+ const WebString& session_id) {
+ return demuxer_->CancelKeyRequest(key_system, session_id);
+}
+
void MediaSourceDelegate::Seek(base::TimeDelta time) {
seeking_ = true;
- DCHECK(chunk_demuxer_);
- if (!chunk_demuxer_)
+ DCHECK(demuxer_);
+ if (!demuxer_)
return;
- chunk_demuxer_->StartWaitingForSeek();
- chunk_demuxer_->Seek(time,
+ demuxer_->Seek(time,
BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerError));
}
@@ -228,11 +514,16 @@ void MediaSourceDelegate::OnReadFromDemuxer(media::DemuxerStream::Type type,
seeking_ = false;
DCHECK(type == DemuxerStream::AUDIO || type == DemuxerStream::VIDEO);
+
+ // When in low latency mode, don't wait to accumulate multiple packets per IPC
+ // communication.
+ size_t access_unit_size = low_latency_mode_ ? 1 : kAccessUnitSize;
+
MediaPlayerHostMsg_ReadFromDemuxerAck_Params* params =
type == DemuxerStream::AUDIO ? audio_params_.get() : video_params_.get();
params->type = type;
- params->access_units.resize(kAccessUnitSize);
- DemuxerStream* stream = chunk_demuxer_->GetStream(type);
+ params->access_units.resize(access_unit_size);
+ DemuxerStream* stream = demuxer_->GetStream(type);
DCHECK(stream != NULL);
ReadFromDemuxerStream(stream, params, 0);
}
@@ -350,7 +641,7 @@ void MediaSourceDelegate::OnDemuxerInitDone(
void MediaSourceDelegate::NotifyDemuxerReady(
const std::string& key_system) {
MediaPlayerHostMsg_DemuxerReady_Params params;
- DemuxerStream* audio_stream = chunk_demuxer_->GetStream(DemuxerStream::AUDIO);
+ DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
if (audio_stream) {
const media::AudioDecoderConfig& config =
audio_stream->audio_decoder_config();
@@ -360,7 +651,7 @@ void MediaSourceDelegate::NotifyDemuxerReady(
params.audio_sampling_rate = config.samples_per_second();
params.is_audio_encrypted = config.is_encrypted();
}
- DemuxerStream* video_stream = chunk_demuxer_->GetStream(DemuxerStream::VIDEO);
+ DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
if (video_stream) {
const media::VideoDecoderConfig& config =
video_stream->video_decoder_config();
@@ -368,11 +659,7 @@ void MediaSourceDelegate::NotifyDemuxerReady(
params.video_size = config.natural_size();
params.is_video_encrypted = config.is_encrypted();
}
- double duration_ms = chunk_demuxer_->GetDuration() * 1000;
- DCHECK(duration_ms >= 0);
- if (duration_ms > std::numeric_limits<int>::max())
- duration_ms = std::numeric_limits<int>::max();
- params.duration_ms = duration_ms;
+ params.duration_ms = demuxer_->GetDurationMs();
params.key_system = key_system;
bool ready_to_send = (!params.is_audio_encrypted &&
@@ -381,64 +668,4 @@ void MediaSourceDelegate::NotifyDemuxerReady(
proxy_->DemuxerReady(player_id_, params);
}
-void MediaSourceDelegate::OnDemuxerOpened() {
- media_source_->open(new WebMediaSourceClientImpl(
- chunk_demuxer_.get(), base::Bind(&LogMediaSourceError, media_log_)));
-}
-
-void MediaSourceDelegate::OnKeyError(const std::string& key_system,
- const std::string& session_id,
- media::Decryptor::KeyError error_code,
- int system_code) {
- client_->keyError(
- WebString::fromUTF8(key_system),
- WebString::fromUTF8(session_id),
- static_cast<WebKit::WebMediaPlayerClient::MediaKeyErrorCode>(error_code),
- system_code);
-}
-
-void MediaSourceDelegate::OnKeyMessage(const std::string& key_system,
- const std::string& session_id,
- const std::string& message,
- const std::string& default_url) {
- const GURL default_url_gurl(default_url);
- DLOG_IF(WARNING, !default_url.empty() && !default_url_gurl.is_valid())
- << "Invalid URL in default_url: " << default_url;
-
- client_->keyMessage(WebString::fromUTF8(key_system),
- WebString::fromUTF8(session_id),
- reinterpret_cast<const uint8*>(message.data()),
- message.size(),
- default_url_gurl);
-}
-
-void MediaSourceDelegate::OnKeyAdded(const std::string& key_system,
- const std::string& session_id) {
- NotifyDemuxerReady(key_system);
- client_->keyAdded(WebString::fromUTF8(key_system),
- WebString::fromUTF8(session_id));
-}
-
-void MediaSourceDelegate::OnNeedKey(const std::string& key_system,
- const std::string& session_id,
- const std::string& type,
- scoped_ptr<uint8[]> init_data,
- int init_data_size) {
- // Do not fire NeedKey event if encrypted media is not enabled.
- if (!decryptor_)
- return;
-
- CHECK(init_data_size >= 0);
- DCHECK(init_data_type_.empty() || type.empty() || type == init_data_type_);
- if (init_data_type_.empty())
- init_data_type_ = type;
-
- client_->keyNeeded(WebString::fromUTF8(key_system),
- WebString::fromUTF8(session_id),
- init_data.get(),
- init_data_size);
-}
-
-void MediaSourceDelegate::OnDecryptorReady(media::Decryptor* decryptor) {}
-
} // namespace webkit_media

Powered by Google App Engine
This is Rietveld 408576698