| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |