Index: media/base/pipeline_impl.cc |
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc |
index f5732214362203da0e45410dd7c6ffdbab0c1abf..68da137ffb5c699206386e7be72f60e99b412bdf 100644 |
--- a/media/base/pipeline_impl.cc |
+++ b/media/base/pipeline_impl.cc |
@@ -28,6 +28,7 @@ |
#include "media/base/text_track_config.h" |
#include "media/base/timestamp_constants.h" |
#include "media/base/video_decoder_config.h" |
+#include "media/media_features.h" |
static const double kDefaultPlaybackRate = 0.0; |
static const float kDefaultVolume = 1.0f; |
@@ -113,6 +114,7 @@ class PipelineImpl::RendererWrapper : public DemuxerHost, |
void OnWaitingForDecryptionKey() final; |
void OnVideoNaturalSizeChange(const gfx::Size& size) final; |
void OnVideoOpacityChange(bool opaque) final; |
+ void OnDurationChange(base::TimeDelta duration) final; |
// TextRenderer tasks and notifications. |
void OnTextRendererEnded(); |
@@ -604,6 +606,16 @@ void PipelineImpl::RendererWrapper::OnVideoOpacityChange(bool opaque) { |
base::Bind(&PipelineImpl::OnVideoOpacityChange, weak_pipeline_, opaque)); |
} |
+void PipelineImpl::RendererWrapper::OnDurationChange(base::TimeDelta duration) { |
+#if BUILDFLAG(FORCE_MOJO_MEDIA_PLAYER_RENDERER) |
+ SetDuration(duration); |
+#else |
+ // Duration changes should be surfaced by the DemuxerStream, via the |
+ // DemuxerHost interface. |
+ NOTREACHED(); |
+#endif |
+} |
+ |
void PipelineImpl::RendererWrapper::OnTextRendererEnded() { |
DCHECK(media_task_runner_->BelongsToCurrentThread()); |
media_log_->AddEvent(media_log_->CreateEvent(MediaLogEvent::TEXT_ENDED)); |
@@ -879,10 +891,22 @@ void PipelineImpl::RendererWrapper::InitializeRenderer( |
const PipelineStatusCB& done_cb) { |
DCHECK(media_task_runner_->BelongsToCurrentThread()); |
- if (!demuxer_->GetStream(DemuxerStream::AUDIO) && |
- !demuxer_->GetStream(DemuxerStream::VIDEO)) { |
- done_cb.Run(PIPELINE_ERROR_COULD_NOT_RENDER); |
- return; |
+ switch (demuxer_->GetType()) { |
+ case DemuxerStreamProvider::Type::STREAM: |
+ if (!demuxer_->GetStream(DemuxerStream::AUDIO) && |
+ !demuxer_->GetStream(DemuxerStream::VIDEO)) { |
+ done_cb.Run(PIPELINE_ERROR_COULD_NOT_RENDER); |
+ return; |
+ } |
+ break; |
+ |
+ case DemuxerStreamProvider::Type::URL: |
+ // N.B: Empty GURL are not valid. |
+ if (!demuxer_->GetUrl().is_valid()) { |
+ done_cb.Run(PIPELINE_ERROR_COULD_NOT_RENDER); |
+ return; |
+ } |
+ break; |
} |
if (cdm_context_) |
@@ -908,15 +932,28 @@ void PipelineImpl::RendererWrapper::ReportMetadata() { |
DCHECK(media_task_runner_->BelongsToCurrentThread()); |
PipelineMetadata metadata; |
- metadata.timeline_offset = demuxer_->GetTimelineOffset(); |
- DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
- if (stream) { |
- metadata.has_video = true; |
- metadata.natural_size = stream->video_decoder_config().natural_size(); |
- metadata.video_rotation = stream->video_rotation(); |
- } |
- if (demuxer_->GetStream(DemuxerStream::AUDIO)) { |
- metadata.has_audio = true; |
+ DemuxerStream* stream; |
+ |
+ switch (demuxer_->GetType()) { |
+ case DemuxerStreamProvider::Type::STREAM: |
+ metadata.timeline_offset = demuxer_->GetTimelineOffset(); |
+ stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
+ if (stream) { |
+ metadata.has_video = true; |
+ metadata.natural_size = stream->video_decoder_config().natural_size(); |
+ metadata.video_rotation = stream->video_rotation(); |
+ } |
+ if (demuxer_->GetStream(DemuxerStream::AUDIO)) { |
+ metadata.has_audio = true; |
+ } |
+ break; |
+ |
+ case DemuxerStreamProvider::Type::URL: |
+ // We don't know if the MediaPlayerRender has Audio/Video until we start |
+ // playing. Conservatively assume that they do. |
+ metadata.has_video = true; |
+ metadata.has_audio = true; |
+ break; |
} |
main_task_runner_->PostTask(FROM_HERE, base::Bind(&PipelineImpl::OnMetadata, |