Index: chromecast/media/cma/test/cma_end_to_end_test.cc |
diff --git a/chromecast/media/cma/test/cma_end_to_end_test.cc b/chromecast/media/cma/test/cma_end_to_end_test.cc |
index 70483e6d9a0b74d35068e1a712786caec94da5ad..471c6e620755f7698e9ab4da6d9fc5abfbbbdbab 100644 |
--- a/chromecast/media/cma/test/cma_end_to_end_test.cc |
+++ b/chromecast/media/cma/test/cma_end_to_end_test.cc |
@@ -11,8 +11,14 @@ |
#include "chromecast/base/task_runner_impl.h" |
#include "chromecast/media/cma/backend/media_pipeline_backend_default.h" |
#include "chromecast/media/cma/base/buffering_defs.h" |
+#include "chromecast/media/cma/base/coded_frame_provider.h" |
#include "chromecast/media/cma/filters/cma_renderer.h" |
+#include "chromecast/media/cma/pipeline/av_pipeline_client.h" |
#include "chromecast/media/cma/pipeline/media_pipeline_impl.h" |
+#include "chromecast/media/cma/pipeline/video_pipeline_client.h" |
+#include "chromecast/renderer/media/audio_pipeline.h" |
+#include "chromecast/renderer/media/renderer_media_pipeline.h" |
+#include "chromecast/renderer/media/video_pipeline.h" |
#include "gpu/command_buffer/client/gles2_interface_stub.h" |
#include "media/base/demuxer_stream_provider.h" |
#include "media/base/fake_demuxer_stream.h" |
@@ -26,6 +32,163 @@ namespace media { |
namespace { |
+class FakeRendererMediaPipeline : public RendererMediaPipeline { |
+ public: |
+ FakeRendererMediaPipeline(scoped_ptr<MediaPipelineImpl> media_pipeline) |
+ : media_pipeline_(media_pipeline.Pass()), |
+ audio_pipeline_(new FakeAudioPipeline(media_pipeline_.get())), |
+ video_pipeline_(new FakeVideoPipeline(media_pipeline_.get())) {} |
+ |
+ ~FakeRendererMediaPipeline() override {} |
+ |
+ // RendererMediaPipeline implementation: |
+ void SetClient(const MediaPipelineClient& client) override { |
+ media_pipeline_->SetClient(client); |
+ } |
+ |
+ void SetCdm(int cdm_id) override { media_pipeline_->SetCdm(cdm_id); } |
+ |
+ AudioPipeline* GetAudioPipeline() const override { |
+ return audio_pipeline_.get(); |
+ } |
+ |
+ VideoPipeline* GetVideoPipeline() const override { |
+ return video_pipeline_.get(); |
+ } |
+ |
+ void InitializeAudio(const ::media::AudioDecoderConfig& config, |
+ scoped_ptr<CodedFrameProvider> frame_provider, |
+ const ::media::PipelineStatusCB& status_cb) override { |
+ audio_pipeline_->InitializeAudio(config, frame_provider.Pass(), status_cb); |
+ } |
+ |
+ void InitializeVideo(const std::vector< ::media::VideoDecoderConfig>& configs, |
+ scoped_ptr<CodedFrameProvider> frame_provider, |
+ const ::media::PipelineStatusCB& status_cb) override { |
+ video_pipeline_->InitializeVideo(configs, frame_provider.Pass(), status_cb); |
+ } |
+ |
+ void StartPlayingFrom(base::TimeDelta time) override { |
+ media_pipeline_->StartPlayingFrom(time); |
+ } |
+ |
+ void Flush(const ::media::PipelineStatusCB& status_cb) override { |
+ media_pipeline_->Flush(status_cb); |
+ } |
+ |
+ void Stop() override { media_pipeline_->Stop(); } |
+ |
+ void SetPlaybackRate(double playback_rate) override { |
+ media_pipeline_->SetPlaybackRate(playback_rate); |
+ } |
+ |
+ private: |
+ class FakeAudioPipeline : public AudioPipeline { |
+ public: |
+ FakeAudioPipeline(MediaPipelineImpl* media_pipeline) |
+ : media_pipeline_(media_pipeline), |
+ client_set_(false), |
+ initialized_(false) { |
+ DCHECK(media_pipeline_); |
+ } |
+ |
+ ~FakeAudioPipeline() override {} |
+ |
+ void InitializeAudio(const ::media::AudioDecoderConfig& config, |
+ scoped_ptr<CodedFrameProvider> frame_provider, |
+ const ::media::PipelineStatusCB& status_cb) { |
+ config_ = config; |
+ frame_provider_ = frame_provider.Pass(); |
+ status_cb_ = status_cb; |
+ initialized_ = true; |
+ if (client_set_) { |
+ media_pipeline_->InitializeAudio( |
+ config_, client_, frame_provider_.Pass(), status_cb_); |
+ } |
+ } |
+ |
+ // AudioPipeline implementation: |
+ void SetClient(const AvPipelineClient& client) override { |
+ client_ = client; |
+ client_set_ = true; |
+ if (initialized_) { |
+ media_pipeline_->InitializeAudio( |
+ config_, client_, frame_provider_.Pass(), status_cb_); |
+ } |
+ } |
+ |
+ void SetVolume(float volume) override { |
+ media_pipeline_->SetVolume(volume); |
+ } |
+ |
+ private: |
+ MediaPipelineImpl* media_pipeline_; |
+ bool client_set_; |
+ bool initialized_; |
+ |
+ AvPipelineClient client_; |
+ ::media::AudioDecoderConfig config_; |
+ scoped_ptr<CodedFrameProvider> frame_provider_; |
+ ::media::PipelineStatusCB status_cb_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeAudioPipeline); |
+ }; |
+ |
+ class FakeVideoPipeline : public VideoPipeline { |
+ public: |
+ FakeVideoPipeline(MediaPipelineImpl* media_pipeline) |
+ : media_pipeline_(media_pipeline), |
+ client_set_(false), |
+ initialized_(false) { |
+ DCHECK(media_pipeline_); |
+ } |
+ |
+ ~FakeVideoPipeline() override {} |
+ |
+ void InitializeVideo( |
+ const std::vector< ::media::VideoDecoderConfig>& configs, |
+ scoped_ptr<CodedFrameProvider> frame_provider, |
+ const ::media::PipelineStatusCB& status_cb) { |
+ configs_ = configs; |
+ frame_provider_ = frame_provider.Pass(); |
+ status_cb_ = status_cb; |
+ initialized_ = true; |
+ if (client_set_) { |
+ media_pipeline_->InitializeVideo( |
+ configs_, client_, frame_provider_.Pass(), status_cb_); |
+ } |
+ } |
+ |
+ // VideoPipeline implementation: |
+ void SetClient(const VideoPipelineClient& client) override { |
+ client_ = client; |
+ client_set_ = true; |
+ if (initialized_) { |
+ media_pipeline_->InitializeVideo( |
+ configs_, client_, frame_provider_.Pass(), status_cb_); |
+ } |
+ } |
+ |
+ private: |
+ MediaPipelineImpl* media_pipeline_; |
+ bool client_set_; |
+ bool initialized_; |
+ |
+ VideoPipelineClient client_; |
+ std::vector< ::media::VideoDecoderConfig> configs_; |
+ scoped_ptr<CodedFrameProvider> frame_provider_; |
+ ::media::PipelineStatusCB status_cb_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeVideoPipeline); |
+ }; |
+ |
+ const scoped_ptr<MediaPipelineImpl> media_pipeline_; |
+ scoped_ptr<FakeAudioPipeline> audio_pipeline_; |
+ scoped_ptr<FakeVideoPipeline> video_pipeline_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FakeRendererMediaPipeline); |
+}; |
+ |
class CmaEndToEndTest : public testing::Test { |
public: |
CmaEndToEndTest() {} |
@@ -40,9 +203,8 @@ class CmaEndToEndTest : public testing::Test { |
scoped_ptr<MediaPipelineImpl> media_pipeline(new MediaPipelineImpl()); |
task_runner_.reset(new TaskRunnerImpl()); |
- MediaPipelineDeviceParams params(task_runner_.get()); |
scoped_ptr<MediaPipelineBackend> backend = |
- make_scoped_ptr(new MediaPipelineBackendDefault(params)); |
+ make_scoped_ptr(new MediaPipelineBackendDefault()); |
gles2_.reset(new gpu::gles2::GLES2InterfaceStub()); |
mock_gpu_factories_ = new ::media::MockGpuVideoAcceleratorFactories(); |
@@ -52,8 +214,11 @@ class CmaEndToEndTest : public testing::Test { |
media_pipeline->Initialize(kLoadTypeMediaSource, backend.Pass()); |
- renderer_.reset(new CmaRenderer(media_pipeline.Pass(), null_sink_.get(), |
- mock_gpu_factories_)); |
+ scoped_ptr<RendererMediaPipeline> renderer_media_pipeline( |
+ new FakeRendererMediaPipeline(media_pipeline.Pass())); |
+ |
+ renderer_.reset(new CmaRenderer( |
+ renderer_media_pipeline.Pass(), null_sink_.get(), mock_gpu_factories_)); |
} |
void TearDown() override { message_loop_.RunUntilIdle(); } |
@@ -101,6 +266,5 @@ TEST_F(CmaEndToEndTest, TestInitialization) { |
EXPECT_CALL(mock_, OnInitialized(::media::PIPELINE_OK)); |
} |
- |
} // namespace media |
} // namespace chromecast |