Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(914)

Side by Side Diff: chromecast/media/cma/test/cma_end_to_end_test.cc

Issue 1372393007: [Chromecast] Upgrade to new CMA backend API (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Fix end_to_end test + address slan comments Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/macros.h" 6 #include "base/macros.h"
7 #include "base/memory/ref_counted.h" 7 #include "base/memory/ref_counted.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
11 #include "chromecast/base/task_runner_impl.h" 11 #include "chromecast/base/task_runner_impl.h"
12 #include "chromecast/media/cma/backend/media_pipeline_backend_default.h" 12 #include "chromecast/media/cma/backend/media_pipeline_backend_default.h"
13 #include "chromecast/media/cma/base/buffering_defs.h" 13 #include "chromecast/media/cma/base/buffering_defs.h"
14 #include "chromecast/media/cma/base/coded_frame_provider.h"
14 #include "chromecast/media/cma/filters/cma_renderer.h" 15 #include "chromecast/media/cma/filters/cma_renderer.h"
16 #include "chromecast/media/cma/pipeline/av_pipeline_client.h"
15 #include "chromecast/media/cma/pipeline/media_pipeline_impl.h" 17 #include "chromecast/media/cma/pipeline/media_pipeline_impl.h"
18 #include "chromecast/media/cma/pipeline/video_pipeline_client.h"
19 #include "chromecast/renderer/media/audio_pipeline.h"
20 #include "chromecast/renderer/media/renderer_media_pipeline.h"
21 #include "chromecast/renderer/media/video_pipeline.h"
16 #include "gpu/command_buffer/client/gles2_interface_stub.h" 22 #include "gpu/command_buffer/client/gles2_interface_stub.h"
17 #include "media/base/demuxer_stream_provider.h" 23 #include "media/base/demuxer_stream_provider.h"
18 #include "media/base/fake_demuxer_stream.h" 24 #include "media/base/fake_demuxer_stream.h"
19 #include "media/base/null_video_sink.h" 25 #include "media/base/null_video_sink.h"
20 #include "media/renderers/mock_gpu_video_accelerator_factories.h" 26 #include "media/renderers/mock_gpu_video_accelerator_factories.h"
21 #include "testing/gmock/include/gmock/gmock.h" 27 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h" 28 #include "testing/gtest/include/gtest/gtest.h"
23 29
24 namespace chromecast { 30 namespace chromecast {
25 namespace media { 31 namespace media {
26 32
27 namespace { 33 namespace {
28 34
35 class FakeRendererMediaPipeline : public RendererMediaPipeline {
36 public:
37 FakeRendererMediaPipeline(scoped_ptr<MediaPipelineImpl> media_pipeline)
38 : media_pipeline_(media_pipeline.Pass()),
39 audio_pipeline_(new FakeAudioPipeline(media_pipeline_.get())),
40 video_pipeline_(new FakeVideoPipeline(media_pipeline_.get())) {}
41
42 ~FakeRendererMediaPipeline() override {}
43
44 // RendererMediaPipeline implementation:
45 void SetClient(const MediaPipelineClient& client) override {
46 media_pipeline_->SetClient(client);
47 }
48
49 void SetCdm(int cdm_id) override { media_pipeline_->SetCdm(cdm_id); }
50
51 AudioPipeline* GetAudioPipeline() const override {
52 return audio_pipeline_.get();
53 }
54
55 VideoPipeline* GetVideoPipeline() const override {
56 return video_pipeline_.get();
57 }
58
59 void InitializeAudio(const ::media::AudioDecoderConfig& config,
60 scoped_ptr<CodedFrameProvider> frame_provider,
61 const ::media::PipelineStatusCB& status_cb) override {
62 audio_pipeline_->InitializeAudio(config, frame_provider.Pass(), status_cb);
63 }
64
65 void InitializeVideo(const std::vector< ::media::VideoDecoderConfig>& configs,
66 scoped_ptr<CodedFrameProvider> frame_provider,
67 const ::media::PipelineStatusCB& status_cb) override {
68 video_pipeline_->InitializeVideo(configs, frame_provider.Pass(), status_cb);
69 }
70
71 void StartPlayingFrom(base::TimeDelta time) override {
72 media_pipeline_->StartPlayingFrom(time);
73 }
74
75 void Flush(const ::media::PipelineStatusCB& status_cb) override {
76 media_pipeline_->Flush(status_cb);
77 }
78
79 void Stop() override { media_pipeline_->Stop(); }
80
81 void SetPlaybackRate(double playback_rate) override {
82 media_pipeline_->SetPlaybackRate(playback_rate);
83 }
84
85 private:
86 class FakeAudioPipeline : public AudioPipeline {
87 public:
88 FakeAudioPipeline(MediaPipelineImpl* media_pipeline)
89 : media_pipeline_(media_pipeline),
90 client_set_(false),
91 initialized_(false) {
92 DCHECK(media_pipeline_);
93 }
94
95 ~FakeAudioPipeline() override {}
96
97 void InitializeAudio(const ::media::AudioDecoderConfig& config,
98 scoped_ptr<CodedFrameProvider> frame_provider,
99 const ::media::PipelineStatusCB& status_cb) {
100 config_ = config;
101 frame_provider_ = frame_provider.Pass();
102 status_cb_ = status_cb;
103 initialized_ = true;
104 if (client_set_) {
105 media_pipeline_->InitializeAudio(
106 config_, client_, frame_provider_.Pass(), status_cb_);
107 }
108 }
109
110 // AudioPipeline implementation:
111 void SetClient(const AvPipelineClient& client) override {
112 client_ = client;
113 client_set_ = true;
114 if (initialized_) {
115 media_pipeline_->InitializeAudio(
116 config_, client_, frame_provider_.Pass(), status_cb_);
117 }
118 }
119
120 void SetVolume(float volume) override {
121 media_pipeline_->SetVolume(volume);
122 }
123
124 private:
125 MediaPipelineImpl* media_pipeline_;
126 bool client_set_;
127 bool initialized_;
128
129 AvPipelineClient client_;
130 ::media::AudioDecoderConfig config_;
131 scoped_ptr<CodedFrameProvider> frame_provider_;
132 ::media::PipelineStatusCB status_cb_;
133
134 DISALLOW_COPY_AND_ASSIGN(FakeAudioPipeline);
135 };
136
137 class FakeVideoPipeline : public VideoPipeline {
138 public:
139 FakeVideoPipeline(MediaPipelineImpl* media_pipeline)
140 : media_pipeline_(media_pipeline),
141 client_set_(false),
142 initialized_(false) {
143 DCHECK(media_pipeline_);
144 }
145
146 ~FakeVideoPipeline() override {}
147
148 void InitializeVideo(
149 const std::vector< ::media::VideoDecoderConfig>& configs,
150 scoped_ptr<CodedFrameProvider> frame_provider,
151 const ::media::PipelineStatusCB& status_cb) {
152 configs_ = configs;
153 frame_provider_ = frame_provider.Pass();
154 status_cb_ = status_cb;
155 initialized_ = true;
156 if (client_set_) {
157 media_pipeline_->InitializeVideo(
158 configs_, client_, frame_provider_.Pass(), status_cb_);
159 }
160 }
161
162 // VideoPipeline implementation:
163 void SetClient(const VideoPipelineClient& client) override {
164 client_ = client;
165 client_set_ = true;
166 if (initialized_) {
167 media_pipeline_->InitializeVideo(
168 configs_, client_, frame_provider_.Pass(), status_cb_);
169 }
170 }
171
172 private:
173 MediaPipelineImpl* media_pipeline_;
174 bool client_set_;
175 bool initialized_;
176
177 VideoPipelineClient client_;
178 std::vector< ::media::VideoDecoderConfig> configs_;
179 scoped_ptr<CodedFrameProvider> frame_provider_;
180 ::media::PipelineStatusCB status_cb_;
181
182 DISALLOW_COPY_AND_ASSIGN(FakeVideoPipeline);
183 };
184
185 const scoped_ptr<MediaPipelineImpl> media_pipeline_;
186 scoped_ptr<FakeAudioPipeline> audio_pipeline_;
187 scoped_ptr<FakeVideoPipeline> video_pipeline_;
188
189 DISALLOW_COPY_AND_ASSIGN(FakeRendererMediaPipeline);
190 };
191
29 class CmaEndToEndTest : public testing::Test { 192 class CmaEndToEndTest : public testing::Test {
30 public: 193 public:
31 CmaEndToEndTest() {} 194 CmaEndToEndTest() {}
32 195
33 void SetUp() override { 196 void SetUp() override {
34 demuxer_stream_provider_.reset( 197 demuxer_stream_provider_.reset(
35 new ::media::FakeDemuxerStreamProvider(1, 1, false)); 198 new ::media::FakeDemuxerStreamProvider(1, 1, false));
36 null_sink_.reset(new ::media::NullVideoSink( 199 null_sink_.reset(new ::media::NullVideoSink(
37 false, base::TimeDelta::FromSecondsD(1.0 / 60), 200 false, base::TimeDelta::FromSecondsD(1.0 / 60),
38 base::Bind(&MockCB::OnFrameReceived, base::Unretained(&mock_)), 201 base::Bind(&MockCB::OnFrameReceived, base::Unretained(&mock_)),
39 message_loop_.task_runner())); 202 message_loop_.task_runner()));
40 203
41 scoped_ptr<MediaPipelineImpl> media_pipeline(new MediaPipelineImpl()); 204 scoped_ptr<MediaPipelineImpl> media_pipeline(new MediaPipelineImpl());
42 task_runner_.reset(new TaskRunnerImpl()); 205 task_runner_.reset(new TaskRunnerImpl());
43 MediaPipelineDeviceParams params(task_runner_.get());
44 scoped_ptr<MediaPipelineBackend> backend = 206 scoped_ptr<MediaPipelineBackend> backend =
45 make_scoped_ptr(new MediaPipelineBackendDefault(params)); 207 make_scoped_ptr(new MediaPipelineBackendDefault());
46 208
47 gles2_.reset(new gpu::gles2::GLES2InterfaceStub()); 209 gles2_.reset(new gpu::gles2::GLES2InterfaceStub());
48 mock_gpu_factories_ = new ::media::MockGpuVideoAcceleratorFactories(); 210 mock_gpu_factories_ = new ::media::MockGpuVideoAcceleratorFactories();
49 211
50 EXPECT_CALL(*mock_gpu_factories_.get(), GetGLES2Interface()) 212 EXPECT_CALL(*mock_gpu_factories_.get(), GetGLES2Interface())
51 .WillRepeatedly(testing::Return(gles2_.get())); 213 .WillRepeatedly(testing::Return(gles2_.get()));
52 214
53 media_pipeline->Initialize(kLoadTypeMediaSource, backend.Pass()); 215 media_pipeline->Initialize(kLoadTypeMediaSource, backend.Pass());
54 216
55 renderer_.reset(new CmaRenderer(media_pipeline.Pass(), null_sink_.get(), 217 scoped_ptr<RendererMediaPipeline> renderer_media_pipeline(
56 mock_gpu_factories_)); 218 new FakeRendererMediaPipeline(media_pipeline.Pass()));
219
220 renderer_.reset(new CmaRenderer(
221 renderer_media_pipeline.Pass(), null_sink_.get(), mock_gpu_factories_));
57 } 222 }
58 void TearDown() override { message_loop_.RunUntilIdle(); } 223 void TearDown() override { message_loop_.RunUntilIdle(); }
59 224
60 ~CmaEndToEndTest() override {} 225 ~CmaEndToEndTest() override {}
61 226
62 protected: 227 protected:
63 base::MessageLoop message_loop_; 228 base::MessageLoop message_loop_;
64 scoped_ptr<TaskRunnerImpl> task_runner_; 229 scoped_ptr<TaskRunnerImpl> task_runner_;
65 scoped_ptr<::media::FakeDemuxerStreamProvider> demuxer_stream_provider_; 230 scoped_ptr<::media::FakeDemuxerStreamProvider> demuxer_stream_provider_;
66 scoped_ptr<CmaRenderer> renderer_; 231 scoped_ptr<CmaRenderer> renderer_;
(...skipping 27 matching lines...) Expand all
94 base::Bind(&MockCB::OnInitialized, base::Unretained(&mock_)), 259 base::Bind(&MockCB::OnInitialized, base::Unretained(&mock_)),
95 base::Bind(&MockCB::OnStatistics, base::Unretained(&mock_)), 260 base::Bind(&MockCB::OnStatistics, base::Unretained(&mock_)),
96 base::Bind(&MockCB::OnBufferingState, base::Unretained(&mock_)), 261 base::Bind(&MockCB::OnBufferingState, base::Unretained(&mock_)),
97 base::Bind(&MockCB::OnEnded, base::Unretained(&mock_)), 262 base::Bind(&MockCB::OnEnded, base::Unretained(&mock_)),
98 base::Bind(&MockCB::OnError, base::Unretained(&mock_)), 263 base::Bind(&MockCB::OnError, base::Unretained(&mock_)),
99 base::Bind(&MockCB::OnWaitingForDecryptionKey, base::Unretained(&mock_))); 264 base::Bind(&MockCB::OnWaitingForDecryptionKey, base::Unretained(&mock_)));
100 265
101 EXPECT_CALL(mock_, OnInitialized(::media::PIPELINE_OK)); 266 EXPECT_CALL(mock_, OnInitialized(::media::PIPELINE_OK));
102 } 267 }
103 268
104
105 } // namespace media 269 } // namespace media
106 } // namespace chromecast 270 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698