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

Side by Side Diff: media/base/pipeline_impl_unittest.cc

Issue 2267963002: Add support for cancellation of demuxer reads. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix and add tests. Created 4 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/pipeline_impl.cc ('k') | media/blink/multibuffer_data_source.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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "media/base/pipeline_impl.h" 5 #include "media/base/pipeline_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <memory> 8 #include <memory>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 text_stream_ = std::move(text_stream); 224 text_stream_ = std::move(text_stream);
225 } 225 }
226 226
227 MockDemuxerStream* audio_stream() { return audio_stream_.get(); } 227 MockDemuxerStream* audio_stream() { return audio_stream_.get(); }
228 228
229 MockDemuxerStream* video_stream() { return video_stream_.get(); } 229 MockDemuxerStream* video_stream() { return video_stream_.get(); }
230 230
231 FakeTextTrackStream* text_stream() { return text_stream_.get(); } 231 FakeTextTrackStream* text_stream() { return text_stream_.get(); }
232 232
233 void ExpectSeek(const base::TimeDelta& seek_time, bool underflowed) { 233 void ExpectSeek(const base::TimeDelta& seek_time, bool underflowed) {
234 EXPECT_CALL(*demuxer_, AbortPendingReads());
234 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 235 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
235 .WillOnce(RunCallback<1>(PIPELINE_OK)); 236 .WillOnce(RunCallback<1>(PIPELINE_OK));
236 237
237 EXPECT_CALL(*renderer_, Flush(_)) 238 EXPECT_CALL(*renderer_, Flush(_))
238 .WillOnce( 239 .WillOnce(
239 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), 240 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
240 RunClosure<0>())); 241 RunClosure<0>()));
241 EXPECT_CALL(*renderer_, SetPlaybackRate(_)); 242 EXPECT_CALL(*renderer_, SetPlaybackRate(_));
242 EXPECT_CALL(*renderer_, SetVolume(_)); 243 EXPECT_CALL(*renderer_, SetVolume(_));
243 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time)) 244 EXPECT_CALL(*renderer_, StartPlayingFrom(seek_time))
244 .WillOnce(SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH)); 245 .WillOnce(SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH));
245 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 246 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
246 247
247 // We expect a successful seek callback followed by a buffering update. 248 // We expect a successful seek callback followed by a buffering update.
248 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK)); 249 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_OK));
249 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 250 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
250 } 251 }
251 252
252 void DoSeek(const base::TimeDelta& seek_time) { 253 void DoSeek(const base::TimeDelta& seek_time) {
253 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, 254 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
254 base::Unretained(&callbacks_))); 255 base::Unretained(&callbacks_)));
255 base::RunLoop().RunUntilIdle(); 256 base::RunLoop().RunUntilIdle();
256 } 257 }
257 258
258 void ExpectSuspend() { 259 void ExpectSuspend() {
260 EXPECT_CALL(*demuxer_, AbortPendingReads());
259 EXPECT_CALL(*renderer_, SetPlaybackRate(0)); 261 EXPECT_CALL(*renderer_, SetPlaybackRate(0));
260 EXPECT_CALL(*renderer_, Flush(_))
261 .WillOnce(
262 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
263 RunClosure<0>()));
264 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
265 EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_OK)); 262 EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_OK));
266 } 263 }
267 264
268 void DoSuspend() { 265 void DoSuspend() {
269 pipeline_->Suspend( 266 pipeline_->Suspend(
270 base::Bind(&CallbackHelper::OnSuspend, base::Unretained(&callbacks_))); 267 base::Bind(&CallbackHelper::OnSuspend, base::Unretained(&callbacks_)));
271 base::RunLoop().RunUntilIdle(); 268 base::RunLoop().RunUntilIdle();
272 269
273 // |renderer_| has been deleted, replace it. 270 // |renderer_| has been deleted, replace it.
274 scoped_renderer_.reset(new StrictMock<MockRenderer>()), 271 scoped_renderer_.reset(new StrictMock<MockRenderer>()),
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
688 base::RunLoop().RunUntilIdle(); 685 base::RunLoop().RunUntilIdle();
689 686
690 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); 687 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
691 688
692 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 689 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
693 EXPECT_CALL(*renderer_, Flush(_)) 690 EXPECT_CALL(*renderer_, Flush(_))
694 .WillOnce( 691 .WillOnce(
695 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), 692 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
696 RunClosure<0>())); 693 RunClosure<0>()));
697 694
695 EXPECT_CALL(*demuxer_, AbortPendingReads());
698 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 696 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
699 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); 697 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
700 EXPECT_CALL(*demuxer_, Stop()); 698 EXPECT_CALL(*demuxer_, Stop());
701 699
702 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, 700 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
703 base::Unretained(&callbacks_))); 701 base::Unretained(&callbacks_)));
704 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); 702 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
705 base::RunLoop().RunUntilIdle(); 703 base::RunLoop().RunUntilIdle();
706 } 704 }
707 705
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 739
742 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5); 740 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(5);
743 741
744 // Seek() isn't called as the demuxer errors out first. 742 // Seek() isn't called as the demuxer errors out first.
745 EXPECT_CALL(*renderer_, Flush(_)) 743 EXPECT_CALL(*renderer_, Flush(_))
746 .WillOnce( 744 .WillOnce(
747 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING), 745 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
748 RunClosure<0>())); 746 RunClosure<0>()));
749 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 747 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
750 748
749 EXPECT_CALL(*demuxer_, AbortPendingReads());
751 EXPECT_CALL(*demuxer_, Seek(seek_time, _)) 750 EXPECT_CALL(*demuxer_, Seek(seek_time, _))
752 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); 751 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
753 EXPECT_CALL(*demuxer_, Stop()); 752 EXPECT_CALL(*demuxer_, Stop());
754 753
755 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek, 754 pipeline_->Seek(seek_time, base::Bind(&CallbackHelper::OnSeek,
756 base::Unretained(&callbacks_))); 755 base::Unretained(&callbacks_)));
757 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ)); 756 EXPECT_CALL(callbacks_, OnSeek(PIPELINE_ERROR_READ));
758 base::RunLoop().RunUntilIdle(); 757 base::RunLoop().RunUntilIdle();
759 } 758 }
760 759
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0)); 921 EXPECT_CALL(*renderer_, SetPlaybackRate(0.0));
923 EXPECT_CALL(*renderer_, SetVolume(1.0f)); 922 EXPECT_CALL(*renderer_, SetVolume(1.0f));
924 EXPECT_CALL(*renderer_, StartPlayingFrom(base::TimeDelta())) 923 EXPECT_CALL(*renderer_, StartPlayingFrom(base::TimeDelta()))
925 .WillOnce(SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH)); 924 .WillOnce(SetBufferingState(&renderer_client_, BUFFERING_HAVE_ENOUGH));
926 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 925 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
927 } 926 }
928 927
929 void DoSeek(TeardownState state, StopOrError stop_or_error) { 928 void DoSeek(TeardownState state, StopOrError stop_or_error) {
930 SetSeekExpectations(state, stop_or_error); 929 SetSeekExpectations(state, stop_or_error);
931 930
931 EXPECT_CALL(*demuxer_, AbortPendingReads());
932 EXPECT_CALL(*demuxer_, Stop()); 932 EXPECT_CALL(*demuxer_, Stop());
933 933
934 pipeline_->Seek( 934 pipeline_->Seek(
935 base::TimeDelta::FromSeconds(10), 935 base::TimeDelta::FromSeconds(10),
936 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_))); 936 base::Bind(&CallbackHelper::OnSeek, base::Unretained(&callbacks_)));
937 base::RunLoop().RunUntilIdle(); 937 base::RunLoop().RunUntilIdle();
938 } 938 }
939 939
940 void SetSeekExpectations(TeardownState state, StopOrError stop_or_error) { 940 void SetSeekExpectations(TeardownState state, StopOrError stop_or_error) {
941 if (state == kFlushing) { 941 if (state == kFlushing) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
995 return; 995 return;
996 } 996 }
997 997
998 // kSuspended, kSuspending never throw errors, since Resume() is always able 998 // kSuspended, kSuspending never throw errors, since Resume() is always able
999 // to restore the pipeline to a pristine state. 999 // to restore the pipeline to a pristine state.
1000 DoStopOrError(stop_or_error, false); 1000 DoStopOrError(stop_or_error, false);
1001 } 1001 }
1002 1002
1003 void SetSuspendExpectations(TeardownState state, StopOrError stop_or_error) { 1003 void SetSuspendExpectations(TeardownState state, StopOrError stop_or_error) {
1004 EXPECT_CALL(*renderer_, SetPlaybackRate(0)); 1004 EXPECT_CALL(*renderer_, SetPlaybackRate(0));
1005 EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 1005 EXPECT_CALL(*demuxer_, AbortPendingReads());
1006 EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_OK)); 1006 EXPECT_CALL(callbacks_, OnSuspend(PIPELINE_OK));
1007 EXPECT_CALL(*renderer_, Flush(_))
1008 .WillOnce(
1009 DoAll(SetBufferingState(&renderer_client_, BUFFERING_HAVE_NOTHING),
1010 RunClosure<0>()));
1011 if (state == kResuming) { 1007 if (state == kResuming) {
1012 if (stop_or_error == kStop) { 1008 if (stop_or_error == kStop) {
1013 EXPECT_CALL(*demuxer_, Seek(_, _)) 1009 EXPECT_CALL(*demuxer_, Seek(_, _))
1014 .WillOnce( 1010 .WillOnce(
1015 DoAll(Stop(pipeline_.get()), RunCallback<1>(PIPELINE_OK))); 1011 DoAll(Stop(pipeline_.get()), RunCallback<1>(PIPELINE_OK)));
1016 // Note: OnResume callback is not called after pipeline is stopped. 1012 // Note: OnResume callback is not called after pipeline is stopped.
1017 } else { 1013 } else {
1018 EXPECT_CALL(*demuxer_, Seek(_, _)) 1014 EXPECT_CALL(*demuxer_, Seek(_, _))
1019 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ)); 1015 .WillOnce(RunCallback<1>(PIPELINE_ERROR_READ));
1020 EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ)); 1016 EXPECT_CALL(callbacks_, OnResume(PIPELINE_ERROR_READ));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1075 INSTANTIATE_TEARDOWN_TEST(Error, Seeking); 1071 INSTANTIATE_TEARDOWN_TEST(Error, Seeking);
1076 INSTANTIATE_TEARDOWN_TEST(Error, Playing); 1072 INSTANTIATE_TEARDOWN_TEST(Error, Playing);
1077 INSTANTIATE_TEARDOWN_TEST(Error, Suspending); 1073 INSTANTIATE_TEARDOWN_TEST(Error, Suspending);
1078 INSTANTIATE_TEARDOWN_TEST(Error, Suspended); 1074 INSTANTIATE_TEARDOWN_TEST(Error, Suspended);
1079 INSTANTIATE_TEARDOWN_TEST(Error, Resuming); 1075 INSTANTIATE_TEARDOWN_TEST(Error, Resuming);
1080 1076
1081 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing); 1077 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Playing);
1082 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended); 1078 INSTANTIATE_TEARDOWN_TEST(ErrorAndStop, Suspended);
1083 1079
1084 } // namespace media 1080 } // namespace media
OLDNEW
« no previous file with comments | « media/base/pipeline_impl.cc ('k') | media/blink/multibuffer_data_source.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698