Index: webkit/renderer/media/android/media_source_delegate.cc |
diff --git a/webkit/renderer/media/android/media_source_delegate.cc b/webkit/renderer/media/android/media_source_delegate.cc |
index 707752158cbd9b39c7261778b00a849e5e1f8dad..6bf718333a6e6485dc9674f194a83109c121f3d6 100644 |
--- a/webkit/renderer/media/android/media_source_delegate.cc |
+++ b/webkit/renderer/media/android/media_source_delegate.cc |
@@ -27,9 +27,9 @@ 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; |
const uint8 kVorbisPadding[] = { 0xff, 0xff, 0xff, 0xff }; |
@@ -66,19 +66,22 @@ MediaSourceDelegate::MediaSourceDelegate(WebMediaPlayerProxyAndroid* proxy, |
proxy_(proxy), |
player_id_(player_id), |
media_log_(media_log), |
+ demuxer_(NULL), |
audio_params_(new MediaPlayerHostMsg_ReadFromDemuxerAck_Params), |
video_params_(new MediaPlayerHostMsg_ReadFromDemuxerAck_Params), |
- seeking_(false) { |
+ seeking_(false), |
+ access_unit_size_(0) { |
} |
MediaSourceDelegate::~MediaSourceDelegate() { |
DVLOG(1) << "MediaSourceDelegate::~MediaSourceDelegate() : " << player_id_; |
DCHECK(!chunk_demuxer_); |
+ DCHECK(!demuxer_); |
} |
void MediaSourceDelegate::Destroy() { |
DVLOG(1) << "MediaSourceDelegate::Destroy() : " << player_id_; |
- if (!chunk_demuxer_) { |
+ if (!demuxer_) { |
delete this; |
return; |
} |
@@ -87,11 +90,13 @@ void MediaSourceDelegate::Destroy() { |
media_source_.reset(); |
proxy_ = NULL; |
- chunk_demuxer_->Stop( |
- BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerStopDone)); |
+ demuxer_ = NULL; |
+ if (chunk_demuxer_) |
+ chunk_demuxer_->Stop( |
+ BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerStopDone)); |
} |
-void MediaSourceDelegate::Initialize( |
+void MediaSourceDelegate::InitializeMediaSource( |
WebKit::WebMediaSource* media_source, |
const media::NeedKeyCB& need_key_cb, |
const UpdateNetworkStateCB& update_network_state_cb) { |
@@ -108,8 +113,26 @@ void MediaSourceDelegate::Initialize( |
base::Bind(&LogMediaSourceError, media_log_))); |
chunk_demuxer_->Initialize(this, |
BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerInitDone)); |
+ demuxer_ = chunk_demuxer_.get(); |
+ access_unit_size_ = kAccessUnitSizeForMediaSource; |
} |
+#if defined(GOOGLE_TV) |
+void MediaSourceDelegate::InitializeMediaStream( |
+ media::Demuxer* demuxer, |
+ const UpdateNetworkStateCB& update_network_state_cb) { |
+ DCHECK(demuxer); |
+ demuxer_ = demuxer; |
+ update_network_state_cb_ = update_network_state_cb; |
+ |
+ 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; |
+} |
+#endif |
+ |
const WebKit::WebTimeRanges& MediaSourceDelegate::Buffered() { |
buffered_web_time_ranges_ = |
ConvertToWebTimeRanges(buffered_time_ranges_); |
@@ -136,11 +159,10 @@ void MediaSourceDelegate::Seek(base::TimeDelta time) { |
DVLOG(1) << "MediaSourceDelegate::Seek(" << time.InSecondsF() << ") : " |
<< player_id_; |
seeking_ = true; |
- DCHECK(chunk_demuxer_); |
- if (!chunk_demuxer_) |
- return; |
- chunk_demuxer_->StartWaitingForSeek(); |
- chunk_demuxer_->Seek(time, |
+ DCHECK(demuxer_); |
+ if (chunk_demuxer_) |
+ chunk_demuxer_->StartWaitingForSeek(); |
+ demuxer_->Seek(time, |
BIND_TO_RENDER_LOOP(&MediaSourceDelegate::OnDemuxerError)); |
} |
@@ -175,11 +197,13 @@ 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_GT(access_unit_size_, 0u); |
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); |
} |
@@ -311,7 +335,7 @@ void MediaSourceDelegate::OnDemuxerStopDone() { |
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(); |
@@ -323,7 +347,7 @@ void MediaSourceDelegate::NotifyDemuxerReady(const std::string& key_system) { |
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(); |
@@ -333,11 +357,7 @@ void MediaSourceDelegate::NotifyDemuxerReady(const std::string& key_system) { |
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 = GetDurationMs(); |
params.key_system = key_system; |
bool ready_to_send = (!params.is_audio_encrypted && |
@@ -346,6 +366,19 @@ void MediaSourceDelegate::NotifyDemuxerReady(const std::string& key_system) { |
proxy_->DemuxerReady(player_id_, params); |
} |
+int MediaSourceDelegate::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 has gone wrong."; |
+ return std::numeric_limits<int>::max(); |
+ } |
+ return duration_ms; |
+} |
+ |
void MediaSourceDelegate::OnDemuxerOpened() { |
if (!media_source_) |
return; |