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

Side by Side Diff: chromecast/media/cma/ipc_streamer/av_streamer_unittest.cc

Issue 557333003: Audio/video data streaming over shared memory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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
OLDNEW
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 #include <vector> 6 #include <vector>
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.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/buffering_frame_provider.h"
15 #include "chromecast/media/cma/base/decoder_buffer_base.h" 14 #include "chromecast/media/cma/base/decoder_buffer_base.h"
16 #include "chromecast/media/cma/base/frame_generator_for_test.h" 15 #include "chromecast/media/cma/base/frame_generator_for_test.h"
17 #include "chromecast/media/cma/base/mock_frame_consumer.h" 16 #include "chromecast/media/cma/base/mock_frame_consumer.h"
18 #include "chromecast/media/cma/base/mock_frame_provider.h" 17 #include "chromecast/media/cma/base/mock_frame_provider.h"
18 #include "chromecast/media/cma/ipc/media_memory_chunk.h"
19 #include "chromecast/media/cma/ipc/media_message_fifo.h"
20 #include "chromecast/media/cma/ipc_streamer/av_streamer_proxy.h"
21 #include "chromecast/media/cma/ipc_streamer/coded_frame_provider_host.h"
19 #include "media/base/audio_decoder_config.h" 22 #include "media/base/audio_decoder_config.h"
20 #include "media/base/decoder_buffer.h" 23 #include "media/base/decoder_buffer.h"
21 #include "media/base/video_decoder_config.h" 24 #include "media/base/video_decoder_config.h"
22 #include "testing/gtest/include/gtest/gtest.h" 25 #include "testing/gtest/include/gtest/gtest.h"
23 26
24 namespace chromecast { 27 namespace chromecast {
25 namespace media { 28 namespace media {
26 29
27 class BufferingFrameProviderTest : public testing::Test { 30 namespace {
31
32 class FifoMemoryChunk : public MediaMemoryChunk {
28 public: 33 public:
29 BufferingFrameProviderTest(); 34 FifoMemoryChunk(void* mem, size_t size)
30 virtual ~BufferingFrameProviderTest(); 35 : mem_(mem), size_(size) {}
36 virtual ~FifoMemoryChunk() {}
31 37
32 // Setup the test. 38 virtual void* data() const OVERRIDE { return mem_; }
39 virtual size_t size() const OVERRIDE { return size_; }
40 virtual bool valid() const OVERRIDE { return true; }
41
42 private:
43 void* mem_;
44 size_t size_;
45
46 DISALLOW_COPY_AND_ASSIGN(FifoMemoryChunk);
47 };
48
49 } // namespace
50
51 class AvStreamerTest : public testing::Test {
52 public:
53 AvStreamerTest();
54 virtual ~AvStreamerTest();
55
56 // Setups the test.
33 void Configure( 57 void Configure(
34 size_t frame_count, 58 size_t frame_count,
35 const std::vector<bool>& provider_delayed_pattern, 59 const std::vector<bool>& provider_delayed_pattern,
36 const std::vector<bool>& consumer_delayed_pattern); 60 const std::vector<bool>& consumer_delayed_pattern);
37 61
38 // Start the test. 62 // Starts the test.
39 void Start(); 63 void Start();
40 64
41 protected: 65 protected:
42 scoped_ptr<BufferingFrameProvider> buffering_frame_provider_; 66 scoped_ptr<uint64[]> fifo_mem_;
67
68 scoped_ptr<AvStreamerProxy> av_buffer_proxy_;
69 scoped_ptr<CodedFrameProviderHost> coded_frame_provider_host_;
43 scoped_ptr<MockFrameConsumer> frame_consumer_; 70 scoped_ptr<MockFrameConsumer> frame_consumer_;
44 71
45 private: 72 private:
46 void OnTestTimeout(); 73 void OnTestTimeout();
47 void OnTestCompleted(); 74 void OnTestCompleted();
48 75
49 DISALLOW_COPY_AND_ASSIGN(BufferingFrameProviderTest); 76 void OnFifoRead();
77 void OnFifoWrite();
78
79 DISALLOW_COPY_AND_ASSIGN(AvStreamerTest);
50 }; 80 };
51 81
52 BufferingFrameProviderTest::BufferingFrameProviderTest() { 82 AvStreamerTest::AvStreamerTest() {
53 } 83 }
54 84
55 BufferingFrameProviderTest::~BufferingFrameProviderTest() { 85 AvStreamerTest::~AvStreamerTest() {
56 } 86 }
57 87
58 void BufferingFrameProviderTest::Configure( 88 void AvStreamerTest::Configure(
59 size_t frame_count, 89 size_t frame_count,
60 const std::vector<bool>& provider_delayed_pattern, 90 const std::vector<bool>& provider_delayed_pattern,
61 const std::vector<bool>& consumer_delayed_pattern) { 91 const std::vector<bool>& consumer_delayed_pattern) {
62 DCHECK_GE(frame_count, 1u);
63
64 // Frame generation on the producer and consumer side. 92 // Frame generation on the producer and consumer side.
65 std::vector<FrameGeneratorForTest::FrameSpec> frame_specs(frame_count); 93 std::vector<FrameGeneratorForTest::FrameSpec> frame_specs;
94 frame_specs.resize(frame_count);
66 for (size_t k = 0; k < frame_specs.size() - 1; k++) { 95 for (size_t k = 0; k < frame_specs.size() - 1; k++) {
67 frame_specs[k].has_config = (k == 0); 96 frame_specs[k].has_config = (k == 0);
68 frame_specs[k].timestamp = base::TimeDelta::FromMilliseconds(40) * k; 97 frame_specs[k].timestamp = base::TimeDelta::FromMilliseconds(40) * k;
69 frame_specs[k].size = 512; 98 frame_specs[k].size = 512;
70 frame_specs[k].has_decrypt_config = ((k % 3) == 0); 99 frame_specs[k].has_decrypt_config = ((k % 3) == 0);
71 } 100 }
72 frame_specs[frame_specs.size() - 1].is_eos = true; 101 frame_specs[frame_specs.size() - 1].is_eos = true;
73 102
74 scoped_ptr<FrameGeneratorForTest> frame_generator_provider( 103 scoped_ptr<FrameGeneratorForTest> frame_generator_provider(
75 new FrameGeneratorForTest(frame_specs)); 104 new FrameGeneratorForTest(frame_specs));
76 scoped_ptr<FrameGeneratorForTest> frame_generator_consumer( 105 scoped_ptr<FrameGeneratorForTest> frame_generator_consumer(
77 new FrameGeneratorForTest(frame_specs)); 106 new FrameGeneratorForTest(frame_specs));
78 107
79 scoped_ptr<MockFrameProvider> frame_provider(new MockFrameProvider()); 108 scoped_ptr<MockFrameProvider> frame_provider(new MockFrameProvider());
80 frame_provider->Configure(provider_delayed_pattern, 109 frame_provider->Configure(provider_delayed_pattern,
81 frame_generator_provider.Pass()); 110 frame_generator_provider.Pass());
82 111
83 size_t max_frame_size = 10 * 1024; 112 size_t fifo_size_div_8 = 512;
84 size_t buffer_size = 10 * max_frame_size; 113 fifo_mem_.reset(new uint64[fifo_size_div_8]);
85 buffering_frame_provider_.reset( 114 scoped_ptr<MediaMessageFifo> producer_fifo(
86 new BufferingFrameProvider( 115 new MediaMessageFifo(
87 scoped_ptr<CodedFrameProvider>(frame_provider.release()), 116 scoped_ptr<MediaMemoryChunk>(
88 buffer_size, 117 new FifoMemoryChunk(&fifo_mem_[0], fifo_size_div_8 * 8)),
89 max_frame_size, 118 true));
90 BufferingFrameProvider::FrameBufferedCB())); 119 scoped_ptr<MediaMessageFifo> consumer_fifo(
120 new MediaMessageFifo(
121 scoped_ptr<MediaMemoryChunk>(
122 new FifoMemoryChunk(&fifo_mem_[0], fifo_size_div_8 * 8)),
123 false));
124 producer_fifo->ObserveWriteActivity(
125 base::Bind(&AvStreamerTest::OnFifoWrite, base::Unretained(this)));
126 consumer_fifo->ObserveReadActivity(
127 base::Bind(&AvStreamerTest::OnFifoRead, base::Unretained(this)));
128
129 av_buffer_proxy_.reset(
130 new AvStreamerProxy());
131 av_buffer_proxy_->SetCodedFrameProvider(
132 scoped_ptr<CodedFrameProvider>(frame_provider.release()));
133 av_buffer_proxy_->SetMediaMessageFifo(producer_fifo.Pass());
134
135 coded_frame_provider_host_.reset(
136 new CodedFrameProviderHost(consumer_fifo.Pass()));
91 137
92 frame_consumer_.reset( 138 frame_consumer_.reset(
93 new MockFrameConsumer(buffering_frame_provider_.get())); 139 new MockFrameConsumer(coded_frame_provider_host_.get()));
94 frame_consumer_->Configure( 140 frame_consumer_->Configure(
95 consumer_delayed_pattern, 141 consumer_delayed_pattern,
96 false, 142 false,
97 frame_generator_consumer.Pass()); 143 frame_generator_consumer.Pass());
98 } 144 }
99 145
100 void BufferingFrameProviderTest::Start() { 146 void AvStreamerTest::Start() {
147 base::MessageLoopProxy::current()->PostTask(
148 FROM_HERE,
149 base::Bind(&AvStreamerProxy::Start,
150 base::Unretained(av_buffer_proxy_.get())));
151
101 frame_consumer_->Start( 152 frame_consumer_->Start(
102 base::Bind(&BufferingFrameProviderTest::OnTestCompleted, 153 base::Bind(&AvStreamerTest::OnTestCompleted,
103 base::Unretained(this))); 154 base::Unretained(this)));
104 } 155 }
105 156
106 void BufferingFrameProviderTest::OnTestTimeout() { 157 void AvStreamerTest::OnTestTimeout() {
107 ADD_FAILURE() << "Test timed out"; 158 ADD_FAILURE() << "Test timed out";
108 if (base::MessageLoop::current()) 159 if (base::MessageLoop::current())
109 base::MessageLoop::current()->QuitWhenIdle(); 160 base::MessageLoop::current()->QuitWhenIdle();
110 } 161 }
111 162
112 void BufferingFrameProviderTest::OnTestCompleted() { 163 void AvStreamerTest::OnTestCompleted() {
113 base::MessageLoop::current()->QuitWhenIdle(); 164 base::MessageLoop::current()->QuitWhenIdle();
114 } 165 }
115 166
116 TEST_F(BufferingFrameProviderTest, FastProviderSlowConsumer) { 167 void AvStreamerTest::OnFifoWrite() {
168 base::MessageLoopProxy::current()->PostTask(
169 FROM_HERE,
170 base::Bind(&CodedFrameProviderHost::OnFifoWriteEvent,
171 base::Unretained(coded_frame_provider_host_.get())));
172 }
173
174 void AvStreamerTest::OnFifoRead() {
175 base::MessageLoopProxy::current()->PostTask(
176 FROM_HERE,
177 base::Bind(&AvStreamerProxy::OnFifoReadEvent,
178 base::Unretained(av_buffer_proxy_.get())));
179 }
180
181 TEST_F(AvStreamerTest, FastProviderSlowConsumer) {
182 size_t frame_count = 100;
117 bool provider_delayed_pattern[] = { false }; 183 bool provider_delayed_pattern[] = { false };
118 bool consumer_delayed_pattern[] = { true }; 184 bool consumer_delayed_pattern[] = { true };
119 185
120 const size_t frame_count = 100u;
121 Configure( 186 Configure(
122 frame_count, 187 frame_count,
123 std::vector<bool>( 188 std::vector<bool>(
124 provider_delayed_pattern, 189 provider_delayed_pattern,
125 provider_delayed_pattern + arraysize(provider_delayed_pattern)), 190 provider_delayed_pattern + arraysize(provider_delayed_pattern)),
126 std::vector<bool>( 191 std::vector<bool>(
127 consumer_delayed_pattern, 192 consumer_delayed_pattern,
128 consumer_delayed_pattern + arraysize(consumer_delayed_pattern))); 193 consumer_delayed_pattern + arraysize(consumer_delayed_pattern)));
129 194
130 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); 195 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
131 message_loop->PostTask( 196 message_loop->PostTask(
132 FROM_HERE, 197 FROM_HERE,
133 base::Bind(&BufferingFrameProviderTest::Start, base::Unretained(this))); 198 base::Bind(&AvStreamerTest::Start, base::Unretained(this)));
134 message_loop->Run(); 199 message_loop->Run();
135 }; 200 };
136 201
137 TEST_F(BufferingFrameProviderTest, SlowProviderFastConsumer) { 202 TEST_F(AvStreamerTest, SlowProviderFastConsumer) {
203 size_t frame_count = 100;
gunsch 2014/09/10 18:51:37 Chromium review picked up the diff between this an
damienv1 2014/09/10 21:24:54 Done.
138 bool provider_delayed_pattern[] = { true }; 204 bool provider_delayed_pattern[] = { true };
139 bool consumer_delayed_pattern[] = { false }; 205 bool consumer_delayed_pattern[] = { false };
140 206
141 const size_t frame_count = 100u;
142 Configure( 207 Configure(
143 frame_count, 208 frame_count,
144 std::vector<bool>( 209 std::vector<bool>(
145 provider_delayed_pattern, 210 provider_delayed_pattern,
146 provider_delayed_pattern + arraysize(provider_delayed_pattern)), 211 provider_delayed_pattern + arraysize(provider_delayed_pattern)),
147 std::vector<bool>( 212 std::vector<bool>(
148 consumer_delayed_pattern, 213 consumer_delayed_pattern,
149 consumer_delayed_pattern + arraysize(consumer_delayed_pattern))); 214 consumer_delayed_pattern + arraysize(consumer_delayed_pattern)));
150 215
151 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); 216 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
152 message_loop->PostTask( 217 message_loop->PostTask(
153 FROM_HERE, 218 FROM_HERE,
154 base::Bind(&BufferingFrameProviderTest::Start, base::Unretained(this))); 219 base::Bind(&AvStreamerTest::Start, base::Unretained(this)));
155 message_loop->Run(); 220 message_loop->Run();
156 }; 221 };
157 222
158 TEST_F(BufferingFrameProviderTest, SlowFastProducerConsumer) { 223 TEST_F(AvStreamerTest, SlowFastProducerConsumer) {
159 // Lengths are prime between each other so we can test a lot of combinations. 224 size_t frame_count = 100;
225
226 // Pattern lengths are prime between each other
227 // so that a lot of combinations can be tested.
160 bool provider_delayed_pattern[] = { 228 bool provider_delayed_pattern[] = {
161 true, true, true, true, true, 229 true, true, true, true, true,
162 false, false, false, false 230 false, false, false, false
163 }; 231 };
164 bool consumer_delayed_pattern[] = { 232 bool consumer_delayed_pattern[] = {
165 true, true, true, true, true, true, true, 233 true, true, true, true, true, true, true,
166 false, false, false, false, false, false, false 234 false, false, false, false, false, false, false
167 }; 235 };
168 236
169 const size_t frame_count = 100u;
170 Configure( 237 Configure(
171 frame_count, 238 frame_count,
172 std::vector<bool>( 239 std::vector<bool>(
173 provider_delayed_pattern, 240 provider_delayed_pattern,
174 provider_delayed_pattern + arraysize(provider_delayed_pattern)), 241 provider_delayed_pattern + arraysize(provider_delayed_pattern)),
175 std::vector<bool>( 242 std::vector<bool>(
176 consumer_delayed_pattern, 243 consumer_delayed_pattern,
177 consumer_delayed_pattern + arraysize(consumer_delayed_pattern))); 244 consumer_delayed_pattern + arraysize(consumer_delayed_pattern)));
178 245
179 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); 246 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
180 message_loop->PostTask( 247 message_loop->PostTask(
181 FROM_HERE, 248 FROM_HERE,
182 base::Bind(&BufferingFrameProviderTest::Start, base::Unretained(this))); 249 base::Bind(&AvStreamerTest::Start, base::Unretained(this)));
183 message_loop->Run(); 250 message_loop->Run();
184 }; 251 };
185 252
186 } // namespace media 253 } // namespace media
187 } // namespace chromecast 254 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698