OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |