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

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: Address CR comments from patch set #1. 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);
gunsch 2014/09/11 03:09:52 Nit: I realize it's not this CL, but I think this
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) {
117 bool provider_delayed_pattern[] = { false }; 182 bool provider_delayed_pattern[] = { false };
118 bool consumer_delayed_pattern[] = { true }; 183 bool consumer_delayed_pattern[] = { true };
119 184
120 const size_t frame_count = 100u; 185 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) {
138 bool provider_delayed_pattern[] = { true }; 203 bool provider_delayed_pattern[] = { true };
139 bool consumer_delayed_pattern[] = { false }; 204 bool consumer_delayed_pattern[] = { false };
140 205
141 const size_t frame_count = 100u; 206 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 // Pattern lengths are prime between each other
225 // so that a lot of combinations can be tested.
160 bool provider_delayed_pattern[] = { 226 bool provider_delayed_pattern[] = {
161 true, true, true, true, true, 227 true, true, true, true, true,
162 false, false, false, false 228 false, false, false, false
163 }; 229 };
164 bool consumer_delayed_pattern[] = { 230 bool consumer_delayed_pattern[] = {
165 true, true, true, true, true, true, true, 231 true, true, true, true, true, true, true,
166 false, false, false, false, false, false, false 232 false, false, false, false, false, false, false
167 }; 233 };
168 234
169 const size_t frame_count = 100u; 235 const size_t frame_count = 100u;
170 Configure( 236 Configure(
171 frame_count, 237 frame_count,
172 std::vector<bool>( 238 std::vector<bool>(
173 provider_delayed_pattern, 239 provider_delayed_pattern,
174 provider_delayed_pattern + arraysize(provider_delayed_pattern)), 240 provider_delayed_pattern + arraysize(provider_delayed_pattern)),
175 std::vector<bool>( 241 std::vector<bool>(
176 consumer_delayed_pattern, 242 consumer_delayed_pattern,
177 consumer_delayed_pattern + arraysize(consumer_delayed_pattern))); 243 consumer_delayed_pattern + arraysize(consumer_delayed_pattern)));
178 244
179 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); 245 scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop());
180 message_loop->PostTask( 246 message_loop->PostTask(
181 FROM_HERE, 247 FROM_HERE,
182 base::Bind(&BufferingFrameProviderTest::Start, base::Unretained(this))); 248 base::Bind(&AvStreamerTest::Start, base::Unretained(this)));
183 message_loop->Run(); 249 message_loop->Run();
184 }; 250 };
185 251
186 } // namespace media 252 } // namespace media
187 } // namespace chromecast 253 } // namespace chromecast
OLDNEW
« no previous file with comments | « chromecast/media/cma/ipc_streamer/av_streamer_proxy.cc ('k') | chromecast/media/cma/ipc_streamer/coded_frame_provider_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698