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

Side by Side Diff: media/base/android/media_codec_decoder_unittest.cc

Issue 1287423004: MediaCodecPlayer implementation (stage 5 - reconfiguration) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mtplayer-cleanuptest
Patch Set: Fixed AdvanceAccessUnitQueue() Created 5 years, 3 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
« no previous file with comments | « media/base/android/media_codec_decoder.cc ('k') | media/base/android/media_codec_player.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/logging.h" 6 #include "base/logging.h"
7 #include "base/thread_task_runner_handle.h" 7 #include "base/thread_task_runner_handle.h"
8 #include "base/timer/timer.h" 8 #include "base/timer/timer.h"
9 #include "media/base/android/media_codec_audio_decoder.h" 9 #include "media/base/android/media_codec_audio_decoder.h"
10 #include "media/base/android/media_codec_bridge.h" 10 #include "media/base/android/media_codec_bridge.h"
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 void CreateAudioDecoder(); 142 void CreateAudioDecoder();
143 void CreateVideoDecoder(); 143 void CreateVideoDecoder();
144 void SetVideoSurface(); 144 void SetVideoSurface();
145 void SetStopRequestAtTime(const base::TimeDelta& time) { 145 void SetStopRequestAtTime(const base::TimeDelta& time) {
146 stop_request_time_ = time; 146 stop_request_time_ = time;
147 } 147 }
148 148
149 // Decoder callbacks. 149 // Decoder callbacks.
150 void OnDataRequested(); 150 void OnDataRequested();
151 void OnStarvation() { is_starved_ = true; } 151 void OnStarvation() { is_starved_ = true; }
152 void OnDecoderDrained() {}
152 void OnStopDone() { is_stopped_ = true; } 153 void OnStopDone() { is_stopped_ = true; }
153 void OnError() { DVLOG(0) << "MediaCodecDecoderTest::" << __FUNCTION__; } 154 void OnError() { DVLOG(0) << "MediaCodecDecoderTest::" << __FUNCTION__; }
154 void OnUpdateCurrentTime(base::TimeDelta now_playing, 155 void OnUpdateCurrentTime(base::TimeDelta now_playing,
155 base::TimeDelta last_buffered, 156 base::TimeDelta last_buffered,
156 bool postpone) { 157 bool postpone) {
157 // Add the |last_buffered| value for PTS. For video it is the same as 158 // Add the |last_buffered| value for PTS. For video it is the same as
158 // |now_playing| and is equal to PTS, for audio |last_buffered| should 159 // |now_playing| and is equal to PTS, for audio |last_buffered| should
159 // exceed PTS. 160 // exceed PTS.
160 if (postpone) 161 if (postpone)
161 return; 162 return;
162 163
163 pts_stat_.AddValue(last_buffered); 164 pts_stat_.AddValue(last_buffered);
164 165
165 if (stop_request_time_ != kNoTimestamp() && 166 if (stop_request_time_ != kNoTimestamp() &&
166 now_playing >= stop_request_time_) { 167 now_playing >= stop_request_time_) {
167 stop_request_time_ = kNoTimestamp(); 168 stop_request_time_ = kNoTimestamp();
168 decoder_->RequestToStop(); 169 decoder_->RequestToStop();
169 } 170 }
170 } 171 }
171 172
172 void OnVideoSizeChanged(const gfx::Size& video_size) {} 173 void OnVideoSizeChanged(const gfx::Size& video_size) {
174 video_size_ = video_size;
175 }
176
173 void OnVideoCodecCreated() {} 177 void OnVideoCodecCreated() {}
174 178
175 scoped_ptr<MediaCodecDecoder> decoder_; 179 scoped_ptr<MediaCodecDecoder> decoder_;
176 scoped_ptr<TestDataFactory> data_factory_; 180 scoped_ptr<TestDataFactory> data_factory_;
177 Minimax<base::TimeDelta> pts_stat_; 181 Minimax<base::TimeDelta> pts_stat_;
182 gfx::Size video_size_;
178 183
179 private: 184 private:
180 bool is_timeout_expired() const { return is_timeout_expired_; } 185 bool is_timeout_expired() const { return is_timeout_expired_; }
181 void SetTimeoutExpired(bool value) { is_timeout_expired_ = value; } 186 void SetTimeoutExpired(bool value) { is_timeout_expired_ = value; }
182 187
183 base::MessageLoop message_loop_; 188 base::MessageLoop message_loop_;
184 bool is_timeout_expired_; 189 bool is_timeout_expired_;
185 190
186 bool is_prefetched_; 191 bool is_prefetched_;
187 bool is_stopped_; 192 bool is_stopped_;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 233
229 DCHECK(!timer.IsRunning()); 234 DCHECK(!timer.IsRunning());
230 return false; 235 return false;
231 } 236 }
232 237
233 void MediaCodecDecoderTest::CreateAudioDecoder() { 238 void MediaCodecDecoderTest::CreateAudioDecoder() {
234 decoder_ = scoped_ptr<MediaCodecDecoder>(new MediaCodecAudioDecoder( 239 decoder_ = scoped_ptr<MediaCodecDecoder>(new MediaCodecAudioDecoder(
235 task_runner_, base::Bind(&MediaCodecDecoderTest::OnDataRequested, 240 task_runner_, base::Bind(&MediaCodecDecoderTest::OnDataRequested,
236 base::Unretained(this)), 241 base::Unretained(this)),
237 base::Bind(&MediaCodecDecoderTest::OnStarvation, base::Unretained(this)), 242 base::Bind(&MediaCodecDecoderTest::OnStarvation, base::Unretained(this)),
243 base::Bind(&MediaCodecDecoderTest::OnDecoderDrained,
244 base::Unretained(this)),
238 base::Bind(&MediaCodecDecoderTest::OnStopDone, base::Unretained(this)), 245 base::Bind(&MediaCodecDecoderTest::OnStopDone, base::Unretained(this)),
239 base::Bind(&MediaCodecDecoderTest::OnError, base::Unretained(this)), 246 base::Bind(&MediaCodecDecoderTest::OnError, base::Unretained(this)),
240 base::Bind(&MediaCodecDecoderTest::OnUpdateCurrentTime, 247 base::Bind(&MediaCodecDecoderTest::OnUpdateCurrentTime,
241 base::Unretained(this)))); 248 base::Unretained(this))));
242 249
243 data_available_cb_ = base::Bind(&MediaCodecDecoder::OnDemuxerDataAvailable, 250 data_available_cb_ = base::Bind(&MediaCodecDecoder::OnDemuxerDataAvailable,
244 base::Unretained(decoder_.get())); 251 base::Unretained(decoder_.get()));
245 } 252 }
246 253
247 void MediaCodecDecoderTest::CreateVideoDecoder() { 254 void MediaCodecDecoderTest::CreateVideoDecoder() {
248 decoder_ = scoped_ptr<MediaCodecDecoder>(new MediaCodecVideoDecoder( 255 decoder_ = scoped_ptr<MediaCodecDecoder>(new MediaCodecVideoDecoder(
249 task_runner_, base::Bind(&MediaCodecDecoderTest::OnDataRequested, 256 task_runner_, base::Bind(&MediaCodecDecoderTest::OnDataRequested,
250 base::Unretained(this)), 257 base::Unretained(this)),
251 base::Bind(&MediaCodecDecoderTest::OnStarvation, base::Unretained(this)), 258 base::Bind(&MediaCodecDecoderTest::OnStarvation, base::Unretained(this)),
259 base::Bind(&MediaCodecDecoderTest::OnDecoderDrained,
260 base::Unretained(this)),
252 base::Bind(&MediaCodecDecoderTest::OnStopDone, base::Unretained(this)), 261 base::Bind(&MediaCodecDecoderTest::OnStopDone, base::Unretained(this)),
253 base::Bind(&MediaCodecDecoderTest::OnError, base::Unretained(this)), 262 base::Bind(&MediaCodecDecoderTest::OnError, base::Unretained(this)),
254 base::Bind(&MediaCodecDecoderTest::OnUpdateCurrentTime, 263 base::Bind(&MediaCodecDecoderTest::OnUpdateCurrentTime,
255 base::Unretained(this)), 264 base::Unretained(this)),
256 base::Bind(&MediaCodecDecoderTest::OnVideoSizeChanged, 265 base::Bind(&MediaCodecDecoderTest::OnVideoSizeChanged,
257 base::Unretained(this)), 266 base::Unretained(this)),
258 base::Bind(&MediaCodecDecoderTest::OnVideoCodecCreated, 267 base::Bind(&MediaCodecDecoderTest::OnVideoCodecCreated,
259 base::Unretained(this)))); 268 base::Unretained(this))));
260 269
261 data_available_cb_ = base::Bind(&MediaCodecDecoder::OnDemuxerDataAvailable, 270 data_available_cb_ = base::Bind(&MediaCodecDecoder::OnDemuxerDataAvailable,
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 // After starvation we should be able to stop decoder. 662 // After starvation we should be able to stop decoder.
654 decoder_->RequestToStop(); 663 decoder_->RequestToStop();
655 664
656 EXPECT_TRUE(WaitForCondition( 665 EXPECT_TRUE(WaitForCondition(
657 base::Bind(&MediaCodecDecoderTest::is_stopped, base::Unretained(this)))); 666 base::Bind(&MediaCodecDecoderTest::is_stopped, base::Unretained(this))));
658 667
659 EXPECT_TRUE(decoder_->IsStopped()); 668 EXPECT_TRUE(decoder_->IsStopped());
660 EXPECT_FALSE(decoder_->IsCompleted()); 669 EXPECT_FALSE(decoder_->IsCompleted());
661 } 670 }
662 671
672 TEST_F(MediaCodecDecoderTest, VideoFirstUnitIsReconfig) {
673 SKIP_TEST_IF_MEDIA_CODEC_BRIDGE_IS_NOT_AVAILABLE();
674
675 // Test that the kConfigChanged unit that comes before the first data unit
676 // gets processed, i.e. is not lost.
677
678 CreateVideoDecoder();
679
680 base::TimeDelta duration = base::TimeDelta::FromMilliseconds(200);
681 base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(1000);
682 SetDataFactory(scoped_ptr<VideoFactory>(new VideoFactory(duration)));
683
684 // Ask factory to produce initial configuration unit. The configuraton will
685 // be factory.GetConfigs().
686 data_factory_->RequestInitialConfigs();
687
688 // Create am alternative configuration (we just alter video size).
689 DemuxerConfigs alt_configs = data_factory_->GetConfigs();
690 alt_configs.video_size = gfx::Size(100, 100);
691
692 // Pass the alternative configuration to decoder.
693 decoder_->SetDemuxerConfigs(alt_configs);
694
695 // Prefetch.
696 decoder_->Prefetch(base::Bind(&MediaCodecDecoderTest::SetPrefetched,
697 base::Unretained(this), true));
698
699 EXPECT_TRUE(WaitForCondition(base::Bind(&MediaCodecDecoderTest::is_prefetched,
700 base::Unretained(this))));
701
702 // Current implementation reports the new video size after
703 // SetDemuxerConfigs(), verify that it is alt size.
704 EXPECT_EQ(alt_configs.video_size, video_size_);
705
706 SetVideoSurface();
707
708 // Configure.
709 EXPECT_EQ(MediaCodecDecoder::kConfigOk, decoder_->Configure());
710
711 // Start.
712 EXPECT_TRUE(decoder_->Start(base::TimeDelta::FromMilliseconds(0)));
713
714 // Wait for completion.
715 EXPECT_TRUE(WaitForCondition(
716 base::Bind(&MediaCodecDecoderTest::is_stopped, base::Unretained(this)),
717 timeout));
718
719 EXPECT_TRUE(decoder_->IsStopped());
720 EXPECT_TRUE(decoder_->IsCompleted());
721 EXPECT_EQ(data_factory_->last_pts(), pts_stat_.max());
722
723 // Check that the reported video size is the one from the in-stream configs.
724 EXPECT_EQ(data_factory_->GetConfigs().video_size, video_size_);
725 }
726
663 } // namespace media 727 } // namespace media
OLDNEW
« no previous file with comments | « media/base/android/media_codec_decoder.cc ('k') | media/base/android/media_codec_player.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698