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

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

Issue 1100643002: [cast] Handle frame size changes directly in the VideoToolbox encoder (v2). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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 <queue> 5 #include <queue>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/test/launcher/unit_test_launcher.h" 10 #include "base/test/launcher/unit_test_launcher.h"
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 CVPixelBufferLockBaseAddress(cv_pixel_buffer, 0); 185 CVPixelBufferLockBaseAddress(cv_pixel_buffer, 0);
186 auto ptr = CVPixelBufferGetBaseAddressOfPlane(cv_pixel_buffer, 0); 186 auto ptr = CVPixelBufferGetBaseAddressOfPlane(cv_pixel_buffer, 0);
187 ASSERT_TRUE(ptr); 187 ASSERT_TRUE(ptr);
188 memset(ptr, 0xfe, CVPixelBufferGetBytesPerRowOfPlane(cv_pixel_buffer, 0) * 188 memset(ptr, 0xfe, CVPixelBufferGetBytesPerRowOfPlane(cv_pixel_buffer, 0) *
189 CVPixelBufferGetHeightOfPlane(cv_pixel_buffer, 0)); 189 CVPixelBufferGetHeightOfPlane(cv_pixel_buffer, 0));
190 CVPixelBufferUnlockBaseAddress(cv_pixel_buffer, 0); 190 CVPixelBufferUnlockBaseAddress(cv_pixel_buffer, 0);
191 } 191 }
192 192
193 class H264VideoToolboxEncoderTest : public ::testing::Test { 193 class H264VideoToolboxEncoderTest : public ::testing::Test {
194 protected: 194 protected:
195 H264VideoToolboxEncoderTest() 195 H264VideoToolboxEncoderTest() : operational_status_(STATUS_UNINITIALIZED) {
196 : operational_status_(STATUS_UNINITIALIZED) {
197 frame_->set_timestamp(base::TimeDelta()); 196 frame_->set_timestamp(base::TimeDelta());
198 } 197 }
199 198
200 void SetUp() override { 199 void SetUp() override {
201 clock_ = new base::SimpleTestTickClock(); 200 clock_ = new base::SimpleTestTickClock();
202 clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); 201 clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
203 202
204 cast_environment_ = new CastEnvironment( 203 cast_environment_ = new CastEnvironment(
205 scoped_ptr<base::TickClock>(clock_).Pass(), 204 scoped_ptr<base::TickClock>(clock_).Pass(),
206 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), 205 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(),
207 message_loop_.message_loop_proxy()); 206 message_loop_.message_loop_proxy());
208 encoder_.reset(new H264VideoToolboxEncoder( 207 encoder_.reset(new H264VideoToolboxEncoder(
209 cast_environment_, 208 cast_environment_, video_sender_config_,
210 video_sender_config_,
211 gfx::Size(kVideoWidth, kVideoHeight),
212 0u,
213 base::Bind(&SaveOperationalStatus, &operational_status_))); 209 base::Bind(&SaveOperationalStatus, &operational_status_)));
214 message_loop_.RunUntilIdle(); 210 message_loop_.RunUntilIdle();
215 EXPECT_EQ(STATUS_INITIALIZED, operational_status_); 211 EXPECT_EQ(STATUS_INITIALIZED, operational_status_);
216 } 212 }
217 213
218 void TearDown() override { 214 void TearDown() override {
219 encoder_.reset(); 215 encoder_.reset();
220 message_loop_.RunUntilIdle(); 216 message_loop_.RunUntilIdle();
221 } 217 }
222 218
(...skipping 30 matching lines...) Expand all
253 249
254 // static 250 // static
255 scoped_refptr<media::VideoFrame> H264VideoToolboxEncoderTest::frame_; 251 scoped_refptr<media::VideoFrame> H264VideoToolboxEncoderTest::frame_;
256 VideoSenderConfig H264VideoToolboxEncoderTest::video_sender_config_; 252 VideoSenderConfig H264VideoToolboxEncoderTest::video_sender_config_;
257 253
258 TEST_F(H264VideoToolboxEncoderTest, CheckFrameMetadataSequence) { 254 TEST_F(H264VideoToolboxEncoderTest, CheckFrameMetadataSequence) {
259 scoped_refptr<MetadataRecorder> metadata_recorder(new MetadataRecorder()); 255 scoped_refptr<MetadataRecorder> metadata_recorder(new MetadataRecorder());
260 VideoEncoder::FrameEncodedCallback cb = base::Bind( 256 VideoEncoder::FrameEncodedCallback cb = base::Bind(
261 &MetadataRecorder::CompareFrameWithExpected, metadata_recorder.get()); 257 &MetadataRecorder::CompareFrameWithExpected, metadata_recorder.get());
262 258
259 // The first call to |EncodeVideoFrame| will return null but post a task to
260 // the encoder to initialize for the specified frame size. We then drain the
261 // message loop. After that, the encoder should have initialized.
262 ASSERT_FALSE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb));
263 message_loop_.RunUntilIdle();
264
263 metadata_recorder->PushExpectation( 265 metadata_recorder->PushExpectation(
264 0, 0, TimeDeltaToRtpDelta(frame_->timestamp(), kVideoFrequency), 266 0, 0, TimeDeltaToRtpDelta(frame_->timestamp(), kVideoFrequency),
265 clock_->NowTicks()); 267 clock_->NowTicks());
266 EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb)); 268 EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb));
267 message_loop_.RunUntilIdle(); 269 message_loop_.RunUntilIdle();
268 270
269 for (uint32 frame_id = 1; frame_id < 10; ++frame_id) { 271 for (uint32 frame_id = 1; frame_id < 10; ++frame_id) {
270 AdvanceClockAndVideoFrameTimestamp(); 272 AdvanceClockAndVideoFrameTimestamp();
271 metadata_recorder->PushExpectation( 273 metadata_recorder->PushExpectation(
272 frame_id, frame_id - 1, 274 frame_id, frame_id - 1,
273 TimeDeltaToRtpDelta(frame_->timestamp(), kVideoFrequency), 275 TimeDeltaToRtpDelta(frame_->timestamp(), kVideoFrequency),
274 clock_->NowTicks()); 276 clock_->NowTicks());
275 EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb)); 277 EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb));
276 } 278 }
277 279
278 encoder_.reset(); 280 encoder_.reset();
279 message_loop_.RunUntilIdle(); 281 message_loop_.RunUntilIdle();
280 282
281 EXPECT_EQ(10, metadata_recorder->count_frames_delivered()); 283 EXPECT_EQ(10, metadata_recorder->count_frames_delivered());
282 } 284 }
283 285
284 #if defined(USE_PROPRIETARY_CODECS) 286 #if defined(USE_PROPRIETARY_CODECS)
285 TEST_F(H264VideoToolboxEncoderTest, CheckFramesAreDecodable) { 287 TEST_F(H264VideoToolboxEncoderTest, CheckFramesAreDecodable) {
286 VideoDecoderConfig config(kCodecH264, H264PROFILE_MAIN, frame_->format(), 288 VideoDecoderConfig config(kCodecH264, H264PROFILE_MAIN, frame_->format(),
287 frame_->coded_size(), frame_->visible_rect(), 289 frame_->coded_size(), frame_->visible_rect(),
288 frame_->natural_size(), nullptr, 0, false); 290 frame_->natural_size(), nullptr, 0, false);
289 scoped_refptr<EndToEndFrameChecker> checker(new EndToEndFrameChecker(config)); 291 scoped_refptr<EndToEndFrameChecker> checker(new EndToEndFrameChecker(config));
290
291 VideoEncoder::FrameEncodedCallback cb = 292 VideoEncoder::FrameEncodedCallback cb =
292 base::Bind(&EndToEndFrameChecker::EncodeDone, checker.get()); 293 base::Bind(&EndToEndFrameChecker::EncodeDone, checker.get());
294
295 // The first call to |EncodeVideoFrame| will return null but post a task to
296 // the encoder to initialize for the specified frame size. We then drain the
297 // message loop. After that, the encoder should have initialized.
298 ASSERT_FALSE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb));
299 message_loop_.RunUntilIdle();
300
293 for (uint32 frame_id = 0; frame_id < 6; ++frame_id) { 301 for (uint32 frame_id = 0; frame_id < 6; ++frame_id) {
294 checker->PushExpectation(frame_); 302 checker->PushExpectation(frame_);
295 EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb)); 303 EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb));
296 AdvanceClockAndVideoFrameTimestamp(); 304 AdvanceClockAndVideoFrameTimestamp();
297 } 305 }
298 306
299 encoder_.reset(); 307 encoder_.reset();
300 message_loop_.RunUntilIdle(); 308 message_loop_.RunUntilIdle();
301 309
302 EXPECT_EQ(5, checker->count_frames_checked()); 310 EXPECT_EQ(5, checker->count_frames_checked());
303 } 311 }
304 #endif 312 #endif
305 313
306 TEST_F(H264VideoToolboxEncoderTest, CheckVideoFrameFactory) { 314 TEST_F(H264VideoToolboxEncoderTest, CheckVideoFrameFactory) {
307 auto video_frame_factory = encoder_->CreateVideoFrameFactory(); 315 auto video_frame_factory = encoder_->CreateVideoFrameFactory();
308 ASSERT_TRUE(video_frame_factory.get()); 316 ASSERT_TRUE(video_frame_factory.get());
309 CreateFrameAndMemsetPlane(video_frame_factory.get()); 317 // The first call to |MaybeCreateFrame| will return null but post a task to
310 // TODO(jfroy): Need to test that the encoder can encode VideoFrames provided 318 // the encoder to initialize for the specified frame size. We then drain the
311 // by the VideoFrameFactory. 319 // message loop. After that, the encoder should have initialized and we
312 encoder_.reset(); 320 // request a frame again.
321 ASSERT_FALSE(video_frame_factory->MaybeCreateFrame(
322 gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta()));
313 message_loop_.RunUntilIdle(); 323 message_loop_.RunUntilIdle();
314 CreateFrameAndMemsetPlane(video_frame_factory.get()); 324 CreateFrameAndMemsetPlane(video_frame_factory.get());
315 } 325 }
316 326
317 } // namespace cast 327 } // namespace cast
318 } // namespace media 328 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698