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

Side by Side Diff: media/cast/sender/external_video_encoder_unittest.cc

Issue 868803007: [Cast] Refactor ExternalVideoEncoder for cleaner/simpler encapsulation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add clarification comments and TODOs. Created 5 years, 10 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 <vector> 5 #include <vector>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/ref_counted.h" 8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "media/base/video_frame.h" 10 #include "media/base/video_frame.h"
11 #include "media/cast/cast_defines.h" 11 #include "media/cast/cast_defines.h"
12 #include "media/cast/cast_environment.h" 12 #include "media/cast/cast_environment.h"
13 #include "media/cast/sender/external_video_encoder.h" 13 #include "media/cast/sender/external_video_encoder.h"
14 #include "media/cast/sender/fake_video_encode_accelerator_factory.h"
14 #include "media/cast/test/fake_single_thread_task_runner.h" 15 #include "media/cast/test/fake_single_thread_task_runner.h"
15 #include "media/cast/test/utility/video_utility.h" 16 #include "media/cast/test/utility/video_utility.h"
16 #include "media/video/fake_video_encode_accelerator.h" 17 #include "media/video/fake_video_encode_accelerator.h"
17 #include "testing/gmock/include/gmock/gmock.h" 18 #include "testing/gmock/include/gmock/gmock.h"
18 19
19 namespace media { 20 namespace media {
20 namespace cast { 21 namespace cast {
21 22
22 using testing::_; 23 using testing::_;
23 24
24 namespace { 25 namespace {
25 26
26 void IgnoreInitializationStatus(CastInitializationStatus status) {}
27
28 class VEAFactory {
29 public:
30 VEAFactory(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
31 scoped_ptr<VideoEncodeAccelerator> vea)
32 : task_runner_(task_runner), vea_(vea.Pass()) {}
33
34 void CreateVideoEncodeAccelerator(
35 const ReceiveVideoEncodeAcceleratorCallback& callback) {
36 create_cb_ = callback;
37 }
38
39 void FinishCreatingVideoEncodeAccelerator() {
40 create_cb_.Run(task_runner_, vea_.Pass());
41 }
42
43 private:
44 const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
45 scoped_ptr<VideoEncodeAccelerator> vea_;
46 ReceiveVideoEncodeAcceleratorCallback create_cb_;
47 };
48
49 void CreateSharedMemory(
50 size_t size, const ReceiveVideoEncodeMemoryCallback& callback) {
51 scoped_ptr<base::SharedMemory> shm(new base::SharedMemory());
52 if (!shm->CreateAndMapAnonymous(size)) {
53 NOTREACHED();
54 return;
55 }
56 callback.Run(shm.Pass());
57 }
58
59 class TestVideoEncoderCallback 27 class TestVideoEncoderCallback
60 : public base::RefCountedThreadSafe<TestVideoEncoderCallback> { 28 : public base::RefCountedThreadSafe<TestVideoEncoderCallback> {
61 public: 29 public:
62 TestVideoEncoderCallback() {} 30 TestVideoEncoderCallback() {}
63 31
64 void SetExpectedResult(uint32 expected_frame_id, 32 void SetExpectedResult(uint32 expected_frame_id,
65 uint32 expected_last_referenced_frame_id, 33 uint32 expected_last_referenced_frame_id,
66 uint32 expected_rtp_timestamp, 34 uint32 expected_rtp_timestamp,
67 const base::TimeTicks& expected_reference_time) { 35 const base::TimeTicks& expected_reference_time) {
68 expected_frame_id_ = expected_frame_id; 36 expected_frame_id_ = expected_frame_id;
(...skipping 28 matching lines...) Expand all
97 uint32 expected_rtp_timestamp_; 65 uint32 expected_rtp_timestamp_;
98 base::TimeTicks expected_reference_time_; 66 base::TimeTicks expected_reference_time_;
99 67
100 DISALLOW_COPY_AND_ASSIGN(TestVideoEncoderCallback); 68 DISALLOW_COPY_AND_ASSIGN(TestVideoEncoderCallback);
101 }; 69 };
102 } // namespace 70 } // namespace
103 71
104 class ExternalVideoEncoderTest : public ::testing::Test { 72 class ExternalVideoEncoderTest : public ::testing::Test {
105 protected: 73 protected:
106 ExternalVideoEncoderTest() 74 ExternalVideoEncoderTest()
107 : test_video_encoder_callback_(new TestVideoEncoderCallback()) { 75 : testing_clock_(new base::SimpleTestTickClock()),
76 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
77 cast_environment_(new CastEnvironment(
78 scoped_ptr<base::TickClock>(testing_clock_).Pass(),
79 task_runner_,
80 task_runner_,
81 task_runner_)),
82 vea_factory_(task_runner_),
83 init_status_(STATUS_VIDEO_UNINITIALIZED),
84 test_video_encoder_callback_(new TestVideoEncoderCallback()) {
85 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
86
108 video_config_.ssrc = 1; 87 video_config_.ssrc = 1;
109 video_config_.receiver_ssrc = 2; 88 video_config_.receiver_ssrc = 2;
110 video_config_.rtp_payload_type = 127; 89 video_config_.rtp_payload_type = 127;
111 video_config_.use_external_encoder = true; 90 video_config_.use_external_encoder = true;
112 video_config_.width = 320;
113 video_config_.height = 240;
114 video_config_.max_bitrate = 5000000; 91 video_config_.max_bitrate = 5000000;
115 video_config_.min_bitrate = 1000000; 92 video_config_.min_bitrate = 1000000;
116 video_config_.start_bitrate = 2000000; 93 video_config_.start_bitrate = 2000000;
117 video_config_.max_qp = 56; 94 video_config_.max_qp = 56;
118 video_config_.min_qp = 0; 95 video_config_.min_qp = 0;
119 video_config_.max_frame_rate = 30; 96 video_config_.max_frame_rate = 30;
120 video_config_.max_number_of_video_buffers_used = 3; 97 video_config_.max_number_of_video_buffers_used = 3;
121 video_config_.codec = CODEC_VIDEO_VP8; 98 video_config_.codec = CODEC_VIDEO_VP8;
122 gfx::Size size(video_config_.width, video_config_.height); 99 const gfx::Size size(320, 240);
123 video_frame_ = media::VideoFrame::CreateFrame( 100 video_frame_ = media::VideoFrame::CreateFrame(
124 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); 101 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta());
125 PopulateVideoFrame(video_frame_.get(), 123); 102 PopulateVideoFrame(video_frame_.get(), 123);
126 103
127 testing_clock_ = new base::SimpleTestTickClock();
128 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
129 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_);
130 cast_environment_ =
131 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(),
132 task_runner_,
133 task_runner_,
134 task_runner_);
135
136 fake_vea_ = new media::FakeVideoEncodeAccelerator(task_runner_);
137 scoped_ptr<VideoEncodeAccelerator> fake_vea(fake_vea_);
138 VEAFactory vea_factory(task_runner_, fake_vea.Pass());
139 video_encoder_.reset(new ExternalVideoEncoder( 104 video_encoder_.reset(new ExternalVideoEncoder(
140 cast_environment_, 105 cast_environment_,
141 video_config_, 106 video_config_,
142 base::Bind(&IgnoreInitializationStatus), 107 size,
143 base::Bind(&VEAFactory::CreateVideoEncodeAccelerator, 108 base::Bind(&ExternalVideoEncoderTest::SaveInitializationStatus,
144 base::Unretained(&vea_factory)), 109 base::Unretained(this)),
145 base::Bind(&CreateSharedMemory))); 110 base::Bind(
146 vea_factory.FinishCreatingVideoEncodeAccelerator(); 111 &FakeVideoEncodeAcceleratorFactory::CreateVideoEncodeAccelerator,
112 base::Unretained(&vea_factory_)),
113 base::Bind(&FakeVideoEncodeAcceleratorFactory::CreateSharedMemory,
114 base::Unretained(&vea_factory_))));
147 } 115 }
148 116
149 ~ExternalVideoEncoderTest() override {} 117 ~ExternalVideoEncoderTest() override {}
150 118
151 void AdvanceClockAndVideoFrameTimestamp() { 119 void AdvanceClockAndVideoFrameTimestamp() {
152 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(33)); 120 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(33));
153 video_frame_->set_timestamp( 121 video_frame_->set_timestamp(
154 video_frame_->timestamp() + base::TimeDelta::FromMilliseconds(33)); 122 video_frame_->timestamp() + base::TimeDelta::FromMilliseconds(33));
155 } 123 }
156 124
157 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. 125 void SaveInitializationStatus(CastInitializationStatus result) {
158 media::FakeVideoEncodeAccelerator* fake_vea_; // Owned by video_encoder_. 126 EXPECT_EQ(STATUS_VIDEO_UNINITIALIZED, init_status_);
127 init_status_ = result;
128 }
129
130 base::SimpleTestTickClock* const testing_clock_; // Owned by CastEnvironment.
131 const scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
132 const scoped_refptr<CastEnvironment> cast_environment_;
133 FakeVideoEncodeAcceleratorFactory vea_factory_;
134 CastInitializationStatus init_status_;
159 scoped_refptr<TestVideoEncoderCallback> test_video_encoder_callback_; 135 scoped_refptr<TestVideoEncoderCallback> test_video_encoder_callback_;
160 VideoSenderConfig video_config_; 136 VideoSenderConfig video_config_;
161 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
162 scoped_ptr<VideoEncoder> video_encoder_; 137 scoped_ptr<VideoEncoder> video_encoder_;
163 scoped_refptr<media::VideoFrame> video_frame_; 138 scoped_refptr<media::VideoFrame> video_frame_;
164 scoped_refptr<CastEnvironment> cast_environment_;
165 139
166 DISALLOW_COPY_AND_ASSIGN(ExternalVideoEncoderTest); 140 DISALLOW_COPY_AND_ASSIGN(ExternalVideoEncoderTest);
167 }; 141 };
168 142
169 TEST_F(ExternalVideoEncoderTest, EncodePattern30fpsRunningOutOfAck) { 143 TEST_F(ExternalVideoEncoderTest, EncodePattern30fpsRunningOutOfAck) {
144 vea_factory_.SetAutoRespond(true);
170 task_runner_->RunTasks(); // Run the initializer on the correct thread. 145 task_runner_->RunTasks(); // Run the initializer on the correct thread.
146 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, init_status_);
171 147
172 VideoEncoder::FrameEncodedCallback frame_encoded_callback = 148 VideoEncoder::FrameEncodedCallback frame_encoded_callback =
173 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, 149 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame,
174 test_video_encoder_callback_.get()); 150 test_video_encoder_callback_.get());
175 151
176 test_video_encoder_callback_->SetExpectedResult( 152 test_video_encoder_callback_->SetExpectedResult(
177 0, 0, TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency), 153 0, 0, TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
178 testing_clock_->NowTicks()); 154 testing_clock_->NowTicks());
179 video_encoder_->SetBitRate(2000); 155 video_encoder_->SetBitRate(2000);
180 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( 156 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
181 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback)); 157 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
182 task_runner_->RunTasks(); 158 task_runner_->RunTasks();
183 159
184 for (int i = 0; i < 6; ++i) { 160 for (int i = 0; i < 6; ++i) {
185 AdvanceClockAndVideoFrameTimestamp(); 161 AdvanceClockAndVideoFrameTimestamp();
186 test_video_encoder_callback_->SetExpectedResult( 162 test_video_encoder_callback_->SetExpectedResult(
187 i + 1, 163 i + 1,
188 i, 164 i,
189 TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency), 165 TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
190 testing_clock_->NowTicks()); 166 testing_clock_->NowTicks());
191 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( 167 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
192 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback)); 168 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
193 task_runner_->RunTasks(); 169 task_runner_->RunTasks();
194 } 170 }
195 ASSERT_EQ(1u, fake_vea_->stored_bitrates().size()); 171
196 EXPECT_EQ(2000u, fake_vea_->stored_bitrates()[0]); 172 ASSERT_EQ(1u, vea_factory_.last_response_vea()->stored_bitrates().size());
173 EXPECT_EQ(2000u, vea_factory_.last_response_vea()->stored_bitrates()[0]);
197 174
198 // We need to run the task to cleanup the GPU instance. 175 // We need to run the task to cleanup the GPU instance.
199 video_encoder_.reset(NULL); 176 video_encoder_.reset(NULL);
200 task_runner_->RunTasks(); 177 task_runner_->RunTasks();
178
179 EXPECT_EQ(1, vea_factory_.vea_response_count());
180 EXPECT_EQ(3, vea_factory_.shm_response_count());
201 } 181 }
202 182
203 TEST_F(ExternalVideoEncoderTest, StreamHeader) { 183 TEST_F(ExternalVideoEncoderTest, StreamHeader) {
184 vea_factory_.SetAutoRespond(true);
204 task_runner_->RunTasks(); // Run the initializer on the correct thread. 185 task_runner_->RunTasks(); // Run the initializer on the correct thread.
186 EXPECT_EQ(STATUS_VIDEO_INITIALIZED, init_status_);
205 187
206 VideoEncoder::FrameEncodedCallback frame_encoded_callback = 188 VideoEncoder::FrameEncodedCallback frame_encoded_callback =
207 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, 189 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame,
208 test_video_encoder_callback_.get()); 190 test_video_encoder_callback_.get());
209 191
210 // Force the FakeVideoEncodeAccelerator to return a dummy non-key frame first. 192 // Force the FakeVideoEncodeAccelerator to return a dummy non-key frame first.
211 fake_vea_->SendDummyFrameForTesting(false); 193 vea_factory_.last_response_vea()->SendDummyFrameForTesting(false);
212 194
213 // Verify the first returned bitstream buffer is still a key frame. 195 // Verify the first returned bitstream buffer is still a key frame.
214 test_video_encoder_callback_->SetExpectedResult( 196 test_video_encoder_callback_->SetExpectedResult(
215 0, 0, TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency), 197 0, 0, TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
216 testing_clock_->NowTicks()); 198 testing_clock_->NowTicks());
217 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( 199 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
218 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback)); 200 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
219 task_runner_->RunTasks(); 201 task_runner_->RunTasks();
220 202
221 // We need to run the task to cleanup the GPU instance. 203 // We need to run the task to cleanup the GPU instance.
222 video_encoder_.reset(NULL); 204 video_encoder_.reset(NULL);
223 task_runner_->RunTasks(); 205 task_runner_->RunTasks();
206
207 EXPECT_EQ(1, vea_factory_.vea_response_count());
208 EXPECT_EQ(3, vea_factory_.shm_response_count());
224 } 209 }
225 210
226 // Verify that everything goes well even if ExternalVideoEncoder is destroyed 211 // Verify that everything goes well even if ExternalVideoEncoder is destroyed
227 // before it has a chance to receive the VEA creation callback. 212 // before it has a chance to receive the VEA creation callback.
228 TEST(ExternalVideoEncoderEarlyDestroyTest, DestroyBeforeVEACreatedCallback) { 213 TEST_F(ExternalVideoEncoderTest, DestroyBeforeVEACreatedCallback) {
229 VideoSenderConfig video_config; 214 video_encoder_.reset();
230 base::SimpleTestTickClock* testing_clock = new base::SimpleTestTickClock(); 215 EXPECT_EQ(0, vea_factory_.vea_response_count());
231 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner( 216 vea_factory_.SetAutoRespond(true);
232 new test::FakeSingleThreadTaskRunner(testing_clock)); 217 task_runner_->RunTasks();
233 scoped_refptr<CastEnvironment> cast_environment( 218 EXPECT_EQ(1, vea_factory_.vea_response_count());
234 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock).Pass(), 219 EXPECT_EQ(STATUS_VIDEO_UNINITIALIZED, init_status_);
235 task_runner,
236 task_runner,
237 task_runner));
238
239 scoped_ptr<VideoEncodeAccelerator> fake_vea(
240 new media::FakeVideoEncodeAccelerator(task_runner));
241 VEAFactory vea_factory(task_runner, fake_vea.Pass());
242
243 scoped_ptr<ExternalVideoEncoder> video_encoder(new ExternalVideoEncoder(
244 cast_environment,
245 video_config,
246 base::Bind(&IgnoreInitializationStatus),
247 base::Bind(&VEAFactory::CreateVideoEncodeAccelerator,
248 base::Unretained(&vea_factory)),
249 base::Bind(&CreateSharedMemory)));
250
251 video_encoder.reset();
252 vea_factory.FinishCreatingVideoEncodeAccelerator();
253 task_runner->RunTasks();
254 } 220 }
255 221
256 } // namespace cast 222 } // namespace cast
257 } // namespace media 223 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/sender/external_video_encoder.cc ('k') | media/cast/sender/fake_video_encode_accelerator_factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698