| 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 <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <deque> | 9 #include <deque> |
| 10 #include <string> | 10 #include <string> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 14 #include "base/location.h" | 14 #include "base/location.h" |
| 15 #include "base/logging.h" | 15 #include "base/logging.h" |
| 16 #include "base/macros.h" | 16 #include "base/macros.h" |
| 17 #include "base/path_service.h" | 17 #include "base/path_service.h" |
| 18 #include "base/run_loop.h" | 18 #include "base/run_loop.h" |
| 19 #include "base/single_thread_task_runner.h" | 19 #include "base/single_thread_task_runner.h" |
| 20 #include "base/test/mock_callback.h" | 20 #include "base/test/mock_callback.h" |
| 21 #include "base/test/scoped_task_scheduler.h" |
| 21 #include "base/threading/thread.h" | 22 #include "base/threading/thread.h" |
| 22 #include "base/threading/thread_task_runner_handle.h" | 23 #include "base/threading/thread_task_runner_handle.h" |
| 23 #include "media/base/decrypt_config.h" | 24 #include "media/base/decrypt_config.h" |
| 24 #include "media/base/media_log.h" | 25 #include "media/base/media_log.h" |
| 25 #include "media/base/media_tracks.h" | 26 #include "media/base/media_tracks.h" |
| 26 #include "media/base/mock_demuxer_host.h" | 27 #include "media/base/mock_demuxer_host.h" |
| 27 #include "media/base/test_helpers.h" | 28 #include "media/base/test_helpers.h" |
| 28 #include "media/base/timestamp_constants.h" | 29 #include "media/base/timestamp_constants.h" |
| 29 #include "media/ffmpeg/ffmpeg_common.h" | 30 #include "media/ffmpeg/ffmpeg_common.h" |
| 30 #include "media/filters/ffmpeg_demuxer.h" | 31 #include "media/filters/ffmpeg_demuxer.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 | 79 |
| 79 // Fixture class to facilitate writing tests. Takes care of setting up the | 80 // Fixture class to facilitate writing tests. Takes care of setting up the |
| 80 // FFmpeg, pipeline and filter host mocks. | 81 // FFmpeg, pipeline and filter host mocks. |
| 81 class FFmpegDemuxerTest : public testing::Test { | 82 class FFmpegDemuxerTest : public testing::Test { |
| 82 protected: | 83 protected: |
| 83 FFmpegDemuxerTest() {} | 84 FFmpegDemuxerTest() {} |
| 84 | 85 |
| 85 virtual ~FFmpegDemuxerTest() { | 86 virtual ~FFmpegDemuxerTest() { |
| 86 if (demuxer_) | 87 if (demuxer_) |
| 87 demuxer_->Stop(); | 88 demuxer_->Stop(); |
| 89 demuxer_.reset(); |
| 90 base::RunLoop().RunUntilIdle(); |
| 88 } | 91 } |
| 89 | 92 |
| 90 void CreateDemuxer(const std::string& name) { | 93 void CreateDemuxer(const std::string& name) { |
| 91 CHECK(!demuxer_); | 94 CHECK(!demuxer_); |
| 92 | 95 |
| 93 EXPECT_CALL(host_, OnBufferedTimeRangesChanged(_)).Times(AnyNumber()); | 96 EXPECT_CALL(host_, OnBufferedTimeRangesChanged(_)).Times(AnyNumber()); |
| 94 | 97 |
| 95 CreateDataSource(name); | 98 CreateDataSource(name); |
| 96 | 99 |
| 97 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = base::Bind( | 100 Demuxer::EncryptedMediaInitDataCB encrypted_media_init_data_cb = base::Bind( |
| 98 &FFmpegDemuxerTest::OnEncryptedMediaInitData, base::Unretained(this)); | 101 &FFmpegDemuxerTest::OnEncryptedMediaInitData, base::Unretained(this)); |
| 99 | 102 |
| 100 Demuxer::MediaTracksUpdatedCB tracks_updated_cb = base::Bind( | 103 Demuxer::MediaTracksUpdatedCB tracks_updated_cb = base::Bind( |
| 101 &FFmpegDemuxerTest::OnMediaTracksUpdated, base::Unretained(this)); | 104 &FFmpegDemuxerTest::OnMediaTracksUpdated, base::Unretained(this)); |
| 102 | 105 |
| 103 demuxer_.reset(new FFmpegDemuxer( | 106 demuxer_.reset(new FFmpegDemuxer( |
| 104 message_loop_.task_runner(), data_source_.get(), | 107 base::ThreadTaskRunnerHandle::Get(), data_source_.get(), |
| 105 encrypted_media_init_data_cb, tracks_updated_cb, new MediaLog())); | 108 encrypted_media_init_data_cb, tracks_updated_cb, new MediaLog())); |
| 106 } | 109 } |
| 107 | 110 |
| 108 DemuxerStream* GetStream(DemuxerStream::Type type) { | 111 DemuxerStream* GetStream(DemuxerStream::Type type) { |
| 109 std::vector<DemuxerStream*> streams = demuxer_->GetAllStreams(); | 112 std::vector<DemuxerStream*> streams = demuxer_->GetAllStreams(); |
| 110 for (auto* stream : streams) { | 113 for (auto* stream : streams) { |
| 111 if (stream->type() == type) | 114 if (stream->type() == type) |
| 112 return stream; | 115 return stream; |
| 113 } | 116 } |
| 114 return nullptr; | 117 return nullptr; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 EXPECT_EQ(read_expectation.status, status); | 184 EXPECT_EQ(read_expectation.status, status); |
| 182 if (status == DemuxerStream::kOk) { | 185 if (status == DemuxerStream::kOk) { |
| 183 EXPECT_TRUE(buffer); | 186 EXPECT_TRUE(buffer); |
| 184 EXPECT_EQ(read_expectation.size, buffer->data_size()); | 187 EXPECT_EQ(read_expectation.size, buffer->data_size()); |
| 185 EXPECT_EQ(read_expectation.timestamp_us, | 188 EXPECT_EQ(read_expectation.timestamp_us, |
| 186 buffer->timestamp().InMicroseconds()); | 189 buffer->timestamp().InMicroseconds()); |
| 187 EXPECT_EQ(read_expectation.discard_front_padding, | 190 EXPECT_EQ(read_expectation.discard_front_padding, |
| 188 buffer->discard_padding().first); | 191 buffer->discard_padding().first); |
| 189 EXPECT_EQ(read_expectation.is_key_frame, buffer->is_key_frame()); | 192 EXPECT_EQ(read_expectation.is_key_frame, buffer->is_key_frame()); |
| 190 } | 193 } |
| 191 DCHECK_EQ(&message_loop_, base::MessageLoop::current()); | |
| 192 OnReadDoneCalled(read_expectation.size, read_expectation.timestamp_us); | 194 OnReadDoneCalled(read_expectation.size, read_expectation.timestamp_us); |
| 193 message_loop_.task_runner()->PostTask( | 195 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 194 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); | 196 FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); |
| 195 } | 197 } |
| 196 | 198 |
| 197 DemuxerStream::ReadCB NewReadCB( | 199 DemuxerStream::ReadCB NewReadCB( |
| 198 const tracked_objects::Location& location, | 200 const tracked_objects::Location& location, |
| 199 int size, | 201 int size, |
| 200 int64_t timestamp_us, | 202 int64_t timestamp_us, |
| 201 bool is_key_frame, | 203 bool is_key_frame, |
| 202 DemuxerStream::Status status = DemuxerStream::kOk) { | 204 DemuxerStream::Status status = DemuxerStream::kOk) { |
| 203 return NewReadCBWithCheckedDiscard(location, size, timestamp_us, | 205 return NewReadCBWithCheckedDiscard(location, size, timestamp_us, |
| (...skipping 28 matching lines...) Expand all Loading... |
| 232 } | 234 } |
| 233 | 235 |
| 234 // Accessor to demuxer internals. | 236 // Accessor to demuxer internals. |
| 235 void SetDurationKnown(bool duration_known) { | 237 void SetDurationKnown(bool duration_known) { |
| 236 demuxer_->duration_known_ = duration_known; | 238 demuxer_->duration_known_ = duration_known; |
| 237 if (!duration_known) | 239 if (!duration_known) |
| 238 demuxer_->duration_ = kInfiniteDuration; | 240 demuxer_->duration_ = kInfiniteDuration; |
| 239 } | 241 } |
| 240 | 242 |
| 241 // Fixture members. | 243 // Fixture members. |
| 244 |
| 245 base::test::ScopedTaskScheduler task_scheduler_; |
| 242 std::unique_ptr<FileDataSource> data_source_; | 246 std::unique_ptr<FileDataSource> data_source_; |
| 243 std::unique_ptr<FFmpegDemuxer> demuxer_; | 247 std::unique_ptr<FFmpegDemuxer> demuxer_; |
| 244 StrictMock<MockDemuxerHost> host_; | 248 StrictMock<MockDemuxerHost> host_; |
| 245 std::unique_ptr<MediaTracks> media_tracks_; | 249 std::unique_ptr<MediaTracks> media_tracks_; |
| 246 base::MessageLoop message_loop_; | |
| 247 | 250 |
| 248 AVFormatContext* format_context() { | 251 AVFormatContext* format_context() { |
| 249 return demuxer_->glue_->format_context(); | 252 return demuxer_->glue_->format_context(); |
| 250 } | 253 } |
| 251 | 254 |
| 252 DemuxerStream* preferred_seeking_stream(base::TimeDelta seek_time) const { | 255 DemuxerStream* preferred_seeking_stream(base::TimeDelta seek_time) const { |
| 253 return demuxer_->FindPreferredStreamForSeeking(seek_time); | 256 return demuxer_->FindPreferredStreamForSeeking(seek_time); |
| 254 } | 257 } |
| 255 | 258 |
| 256 void ReadUntilEndOfStream(DemuxerStream* stream) { | 259 void ReadUntilEndOfStream(DemuxerStream* stream) { |
| (...skipping 1258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1515 EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta())); | 1518 EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta())); |
| 1516 | 1519 |
| 1517 // Now pretend that audio stream got disabled. | 1520 // Now pretend that audio stream got disabled. |
| 1518 astream->set_enabled(false, base::TimeDelta()); | 1521 astream->set_enabled(false, base::TimeDelta()); |
| 1519 // Since there's no other enabled streams, the preferred seeking stream should | 1522 // Since there's no other enabled streams, the preferred seeking stream should |
| 1520 // still be the audio stream. | 1523 // still be the audio stream. |
| 1521 EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta())); | 1524 EXPECT_EQ(astream, preferred_seeking_stream(base::TimeDelta())); |
| 1522 } | 1525 } |
| 1523 | 1526 |
| 1524 } // namespace media | 1527 } // namespace media |
| OLD | NEW |