Chromium Code Reviews| 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 38c5bb8903ee70efaa05a5bf8ead2b05970885c2..83771a0bb9177e664bdd9212c616897f5c005740 100644 |
| --- a/webkit/media/android/media_source_delegate.cc |
| +++ b/webkit/media/android/media_source_delegate.cc |
| @@ -21,17 +21,19 @@ |
| #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; |
| namespace { |
| -// The size of the access unit to transfer in an IPC. |
| +// The size of the access unit to transfer in an IPC in case of MediaSource. |
| // 16: approximately 250ms of content in 60 fps movies. |
| -const size_t kAccessUnitSize = 16; |
| +const size_t kAccessUnitSizeForMediaSource = 16; |
| } // namespace |
| @@ -59,76 +61,168 @@ static void LogMediaSourceError(const scoped_refptr<media::MediaLog>& media_log, |
| media_log->AddEvent(media_log->CreateMediaSourceErrorEvent(error)); |
| } |
| -MediaSourceDelegate::MediaSourceDelegate( |
| +// KeyHandlingDemuxer ---------------------------------------------------------- |
| + |
| +class KeyHandlingDemuxer : public media::Demuxer { |
| + public: |
| + typedef base::Callback<void(const std::string& key_system)> NotifyDemuxerCB; |
| + |
| + KeyHandlingDemuxer(); |
| + virtual ~KeyHandlingDemuxer(); |
| + |
| + void InitializeDemuxer(media::Demuxer* demuxer); |
| + void InitializeChunkDemuxer(WebKit::WebFrame* frame, |
| + WebKit::WebMediaPlayerClient* client, |
| + WebKit::WebMediaSource* media_source, |
| + scoped_refptr<media::MediaLog> media_log, |
| + const NotifyDemuxerCB& notify_demuxer_cb); |
| + WebKit::WebMediaPlayer::MediaKeyException GenerateKeyRequest( |
| + const WebKit::WebString& key_system, |
| + const unsigned char* init_data, |
| + unsigned init_data_length); |
| + 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); |
| + WebKit::WebMediaPlayer::MediaKeyException CancelKeyRequest( |
| + const WebKit::WebString& key_system, |
| + const WebKit::WebString& session_id); |
| + int GetDurationMs(); |
| + media::Demuxer* demuxer() { return demuxer_; } |
| + |
| + // media::Demuxer implementation |
| + virtual void Initialize(DemuxerHost* host, const PipelineStatusCB& status_cb) |
| + OVERRIDE; |
|
acolwell GONE FROM CHROMIUM
2013/05/14 18:17:47
nit: I think the OVERRIDE is typically on the same
wonsik
2013/05/20 14:02:24
Done.
|
| + virtual void SetPlaybackRate(float playback_rate) OVERRIDE; |
| + virtual void Seek(base::TimeDelta time, const PipelineStatusCB& status_cb) |
| + OVERRIDE; |
|
acolwell GONE FROM CHROMIUM
2013/05/14 18:17:47
ditto
wonsik
2013/05/20 14:02:24
Done.
|
| + 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; |
| + |
| + 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*); |
| + |
| + media::Demuxer* demuxer_; |
| + |
| + base::WeakPtrFactory<KeyHandlingDemuxer> weak_this_; |
| + scoped_ptr<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_; |
| +}; |
| + |
| +KeyHandlingDemuxer::KeyHandlingDemuxer() |
| + : demuxer_(NULL), weak_this_(this), client_(NULL) {} |
| + |
| +KeyHandlingDemuxer::~KeyHandlingDemuxer() {} |
| + |
| +void KeyHandlingDemuxer::InitializeDemuxer(media::Demuxer* demuxer) { |
| + DCHECK(!demuxer_); |
| + demuxer_ = demuxer; |
| +} |
| + |
| +void KeyHandlingDemuxer::InitializeChunkDemuxer( |
| 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) { |
| + WebKit::WebMediaSource* media_source, |
| + scoped_refptr<media::MediaLog> media_log, |
| + const NotifyDemuxerCB& notify_demuxer_cb) { |
| + DCHECK(!demuxer_); |
| + client_ = client; |
| + media_log_ = media_log; |
| + notify_demuxer_cb_ = notify_demuxer_cb; |
| + chunk_demuxer_.reset(new media::ChunkDemuxer( |
| + BIND_TO_RENDER_LOOP(&KeyHandlingDemuxer::OnDemuxerOpened), |
| + BIND_TO_RENDER_LOOP_2(&KeyHandlingDemuxer::OnNeedKey, "", ""), |
| + base::Bind(&LogMediaSourceError, media_log))); |
| + demuxer_ = chunk_demuxer_.get(); |
| + media_source_.reset(media_source); |
| 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))); |
| + BIND_TO_RENDER_LOOP(&KeyHandlingDemuxer::OnKeyAdded), |
| + BIND_TO_RENDER_LOOP(&KeyHandlingDemuxer::OnKeyError), |
| + BIND_TO_RENDER_LOOP(&KeyHandlingDemuxer::OnKeyMessage), |
| + BIND_TO_RENDER_LOOP(&KeyHandlingDemuxer::OnNeedKey))); |
| decryptor_->SetDecryptorReadyCB( |
| - BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDecryptorReady)); |
| + BIND_TO_RENDER_LOOP(&KeyHandlingDemuxer::OnDecryptorReady)); |
| } |
| } |
| -MediaSourceDelegate::~MediaSourceDelegate() {} |
| - |
| -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; |
| +void KeyHandlingDemuxer::Initialize(DemuxerHost* host, |
| + const PipelineStatusCB& status_cb) { |
| + demuxer_->Initialize(host, status_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::SetPlaybackRate(float playback_rate) { |
| + demuxer_->SetPlaybackRate(playback_rate); |
| } |
| -const WebKit::WebTimeRanges& MediaSourceDelegate::Buffered() { |
| - buffered_web_time_ranges_ = |
| - ConvertToWebTimeRanges(buffered_time_ranges_); |
| - return buffered_web_time_ranges_; |
| +void KeyHandlingDemuxer::Seek(base::TimeDelta time, |
| + const PipelineStatusCB& status_cb) { |
| + if (!chunk_demuxer_) |
| + chunk_demuxer_->StartWaitingForSeek(); |
| + demuxer_->Seek(time, status_cb); |
| } |
| -size_t MediaSourceDelegate::DecodedFrameCount() const { |
| - return statistics_.video_frames_decoded; |
| +void KeyHandlingDemuxer::Stop(const base::Closure& callback) { |
| + demuxer_->Stop(callback); |
| } |
| -size_t MediaSourceDelegate::DroppedFrameCount() const { |
| - return statistics_.video_frames_dropped; |
| +void KeyHandlingDemuxer::OnAudioRendererDisabled() { |
| + demuxer_->OnAudioRendererDisabled(); |
| } |
| -size_t MediaSourceDelegate::AudioDecodedByteCount() const { |
| - return statistics_.audio_bytes_decoded; |
| +DemuxerStream* KeyHandlingDemuxer::GetStream(DemuxerStream::Type type) { |
| + return demuxer_->GetStream(type); |
| } |
| -size_t MediaSourceDelegate::VideoDecodedByteCount() const { |
| - return statistics_.video_bytes_decoded; |
| +base::TimeDelta KeyHandlingDemuxer::GetStartTime() const { |
| + return demuxer_->GetStartTime(); |
| } |
| -WebMediaPlayer::MediaKeyException MediaSourceDelegate::GenerateKeyRequest( |
| +WebMediaPlayer::MediaKeyException KeyHandlingDemuxer::GenerateKeyRequest( |
| const WebString& key_system, |
| const unsigned char* init_data, |
| size_t init_data_length) { |
| + if (!decryptor_) |
| + return WebKit::WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
| if (!IsSupportedKeySystem(key_system)) |
| return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
| @@ -155,13 +249,15 @@ WebMediaPlayer::MediaKeyException MediaSourceDelegate::GenerateKeyRequest( |
| return WebMediaPlayer::MediaKeyExceptionNoError; |
| } |
| -WebMediaPlayer::MediaKeyException MediaSourceDelegate::AddKey( |
| +WebMediaPlayer::MediaKeyException KeyHandlingDemuxer::AddKey( |
| const WebString& key_system, |
| const unsigned char* key, |
| size_t key_length, |
| const unsigned char* init_data, |
| size_t init_data_length, |
| const WebString& session_id) { |
| + if (!decryptor_) |
| + return WebKit::WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
| DCHECK(key); |
| DCHECK_EQ(key_length, 16u); |
| @@ -181,9 +277,11 @@ WebMediaPlayer::MediaKeyException MediaSourceDelegate::AddKey( |
| return WebMediaPlayer::MediaKeyExceptionNoError; |
| } |
| -WebMediaPlayer::MediaKeyException MediaSourceDelegate::CancelKeyRequest( |
| +WebMediaPlayer::MediaKeyException KeyHandlingDemuxer::CancelKeyRequest( |
| const WebString& key_system, |
| const WebString& session_id) { |
| + if (!decryptor_) |
| + return WebKit::WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
| if (!IsSupportedKeySystem(key_system)) |
| return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
| @@ -194,14 +292,186 @@ WebMediaPlayer::MediaKeyException MediaSourceDelegate::CancelKeyRequest( |
| return WebMediaPlayer::MediaKeyExceptionNoError; |
| } |
| +int KeyHandlingDemuxer::GetDurationMs() { |
| + if (!chunk_demuxer_) |
| + return -1; |
| + |
| + double duration_ms = chunk_demuxer_->GetDuration() * 1000; |
| + if (duration_ms > std::numeric_limits<int>::max()) { |
| + LOG(WARNING) << "Duration from ChunkDemuxer is too large; probably " |
| + "something have gone wrong."; |
| + return std::numeric_limits<int>::max(); |
| + } |
| + return duration_ms; |
| +} |
| + |
| +void KeyHandlingDemuxer::OnKeyError(const std::string& key_system, |
| + const std::string& session_id, |
| + media::Decryptor::KeyError error_code, |
| + int system_code) { |
| + if (!client_) |
| + return; |
| + client_->keyError( |
| + WebString::fromUTF8(key_system), |
| + WebString::fromUTF8(session_id), |
| + static_cast<WebKit::WebMediaPlayerClient::MediaKeyErrorCode>(error_code), |
| + system_code); |
| +} |
| + |
| +void KeyHandlingDemuxer::OnKeyMessage(const std::string& key_system, |
| + const std::string& session_id, |
| + const std::string& message, |
| + const std::string& default_url) { |
| + if (!client_) |
| + return; |
| + 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 KeyHandlingDemuxer::OnKeyAdded(const std::string& key_system, |
| + const std::string& session_id) { |
| + if (!client_ || notify_demuxer_cb_.is_null()) |
| + return; |
| + notify_demuxer_cb_.Run(key_system); |
| + client_->keyAdded(WebString::fromUTF8(key_system), |
| + WebString::fromUTF8(session_id)); |
| +} |
| + |
| +void KeyHandlingDemuxer::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 KeyHandlingDemuxer::OnDecryptorReady(media::Decryptor*) {} |
| + |
| +void KeyHandlingDemuxer::OnDemuxerOpened() { |
| + DCHECK(media_source_); |
| + media_source_->open(new WebMediaSourceClientImpl( |
| + chunk_demuxer_.get(), base::Bind(&LogMediaSourceError, media_log_))); |
| +} |
| + |
| +// 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), |
| + demuxer_(new KeyHandlingDemuxer), |
| + audio_params_(new MediaPlayerHostMsg_ReadFromDemuxerAck_Params), |
| + video_params_(new MediaPlayerHostMsg_ReadFromDemuxerAck_Params), |
| + seeking_(false), |
| + access_unit_size_(0) {} |
| + |
| +MediaSourceDelegate::~MediaSourceDelegate() { |
| + if (!destroy_demuxer_cb_.is_null()) |
| + destroy_demuxer_cb_.Run(demuxer_->demuxer()); |
| +} |
| + |
| +void MediaSourceDelegate::InitializeMediaSource( |
| + WebKit::WebFrame* frame, |
| + WebKit::WebMediaPlayerClient* client, |
| + WebKit::WebMediaSource* media_source, |
| + media::MediaLog* media_log) { |
| + DCHECK(media_source); |
| + demuxer_->InitializeChunkDemuxer( |
| + 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)); |
| + access_unit_size_ = kAccessUnitSizeForMediaSource; |
| +} |
| + |
| +void MediaSourceDelegate::InitializeMediaStream(media::Demuxer* demuxer) { |
| + DCHECK(demuxer); |
| + demuxer_->InitializeDemuxer(demuxer); |
| + demuxer_->Initialize( |
| + this, BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerInitDone)); |
| + // When playing Media Stream, don't wait to accumulate multiple packets per |
| + // IPC communication. |
| + access_unit_size_ = 1; |
| +} |
| + |
| +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, |
| - BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerError)); |
| + demuxer_->Seek(time, |
| + BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerError)); |
| } |
| void MediaSourceDelegate::SetTotalBytes(int64 total_bytes) { |
| @@ -228,11 +498,14 @@ void MediaSourceDelegate::OnReadFromDemuxer(media::DemuxerStream::Type type, |
| seeking_ = false; |
| DCHECK(type == DemuxerStream::AUDIO || type == DemuxerStream::VIDEO); |
| + // The access unit size should have been initialized properly at this stage. |
| + DCHECK(access_unit_size_ > 0); |
| + |
| 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 +623,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(); |
| @@ -362,7 +635,7 @@ void MediaSourceDelegate::NotifyDemuxerReady( |
| params.audio_extra_data = std::vector<uint8>( |
| config.extra_data(), config.extra_data() + config.extra_data_size()); |
| } |
| - 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(); |
| @@ -372,11 +645,7 @@ void MediaSourceDelegate::NotifyDemuxerReady( |
| params.video_extra_data = std::vector<uint8>( |
| config.extra_data(), config.extra_data() + config.extra_data_size()); |
| } |
| - 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 && |
| @@ -385,64 +654,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 |