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

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

Issue 899583002: Revert of [Cast] Software encoder support for varying video frame sizes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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
« no previous file with comments | « media/cast/sender/video_encoder_impl.cc ('k') | media/cast/sender/video_sender.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/video_encoder_impl.h" 13 #include "media/cast/sender/video_encoder_impl.h"
14 #include "media/cast/test/fake_single_thread_task_runner.h" 14 #include "media/cast/test/fake_single_thread_task_runner.h"
15 #include "media/cast/test/utility/default_config.h" 15 #include "media/cast/test/utility/default_config.h"
16 #include "media/cast/test/utility/video_utility.h" 16 #include "media/cast/test/utility/video_utility.h"
17 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gmock/include/gmock/gmock.h"
18 18
19 namespace media { 19 namespace media {
20 namespace cast { 20 namespace cast {
21 21
22 class VideoEncoderImplTest : public ::testing::TestWithParam<Codec> { 22 using testing::_;
23
24 namespace {
25 class TestVideoEncoderCallback
26 : public base::RefCountedThreadSafe<TestVideoEncoderCallback> {
27 public:
28 explicit TestVideoEncoderCallback(bool multiple_buffer_mode)
29 : multiple_buffer_mode_(multiple_buffer_mode),
30 count_frames_delivered_(0) {}
31
32 int count_frames_delivered() const {
33 return count_frames_delivered_;
34 }
35
36 void SetExpectedResult(uint32 expected_frame_id,
37 uint32 expected_last_referenced_frame_id,
38 uint32 expected_rtp_timestamp,
39 const base::TimeTicks& expected_reference_time) {
40 expected_frame_id_ = expected_frame_id;
41 expected_last_referenced_frame_id_ = expected_last_referenced_frame_id;
42 expected_rtp_timestamp_ = expected_rtp_timestamp;
43 expected_reference_time_ = expected_reference_time;
44 }
45
46 void DeliverEncodedVideoFrame(
47 scoped_ptr<EncodedFrame> encoded_frame) {
48 if (expected_frame_id_ != expected_last_referenced_frame_id_) {
49 EXPECT_EQ(EncodedFrame::DEPENDENT, encoded_frame->dependency);
50 } else if (!multiple_buffer_mode_) {
51 EXPECT_EQ(EncodedFrame::KEY, encoded_frame->dependency);
52 }
53 EXPECT_EQ(expected_frame_id_, encoded_frame->frame_id);
54 EXPECT_EQ(expected_last_referenced_frame_id_,
55 encoded_frame->referenced_frame_id)
56 << "frame id: " << expected_frame_id_;
57 EXPECT_EQ(expected_rtp_timestamp_, encoded_frame->rtp_timestamp);
58 EXPECT_EQ(expected_reference_time_, encoded_frame->reference_time);
59 EXPECT_FALSE(encoded_frame->data.empty());
60 ++count_frames_delivered_;
61 }
62
63 private:
64 friend class base::RefCountedThreadSafe<TestVideoEncoderCallback>;
65 virtual ~TestVideoEncoderCallback() {}
66
67 const bool multiple_buffer_mode_;
68 int count_frames_delivered_;
69
70 uint32 expected_frame_id_;
71 uint32 expected_last_referenced_frame_id_;
72 uint32 expected_rtp_timestamp_;
73 base::TimeTicks expected_reference_time_;
74
75 DISALLOW_COPY_AND_ASSIGN(TestVideoEncoderCallback);
76 };
77 } // namespace
78
79 class VideoEncoderImplTest : public ::testing::Test {
23 protected: 80 protected:
24 VideoEncoderImplTest() 81 VideoEncoderImplTest() {
25 : testing_clock_(new base::SimpleTestTickClock()), 82 video_config_ = GetDefaultVideoSenderConfig();
26 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), 83 video_config_.codec = CODEC_VIDEO_VP8;
27 cast_environment_(new CastEnvironment( 84 gfx::Size size(video_config_.width, video_config_.height);
28 scoped_ptr<base::TickClock>(testing_clock_).Pass(), 85 video_frame_ = media::VideoFrame::CreateFrame(
29 task_runner_, 86 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta());
30 task_runner_, 87 PopulateVideoFrame(video_frame_.get(), 123);
31 task_runner_)),
32 video_config_(GetDefaultVideoSenderConfig()),
33 count_frames_delivered_(0) {
34 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
35 first_frame_time_ = testing_clock_->NowTicks();
36 } 88 }
37 89
38 ~VideoEncoderImplTest() override {} 90 ~VideoEncoderImplTest() override {}
39 91
40 void SetUp() override { 92 void SetUp() override {
41 video_config_.codec = GetParam(); 93 testing_clock_ = new base::SimpleTestTickClock();
94 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
95 task_runner_ = new test::FakeSingleThreadTaskRunner(testing_clock_);
96 cast_environment_ =
97 new CastEnvironment(scoped_ptr<base::TickClock>(testing_clock_).Pass(),
98 task_runner_,
99 task_runner_,
100 task_runner_);
42 } 101 }
43 102
44 void TearDown() override { 103 void TearDown() override {
45 video_encoder_.reset(); 104 video_encoder_.reset();
46 task_runner_->RunTasks(); 105 task_runner_->RunTasks();
47 } 106 }
48 107
49 void CreateEncoder(bool three_buffer_mode) { 108 void CreateEncoder() {
50 video_config_.max_number_of_video_buffers_used = 109 test_video_encoder_callback_ = new TestVideoEncoderCallback(
51 (three_buffer_mode ? 3 : 1); 110 video_config_.max_number_of_video_buffers_used != 1);
52 video_encoder_.reset(new VideoEncoderImpl( 111 video_encoder_.reset(
53 cast_environment_, 112 new VideoEncoderImpl(cast_environment_, video_config_));
54 video_config_,
55 CastInitializationCallback()));
56 task_runner_->RunTasks();
57 } 113 }
58 114
59 VideoEncoder* video_encoder() const { 115 void AdvanceClockAndVideoFrameTimestamp() {
60 return video_encoder_.get(); 116 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(33));
117 video_frame_->set_timestamp(
118 video_frame_->timestamp() + base::TimeDelta::FromMilliseconds(33));
61 } 119 }
62 120
63 void AdvanceClock() { 121 base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
64 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(33)); 122 scoped_refptr<TestVideoEncoderCallback> test_video_encoder_callback_;
65 } 123 VideoSenderConfig video_config_;
124 scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
125 scoped_ptr<VideoEncoder> video_encoder_;
126 scoped_refptr<media::VideoFrame> video_frame_;
66 127
67 base::TimeTicks Now() const { 128 scoped_refptr<CastEnvironment> cast_environment_;
68 return testing_clock_->NowTicks();
69 }
70
71 void RunTasks() const {
72 return task_runner_->RunTasks();
73 }
74
75 int count_frames_delivered() const {
76 return count_frames_delivered_;
77 }
78
79 // Return a callback that, when run, expects the EncodedFrame to have the
80 // given properties.
81 VideoEncoder::FrameEncodedCallback CreateFrameDeliverCallback(
82 uint32 expected_frame_id,
83 uint32 expected_last_referenced_frame_id,
84 uint32 expected_rtp_timestamp,
85 const base::TimeTicks& expected_reference_time) {
86 return base::Bind(&VideoEncoderImplTest::DeliverEncodedVideoFrame,
87 base::Unretained(this),
88 expected_frame_id,
89 expected_last_referenced_frame_id,
90 expected_rtp_timestamp,
91 expected_reference_time);
92 }
93
94 // Creates a new VideoFrame of the given |size|, filled with a test pattern.
95 scoped_refptr<media::VideoFrame> CreateTestVideoFrame(
96 const gfx::Size& size) const {
97 const scoped_refptr<media::VideoFrame> frame =
98 media::VideoFrame::CreateFrame(
99 VideoFrame::I420, size, gfx::Rect(size), size,
100 testing_clock_->NowTicks() - first_frame_time_);
101 PopulateVideoFrame(frame.get(), 123);
102 return frame;
103 }
104
105 private:
106 // Checks that |encoded_frame| matches expected values. This is the method
107 // bound in the callback returned from CreateFrameDeliverCallback().
108 void DeliverEncodedVideoFrame(
109 uint32 expected_frame_id,
110 uint32 expected_last_referenced_frame_id,
111 uint32 expected_rtp_timestamp,
112 const base::TimeTicks& expected_reference_time,
113 scoped_ptr<EncodedFrame> encoded_frame) {
114 if (expected_frame_id != expected_last_referenced_frame_id) {
115 EXPECT_EQ(EncodedFrame::DEPENDENT, encoded_frame->dependency);
116 } else if (video_config_.max_number_of_video_buffers_used == 1) {
117 EXPECT_EQ(EncodedFrame::KEY, encoded_frame->dependency);
118 }
119 EXPECT_EQ(expected_frame_id, encoded_frame->frame_id);
120 EXPECT_EQ(expected_last_referenced_frame_id,
121 encoded_frame->referenced_frame_id)
122 << "frame id: " << expected_frame_id;
123 EXPECT_EQ(expected_rtp_timestamp, encoded_frame->rtp_timestamp);
124 EXPECT_EQ(expected_reference_time, encoded_frame->reference_time);
125 EXPECT_FALSE(encoded_frame->data.empty());
126 ++count_frames_delivered_;
127 }
128
129 base::SimpleTestTickClock* const testing_clock_; // Owned by CastEnvironment.
130 const scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
131 const scoped_refptr<CastEnvironment> cast_environment_;
132 VideoSenderConfig video_config_;
133 base::TimeTicks first_frame_time_;
134 scoped_ptr<VideoEncoder> video_encoder_;
135
136 int count_frames_delivered_;
137 129
138 DISALLOW_COPY_AND_ASSIGN(VideoEncoderImplTest); 130 DISALLOW_COPY_AND_ASSIGN(VideoEncoderImplTest);
139 }; 131 };
140 132
141 // A simple test to encode ten frames of video, expecting to see one key frame 133 TEST_F(VideoEncoderImplTest, GeneratesKeyFrameThenOnlyDeltaFrames) {
142 // followed by nine delta frames. 134 CreateEncoder();
143 TEST_P(VideoEncoderImplTest, GeneratesKeyFrameThenOnlyDeltaFrames) {
144 CreateEncoder(false);
145 135
146 EXPECT_EQ(0, count_frames_delivered()); 136 VideoEncoder::FrameEncodedCallback frame_encoded_callback =
137 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame,
138 test_video_encoder_callback_.get());
147 139
148 scoped_refptr<media::VideoFrame> video_frame = 140 EXPECT_EQ(0, test_video_encoder_callback_->count_frames_delivered());
149 CreateTestVideoFrame(gfx::Size(1280, 720)); 141
150 EXPECT_TRUE(video_encoder()->EncodeVideoFrame( 142 test_video_encoder_callback_->SetExpectedResult(
151 video_frame, 143 0, 0, TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
152 Now(), 144 testing_clock_->NowTicks());
153 CreateFrameDeliverCallback( 145 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
154 0, 0, TimeDeltaToRtpDelta(video_frame->timestamp(), kVideoFrequency), 146 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
155 Now()))); 147 task_runner_->RunTasks();
156 RunTasks();
157 148
158 for (uint32 frame_id = 1; frame_id < 10; ++frame_id) { 149 for (uint32 frame_id = 1; frame_id < 10; ++frame_id) {
159 AdvanceClock(); 150 AdvanceClockAndVideoFrameTimestamp();
160 video_frame = CreateTestVideoFrame(gfx::Size(1280, 720)); 151 test_video_encoder_callback_->SetExpectedResult(
161 EXPECT_TRUE(video_encoder()->EncodeVideoFrame( 152 frame_id,
162 video_frame, 153 frame_id - 1,
163 Now(), 154 TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
164 CreateFrameDeliverCallback( 155 testing_clock_->NowTicks());
165 frame_id, frame_id - 1, 156 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
166 TimeDeltaToRtpDelta(video_frame->timestamp(), kVideoFrequency), 157 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
167 Now()))); 158 task_runner_->RunTasks();
168 RunTasks();
169 } 159 }
170 160
171 EXPECT_EQ(10, count_frames_delivered()); 161 EXPECT_EQ(10, test_video_encoder_callback_->count_frames_delivered());
172 } 162 }
173 163
174 // Tests basic frame dependency rules when using the VP8 encoder in multi-buffer 164 TEST_F(VideoEncoderImplTest,
175 // mode.
176 TEST_P(VideoEncoderImplTest,
177 FramesDoNotDependOnUnackedFramesInMultiBufferMode) { 165 FramesDoNotDependOnUnackedFramesInMultiBufferMode) {
178 if (GetParam() != CODEC_VIDEO_VP8) 166 video_config_.max_number_of_video_buffers_used = 3;
179 return; // Only test multibuffer mode for the VP8 encoder. 167 CreateEncoder();
180 CreateEncoder(true);
181 168
182 EXPECT_EQ(0, count_frames_delivered()); 169 VideoEncoder::FrameEncodedCallback frame_encoded_callback =
170 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame,
171 test_video_encoder_callback_.get());
183 172
184 scoped_refptr<media::VideoFrame> video_frame = 173 EXPECT_EQ(0, test_video_encoder_callback_->count_frames_delivered());
185 CreateTestVideoFrame(gfx::Size(1280, 720));
186 EXPECT_TRUE(video_encoder()->EncodeVideoFrame(
187 video_frame,
188 Now(),
189 CreateFrameDeliverCallback(
190 0, 0, TimeDeltaToRtpDelta(video_frame->timestamp(), kVideoFrequency),
191 Now())));
192 RunTasks();
193 174
194 AdvanceClock(); 175 test_video_encoder_callback_->SetExpectedResult(
195 video_encoder()->LatestFrameIdToReference(0); 176 0, 0, TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
196 video_frame = CreateTestVideoFrame(gfx::Size(1280, 720)); 177 testing_clock_->NowTicks());
197 EXPECT_TRUE(video_encoder()->EncodeVideoFrame( 178 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
198 video_frame, 179 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
199 Now(), 180 task_runner_->RunTasks();
200 CreateFrameDeliverCallback(
201 1, 0, TimeDeltaToRtpDelta(video_frame->timestamp(), kVideoFrequency),
202 Now())));
203 RunTasks();
204 181
205 AdvanceClock(); 182 AdvanceClockAndVideoFrameTimestamp();
206 video_encoder()->LatestFrameIdToReference(1); 183 video_encoder_->LatestFrameIdToReference(0);
207 video_frame = CreateTestVideoFrame(gfx::Size(1280, 720)); 184 test_video_encoder_callback_->SetExpectedResult(
208 EXPECT_TRUE(video_encoder()->EncodeVideoFrame( 185 1, 0, TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
209 video_frame, 186 testing_clock_->NowTicks());
210 Now(), 187 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
211 CreateFrameDeliverCallback( 188 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
212 2, 1, TimeDeltaToRtpDelta(video_frame->timestamp(), kVideoFrequency), 189 task_runner_->RunTasks();
213 Now())));
214 RunTasks();
215 190
216 video_encoder()->LatestFrameIdToReference(2); 191 AdvanceClockAndVideoFrameTimestamp();
192 video_encoder_->LatestFrameIdToReference(1);
193 test_video_encoder_callback_->SetExpectedResult(
194 2, 1, TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
195 testing_clock_->NowTicks());
196 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
197 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
198 task_runner_->RunTasks();
199
200 video_encoder_->LatestFrameIdToReference(2);
217 201
218 for (uint32 frame_id = 3; frame_id < 10; ++frame_id) { 202 for (uint32 frame_id = 3; frame_id < 10; ++frame_id) {
219 AdvanceClock(); 203 AdvanceClockAndVideoFrameTimestamp();
220 video_frame = CreateTestVideoFrame(gfx::Size(1280, 720)); 204 test_video_encoder_callback_->SetExpectedResult(
221 EXPECT_TRUE(video_encoder()->EncodeVideoFrame( 205 frame_id, 2,
222 video_frame, 206 TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
223 Now(), 207 testing_clock_->NowTicks());
224 CreateFrameDeliverCallback( 208 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
225 frame_id, 2, 209 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
226 TimeDeltaToRtpDelta(video_frame->timestamp(), kVideoFrequency), 210 task_runner_->RunTasks();
227 Now())));
228 RunTasks();
229 } 211 }
230 212
231 EXPECT_EQ(10, count_frames_delivered()); 213 EXPECT_EQ(10, test_video_encoder_callback_->count_frames_delivered());
232 } 214 }
233 215
234 // Tests that the encoder continues to output EncodedFrames as the frame size
235 // changes. See media/cast/receiver/video_decoder_unittest.cc for a complete
236 // encode/decode cycle of varied frame sizes that actually checks the frame
237 // content.
238 TEST_P(VideoEncoderImplTest, EncodesVariedFrameSizes) {
239 CreateEncoder(false);
240 ASSERT_TRUE(video_encoder()->CanEncodeVariedFrameSizes());
241
242 EXPECT_EQ(0, count_frames_delivered());
243
244 std::vector<gfx::Size> frame_sizes;
245 frame_sizes.push_back(gfx::Size(1280, 720));
246 frame_sizes.push_back(gfx::Size(640, 360)); // Shrink both dimensions.
247 frame_sizes.push_back(gfx::Size(300, 200)); // Shrink both dimensions again.
248 frame_sizes.push_back(gfx::Size(200, 300)); // Same area.
249 frame_sizes.push_back(gfx::Size(600, 400)); // Grow both dimensions.
250 frame_sizes.push_back(gfx::Size(638, 400)); // Shrink only one dimension.
251 frame_sizes.push_back(gfx::Size(638, 398)); // Shrink the other dimension.
252 frame_sizes.push_back(gfx::Size(320, 180)); // Shrink both dimensions again.
253 frame_sizes.push_back(gfx::Size(322, 180)); // Grow only one dimension.
254 frame_sizes.push_back(gfx::Size(322, 182)); // Grow the other dimension.
255 frame_sizes.push_back(gfx::Size(1920, 1080)); // Grow both dimensions again.
256
257 uint32 frame_id = 0;
258
259 // Encode one frame at each size. Expect nothing but key frames to come out.
260 for (const auto& frame_size : frame_sizes) {
261 AdvanceClock();
262 const scoped_refptr<media::VideoFrame> video_frame =
263 CreateTestVideoFrame(frame_size);
264 EXPECT_TRUE(video_encoder()->EncodeVideoFrame(
265 video_frame,
266 Now(),
267 CreateFrameDeliverCallback(
268 frame_id,
269 frame_id,
270 TimeDeltaToRtpDelta(video_frame->timestamp(), kVideoFrequency),
271 Now())));
272 RunTasks();
273 ++frame_id;
274 }
275
276 // Encode 10 frames at each size. Expect one key frame followed by nine delta
277 // frames for each frame size.
278 for (const auto& frame_size : frame_sizes) {
279 for (int i = 0; i < 10; ++i) {
280 AdvanceClock();
281 const scoped_refptr<media::VideoFrame> video_frame =
282 CreateTestVideoFrame(frame_size);
283 EXPECT_TRUE(video_encoder()->EncodeVideoFrame(
284 video_frame,
285 Now(),
286 CreateFrameDeliverCallback(
287 frame_id,
288 i == 0 ? frame_id : frame_id - 1,
289 TimeDeltaToRtpDelta(video_frame->timestamp(), kVideoFrequency),
290 Now())));
291 RunTasks();
292 ++frame_id;
293 }
294 }
295
296 EXPECT_EQ(static_cast<int>(frame_id), count_frames_delivered());
297 }
298
299 INSTANTIATE_TEST_CASE_P(,
300 VideoEncoderImplTest,
301 ::testing::Values(CODEC_VIDEO_FAKE, CODEC_VIDEO_VP8));
302
303 } // namespace cast 216 } // namespace cast
304 } // namespace media 217 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/sender/video_encoder_impl.cc ('k') | media/cast/sender/video_sender.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698