diff --git a/chromecast/media/cma/pipeline/media_pipeline_impl.cc b/chromecast/media/cma/pipeline/media_pipeline_impl.cc index 39a48df96ebaf..2ee72c1704e78 100644 --- a/chromecast/media/cma/pipeline/media_pipeline_impl.cc +++ b/chromecast/media/cma/pipeline/media_pipeline_impl.cc @@ -270,11 +270,16 @@ void MediaPipelineImpl::StartPlayingFrom(base::TimeDelta time) { void MediaPipelineImpl::Flush(base::OnceClosure flush_cb) { LOG(INFO) << __FUNCTION__; DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK((backend_state_ == BACKEND_STATE_PLAYING) || - (backend_state_ == BACKEND_STATE_PAUSED)); DCHECK(audio_pipeline_ || video_pipeline_); DCHECK(!pending_flush_task_); + if (backend_state_ != BACKEND_STATE_PLAYING && + backend_state_ != BACKEND_STATE_PAUSED) { + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, std::move(flush_cb)); + return; + } + media_time_interpolator_.StopInterpolating(); if (buffering_controller_) { diff --git a/chromecast/media/cma/pipeline/media_pipeline_impl_unittest.cc b/chromecast/media/cma/pipeline/media_pipeline_impl_unittest.cc index 88acfe8692b81..c2ae97af84d04 100644 --- a/chromecast/media/cma/pipeline/media_pipeline_impl_unittest.cc +++ b/chromecast/media/cma/pipeline/media_pipeline_impl_unittest.cc @@ -60,6 +60,36 @@ TEST(MediaPipelineImplTest, DoesNotCrashOnFlushWhenBufferingIsDisabled) { media_pipeline.Flush(base::DoNothing()); } +TEST(MediaPipelineImplTest, FlushBeforeStartStillInitializesBackend) { + base::test::TaskEnvironment task_environment; + + MediaPipelineImpl media_pipeline; + MockCmaBackend::VideoDecoder video_decoder; + auto backend = std::make_unique(); + auto frame_provider = std::make_unique(); + + ON_CALL(video_decoder, SetConfig).WillByDefault(Return(true)); + EXPECT_CALL(*backend, CreateVideoDecoder).WillOnce(Return(&video_decoder)); + EXPECT_CALL(*backend, Stop).Times(0); + EXPECT_CALL(*backend, Initialize).WillOnce(Return(true)); + EXPECT_CALL(*backend, Start).WillOnce(Return(true)); + + media_pipeline.Initialize(LoadType::kLoadTypeMediaStream, std::move(backend), + /*is_buffering_enabled=*/false); + media_pipeline.InitializeVideo( + {::media::VideoDecoderConfig( + ::media::VideoCodec::kH264, + ::media::VideoCodecProfile::H264PROFILE_MAIN, + ::media::VideoDecoderConfig::AlphaMode::kIsOpaque, + ::media::VideoColorSpace(1, 1, 1, gfx::ColorSpace::RangeID::FULL), + ::media::VideoTransformation(), gfx::Size(1920, 1080), + gfx::Rect(0, 0, 1920, 1080), gfx::Size(1920, 1080), {}, + ::media::EncryptionScheme::kUnencrypted)}, + VideoPipelineClient(), std::move(frame_provider)); + media_pipeline.Flush(base::DoNothing()); + media_pipeline.StartPlayingFrom(base::Seconds(0)); +} + } // namespace } // namespace media } // namespace chromecast