Index: media/mojo/services/mojo_demuxer_stream_adapter.cc |
diff --git a/media/mojo/services/mojo_demuxer_stream_adapter.cc b/media/mojo/services/mojo_demuxer_stream_adapter.cc |
index 5b60177afebe8420990edcfba4ca7d53ac75b7e0..c1d20246629a0007556725289f00677af32dc5ac 100644 |
--- a/media/mojo/services/mojo_demuxer_stream_adapter.cc |
+++ b/media/mojo/services/mojo_demuxer_stream_adapter.cc |
@@ -16,6 +16,7 @@ MojoDemuxerStreamAdapter::MojoDemuxerStreamAdapter( |
const base::Closure& stream_ready_cb) |
: demuxer_stream_(demuxer_stream.Pass()), |
stream_ready_cb_(stream_ready_cb), |
+ type_(DemuxerStream::UNKNOWN), |
weak_factory_(this) { |
DVLOG(1) << __FUNCTION__; |
demuxer_stream_.set_client(this); |
@@ -35,21 +36,23 @@ void MojoDemuxerStreamAdapter::Read(const DemuxerStream::ReadCB& read_cb) { |
} |
AudioDecoderConfig MojoDemuxerStreamAdapter::audio_decoder_config() { |
- DCHECK(!config_queue_.empty()); |
- return config_queue_.front(); |
+ DCHECK_EQ(type_, DemuxerStream::AUDIO); |
+ DCHECK(!audio_config_queue_.empty()); |
+ return audio_config_queue_.front(); |
} |
VideoDecoderConfig MojoDemuxerStreamAdapter::video_decoder_config() { |
- NOTREACHED(); |
- return VideoDecoderConfig(); |
+ DCHECK_EQ(type_, DemuxerStream::VIDEO); |
+ DCHECK(!video_config_queue_.empty()); |
+ return video_config_queue_.front(); |
} |
-media::DemuxerStream::Type MojoDemuxerStreamAdapter::type() { |
- return media::DemuxerStream::AUDIO; |
+DemuxerStream::Type MojoDemuxerStreamAdapter::type() { |
+ return type_; |
} |
void MojoDemuxerStreamAdapter::EnableBitstreamConverter() { |
- NOTREACHED(); |
+ NOTIMPLEMENTED(); |
} |
bool MojoDemuxerStreamAdapter::SupportsConfigChanges() { |
@@ -66,16 +69,34 @@ void MojoDemuxerStreamAdapter::OnStreamReady( |
DVLOG(1) << __FUNCTION__; |
// TODO(tim): We don't support pipe streaming yet. |
DCHECK(!pipe.is_valid()); |
- DCHECK(!config_queue_.empty()); |
+ DCHECK_NE(type_, DemuxerStream::UNKNOWN); |
stream_ready_cb_.Run(); |
} |
void MojoDemuxerStreamAdapter::OnAudioDecoderConfigChanged( |
mojo::AudioDecoderConfigPtr config) { |
- config_queue_.push(config.To<media::AudioDecoderConfig>()); |
+ DCHECK(type_ == DemuxerStream::UNKNOWN || type_ == DemuxerStream::AUDIO) |
+ << type_; |
+ type_ = DemuxerStream::AUDIO; |
+ |
+ audio_config_queue_.push(config.To<AudioDecoderConfig>()); |
+ |
+ if (!read_cb_.is_null()) { |
+ read_cb_.Run(DemuxerStream::Status::kConfigChanged, NULL); |
+ read_cb_.Reset(); |
+ } |
+} |
+ |
+void MojoDemuxerStreamAdapter::OnVideoDecoderConfigChanged( |
+ mojo::VideoDecoderConfigPtr config) { |
+ DCHECK(type_ == DemuxerStream::UNKNOWN || type_ == DemuxerStream::VIDEO) |
+ << type_; |
+ type_ = DemuxerStream::VIDEO; |
+ |
+ video_config_queue_.push(config.To<VideoDecoderConfig>()); |
if (!read_cb_.is_null()) { |
- read_cb_.Run(media::DemuxerStream::Status::kConfigChanged, NULL); |
+ read_cb_.Run(DemuxerStream::Status::kConfigChanged, NULL); |
read_cb_.Reset(); |
} |
} |
@@ -85,22 +106,30 @@ void MojoDemuxerStreamAdapter::OnBufferReady( |
mojo::MediaDecoderBufferPtr buffer) { |
DVLOG(3) << __FUNCTION__; |
DCHECK(!read_cb_.is_null()); |
- DCHECK(!config_queue_.empty()); |
+ DCHECK_NE(type_, DemuxerStream::UNKNOWN); |
- media::DemuxerStream::Status media_status( |
- static_cast<media::DemuxerStream::Status>(status)); |
- scoped_refptr<media::DecoderBuffer> media_buffer( |
- buffer.To<scoped_refptr<media::DecoderBuffer> >()); |
+ DemuxerStream::Status media_status( |
+ static_cast<DemuxerStream::Status>(status)); |
+ scoped_refptr<DecoderBuffer> media_buffer( |
+ buffer.To<scoped_refptr<DecoderBuffer>>()); |
if (status == mojo::DemuxerStream::STATUS_CONFIG_CHANGED) { |
DCHECK(!media_buffer.get()); |
- config_queue_.pop(); |
- // If the |config_queue_| is empty we need to wait for |
- // OnAudioDecoderConfigChanged before invoking |read_cb|. |
- if (config_queue_.empty()) |
- return; |
+ // If the configuration queue is empty we need to wait for a config change |
+ // event before invoking |read_cb_|. |
+ |
+ if (type_ == DemuxerStream::AUDIO) { |
+ audio_config_queue_.pop(); |
+ if (audio_config_queue_.empty()) |
+ return; |
+ } else if (type_ == DemuxerStream::VIDEO) { |
+ video_config_queue_.pop(); |
+ if (video_config_queue_.empty()) |
+ return; |
+ } |
} |
+ |
read_cb_.Run(media_status, media_buffer); |
read_cb_.Reset(); |
} |