| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <list> | 5 #include <list> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| 11 #include "base/thread_task_runner_handle.h" | 11 #include "base/thread_task_runner_handle.h" |
| 12 #include "base/threading/thread.h" | 12 #include "base/threading/thread.h" |
| 13 #include "base/time/time.h" | 13 #include "base/time/time.h" |
| 14 #include "chromecast/media/cma/base/balanced_media_task_runner_factory.h" | 14 #include "chromecast/media/cma/base/balanced_media_task_runner_factory.h" |
| 15 #include "chromecast/media/cma/base/decoder_buffer_base.h" | 15 #include "chromecast/media/cma/base/decoder_buffer_base.h" |
| 16 #include "chromecast/media/cma/filters/demuxer_stream_adapter.h" | |
| 17 #include "chromecast/media/cma/test/demuxer_stream_for_test.h" | |
| 18 #include "chromecast/public/media/cast_decoder_buffer.h" | 16 #include "chromecast/public/media/cast_decoder_buffer.h" |
| 17 #include "chromecast/renderer/media/demuxer_stream_adapter.h" |
| 18 #include "chromecast/renderer/media/demuxer_stream_for_test.h" |
| 19 #include "media/base/audio_decoder_config.h" | 19 #include "media/base/audio_decoder_config.h" |
| 20 #include "media/base/decoder_buffer.h" | 20 #include "media/base/decoder_buffer.h" |
| 21 #include "media/base/demuxer_stream.h" | 21 #include "media/base/demuxer_stream.h" |
| 22 #include "media/base/video_decoder_config.h" | 22 #include "media/base/video_decoder_config.h" |
| 23 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 24 | 24 |
| 25 namespace chromecast { | 25 namespace chromecast { |
| 26 namespace media { | 26 namespace media { |
| 27 | 27 |
| 28 class DemuxerStreamAdapterTest : public testing::Test { | 28 class DemuxerStreamAdapterTest : public testing::Test { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 | 65 |
| 66 DemuxerStreamAdapterTest::DemuxerStreamAdapterTest() | 66 DemuxerStreamAdapterTest::DemuxerStreamAdapterTest() |
| 67 : use_post_task_for_flush_(false) { | 67 : use_post_task_for_flush_(false) { |
| 68 } | 68 } |
| 69 | 69 |
| 70 DemuxerStreamAdapterTest::~DemuxerStreamAdapterTest() { | 70 DemuxerStreamAdapterTest::~DemuxerStreamAdapterTest() { |
| 71 } | 71 } |
| 72 | 72 |
| 73 void DemuxerStreamAdapterTest::Initialize( | 73 void DemuxerStreamAdapterTest::Initialize( |
| 74 ::media::DemuxerStream* demuxer_stream) { | 74 ::media::DemuxerStream* demuxer_stream) { |
| 75 coded_frame_provider_.reset(new DemuxerStreamAdapter( | 75 coded_frame_provider_.reset( |
| 76 base::ThreadTaskRunnerHandle::Get(), | 76 new DemuxerStreamAdapter(base::ThreadTaskRunnerHandle::Get(), |
| 77 scoped_refptr<BalancedMediaTaskRunnerFactory>(), demuxer_stream)); | 77 scoped_refptr<BalancedMediaTaskRunnerFactory>(), |
| 78 demuxer_stream)); |
| 78 } | 79 } |
| 79 | 80 |
| 80 void DemuxerStreamAdapterTest::Start() { | 81 void DemuxerStreamAdapterTest::Start() { |
| 81 frame_received_count_ = 0; | 82 frame_received_count_ = 0; |
| 82 | 83 |
| 83 // TODO(damienv): currently, test assertions which fail do not trigger the | 84 // TODO(damienv): currently, test assertions which fail do not trigger the |
| 84 // exit of the unit test, the message loop is still running. Find a different | 85 // exit of the unit test, the message loop is still running. Find a different |
| 85 // way to exit the unit test. | 86 // way to exit the unit test. |
| 86 base::MessageLoop::current()->PostDelayedTask( | 87 base::MessageLoop::current()->PostDelayedTask( |
| 87 FROM_HERE, | 88 FROM_HERE, |
| 88 base::Bind(&DemuxerStreamAdapterTest::OnTestTimeout, | 89 base::Bind(&DemuxerStreamAdapterTest::OnTestTimeout, |
| 89 base::Unretained(this)), | 90 base::Unretained(this)), |
| 90 base::TimeDelta::FromSeconds(5)); | 91 base::TimeDelta::FromSeconds(5)); |
| 91 | 92 |
| 92 coded_frame_provider_->Read( | 93 coded_frame_provider_->Read(base::Bind(&DemuxerStreamAdapterTest::OnNewFrame, |
| 93 base::Bind(&DemuxerStreamAdapterTest::OnNewFrame, | 94 base::Unretained(this))); |
| 94 base::Unretained(this))); | |
| 95 } | 95 } |
| 96 | 96 |
| 97 void DemuxerStreamAdapterTest::OnTestTimeout() { | 97 void DemuxerStreamAdapterTest::OnTestTimeout() { |
| 98 ADD_FAILURE() << "Test timed out"; | 98 ADD_FAILURE() << "Test timed out"; |
| 99 if (base::MessageLoop::current()) | 99 if (base::MessageLoop::current()) |
| 100 base::MessageLoop::current()->QuitWhenIdle(); | 100 base::MessageLoop::current()->QuitWhenIdle(); |
| 101 } | 101 } |
| 102 | 102 |
| 103 void DemuxerStreamAdapterTest::OnNewFrame( | 103 void DemuxerStreamAdapterTest::OnNewFrame( |
| 104 const scoped_refptr<DecoderBufferBase>& buffer, | 104 const scoped_refptr<DecoderBufferBase>& buffer, |
| 105 const ::media::AudioDecoderConfig& audio_config, | 105 const ::media::AudioDecoderConfig& audio_config, |
| 106 const ::media::VideoDecoderConfig& video_config) { | 106 const ::media::VideoDecoderConfig& video_config) { |
| 107 if (video_config.IsValidConfig()) { | 107 if (video_config.IsValidConfig()) { |
| 108 ASSERT_GT(config_idx_.size(), 0u); | 108 ASSERT_GT(config_idx_.size(), 0u); |
| 109 ASSERT_EQ(frame_received_count_, config_idx_.front()); | 109 ASSERT_EQ(frame_received_count_, config_idx_.front()); |
| 110 config_idx_.pop_front(); | 110 config_idx_.pop_front(); |
| 111 } | 111 } |
| 112 | 112 |
| 113 ASSERT_TRUE(buffer.get() != NULL); | 113 ASSERT_TRUE(buffer.get() != NULL); |
| 114 ASSERT_EQ(buffer->timestamp(), | 114 ASSERT_EQ(buffer->timestamp(), |
| 115 base::TimeDelta::FromMilliseconds(40 * frame_received_count_)); | 115 base::TimeDelta::FromMilliseconds(40 * frame_received_count_)); |
| 116 frame_received_count_++; | 116 frame_received_count_++; |
| 117 | 117 |
| 118 if (frame_received_count_ >= total_frames_) { | 118 if (frame_received_count_ >= total_frames_) { |
| 119 coded_frame_provider_->Flush( | 119 coded_frame_provider_->Flush(base::Bind( |
| 120 base::Bind(&DemuxerStreamAdapterTest::OnFlushCompleted, | 120 &DemuxerStreamAdapterTest::OnFlushCompleted, base::Unretained(this))); |
| 121 base::Unretained(this))); | |
| 122 return; | 121 return; |
| 123 } | 122 } |
| 124 | 123 |
| 125 coded_frame_provider_->Read( | 124 coded_frame_provider_->Read(base::Bind(&DemuxerStreamAdapterTest::OnNewFrame, |
| 126 base::Bind(&DemuxerStreamAdapterTest::OnNewFrame, | 125 base::Unretained(this))); |
| 127 base::Unretained(this))); | |
| 128 | 126 |
| 129 ASSERT_LE(frame_received_count_, early_flush_idx_); | 127 ASSERT_LE(frame_received_count_, early_flush_idx_); |
| 130 if (frame_received_count_ == early_flush_idx_) { | 128 if (frame_received_count_ == early_flush_idx_) { |
| 131 base::Closure flush_cb = | 129 base::Closure flush_cb = base::Bind( |
| 132 base::Bind(&DemuxerStreamAdapterTest::OnFlushCompleted, | 130 &DemuxerStreamAdapterTest::OnFlushCompleted, base::Unretained(this)); |
| 133 base::Unretained(this)); | |
| 134 if (use_post_task_for_flush_) { | 131 if (use_post_task_for_flush_) { |
| 135 base::MessageLoop::current()->PostTask( | 132 base::MessageLoop::current()->PostTask( |
| 136 FROM_HERE, | 133 FROM_HERE, |
| 137 base::Bind(&CodedFrameProvider::Flush, | 134 base::Bind(&CodedFrameProvider::Flush, |
| 138 base::Unretained(coded_frame_provider_.get()), | 135 base::Unretained(coded_frame_provider_.get()), |
| 139 flush_cb)); | 136 flush_cb)); |
| 140 } else { | 137 } else { |
| 141 coded_frame_provider_->Flush(flush_cb); | 138 coded_frame_provider_->Flush(flush_cb); |
| 142 } | 139 } |
| 143 return; | 140 return; |
| 144 } | 141 } |
| 145 } | 142 } |
| 146 | 143 |
| 147 void DemuxerStreamAdapterTest::OnFlushCompleted() { | 144 void DemuxerStreamAdapterTest::OnFlushCompleted() { |
| 148 ASSERT_EQ(frame_received_count_, total_expected_frames_); | 145 ASSERT_EQ(frame_received_count_, total_expected_frames_); |
| 149 ASSERT_FALSE(demuxer_stream_->has_pending_read()); | 146 ASSERT_FALSE(demuxer_stream_->has_pending_read()); |
| 150 base::MessageLoop::current()->QuitWhenIdle(); | 147 base::MessageLoop::current()->QuitWhenIdle(); |
| 151 } | 148 } |
| 152 | 149 |
| 153 TEST_F(DemuxerStreamAdapterTest, NoDelay) { | 150 TEST_F(DemuxerStreamAdapterTest, NoDelay) { |
| 154 total_frames_ = 10; | 151 total_frames_ = 10; |
| 155 early_flush_idx_ = total_frames_; // No early flush. | 152 early_flush_idx_ = total_frames_; // No early flush. |
| 156 total_expected_frames_ = 10; | 153 total_expected_frames_ = 10; |
| 157 config_idx_.push_back(0); | 154 config_idx_.push_back(0); |
| 158 config_idx_.push_back(5); | 155 config_idx_.push_back(5); |
| 159 | 156 |
| 160 int cycle_count = 1; | 157 int cycle_count = 1; |
| 161 int delayed_frame_count = 0; | 158 int delayed_frame_count = 0; |
| 162 demuxer_stream_.reset(new DemuxerStreamForTest( | 159 demuxer_stream_.reset(new DemuxerStreamForTest( |
| 163 -1, cycle_count, delayed_frame_count, config_idx_)); | 160 -1, cycle_count, delayed_frame_count, config_idx_)); |
| 164 | 161 |
| 165 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); | 162 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
| 166 Initialize(demuxer_stream_.get()); | 163 Initialize(demuxer_stream_.get()); |
| 167 message_loop->PostTask( | 164 message_loop->PostTask( |
| 168 FROM_HERE, | 165 FROM_HERE, |
| 169 base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); | 166 base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); |
| 170 message_loop->Run(); | 167 message_loop->Run(); |
| 171 } | 168 } |
| 172 | 169 |
| 173 TEST_F(DemuxerStreamAdapterTest, AllDelayed) { | 170 TEST_F(DemuxerStreamAdapterTest, AllDelayed) { |
| 174 total_frames_ = 10; | 171 total_frames_ = 10; |
| 175 early_flush_idx_ = total_frames_; // No early flush. | 172 early_flush_idx_ = total_frames_; // No early flush. |
| 176 total_expected_frames_ = 10; | 173 total_expected_frames_ = 10; |
| 177 config_idx_.push_back(0); | 174 config_idx_.push_back(0); |
| 178 config_idx_.push_back(5); | 175 config_idx_.push_back(5); |
| 179 | 176 |
| 180 int cycle_count = 1; | 177 int cycle_count = 1; |
| 181 int delayed_frame_count = 1; | 178 int delayed_frame_count = 1; |
| 182 demuxer_stream_.reset(new DemuxerStreamForTest( | 179 demuxer_stream_.reset(new DemuxerStreamForTest( |
| 183 -1, cycle_count, delayed_frame_count, config_idx_)); | 180 -1, cycle_count, delayed_frame_count, config_idx_)); |
| 184 | 181 |
| 185 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); | 182 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 206 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); | 203 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
| 207 Initialize(demuxer_stream_.get()); | 204 Initialize(demuxer_stream_.get()); |
| 208 message_loop->PostTask( | 205 message_loop->PostTask( |
| 209 FROM_HERE, | 206 FROM_HERE, |
| 210 base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); | 207 base::Bind(&DemuxerStreamAdapterTest::Start, base::Unretained(this))); |
| 211 message_loop->Run(); | 208 message_loop->Run(); |
| 212 } | 209 } |
| 213 | 210 |
| 214 } // namespace media | 211 } // namespace media |
| 215 } // namespace chromecast | 212 } // namespace chromecast |
| OLD | NEW |