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/power_monitor/power_monitor.h" | |
10 #include "base/test/launcher/unit_test_launcher.h" | 11 #include "base/test/launcher/unit_test_launcher.h" |
12 #include "base/test/power_monitor_test_base.h" | |
11 #include "base/test/simple_test_tick_clock.h" | 13 #include "base/test/simple_test_tick_clock.h" |
12 #include "base/test/test_suite.h" | 14 #include "base/test/test_suite.h" |
13 #include "media/base/decoder_buffer.h" | 15 #include "media/base/decoder_buffer.h" |
14 #include "media/base/media.h" | 16 #include "media/base/media.h" |
15 #include "media/base/media_switches.h" | 17 #include "media/base/media_switches.h" |
16 #include "media/cast/sender/h264_vt_encoder.h" | 18 #include "media/cast/sender/h264_vt_encoder.h" |
17 #include "media/cast/sender/video_frame_factory.h" | 19 #include "media/cast/sender/video_frame_factory.h" |
18 #include "media/cast/test/utility/default_config.h" | 20 #include "media/cast/test/utility/default_config.h" |
19 #include "media/cast/test/utility/video_utility.h" | 21 #include "media/cast/test/utility/video_utility.h" |
20 #include "media/ffmpeg/ffmpeg_common.h" | 22 #include "media/ffmpeg/ffmpeg_common.h" |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
183 auto cv_pixel_buffer = video_frame->cv_pixel_buffer(); | 185 auto cv_pixel_buffer = video_frame->cv_pixel_buffer(); |
184 ASSERT_TRUE(cv_pixel_buffer); | 186 ASSERT_TRUE(cv_pixel_buffer); |
185 CVPixelBufferLockBaseAddress(cv_pixel_buffer, 0); | 187 CVPixelBufferLockBaseAddress(cv_pixel_buffer, 0); |
186 auto ptr = CVPixelBufferGetBaseAddressOfPlane(cv_pixel_buffer, 0); | 188 auto ptr = CVPixelBufferGetBaseAddressOfPlane(cv_pixel_buffer, 0); |
187 ASSERT_TRUE(ptr); | 189 ASSERT_TRUE(ptr); |
188 memset(ptr, 0xfe, CVPixelBufferGetBytesPerRowOfPlane(cv_pixel_buffer, 0) * | 190 memset(ptr, 0xfe, CVPixelBufferGetBytesPerRowOfPlane(cv_pixel_buffer, 0) * |
189 CVPixelBufferGetHeightOfPlane(cv_pixel_buffer, 0)); | 191 CVPixelBufferGetHeightOfPlane(cv_pixel_buffer, 0)); |
190 CVPixelBufferUnlockBaseAddress(cv_pixel_buffer, 0); | 192 CVPixelBufferUnlockBaseAddress(cv_pixel_buffer, 0); |
191 } | 193 } |
192 | 194 |
195 void NoopFrameEncodedCallback( | |
miu
2015/04/24 20:38:40
FYI--No change needed here, but just so you know:
jfroy
2015/04/24 20:42:26
Acknowledged.
| |
196 scoped_ptr<media::cast::EncodedFrame> /*encoded_frame*/) { | |
197 } | |
198 | |
199 class TestPowerSource : public base::PowerMonitorSource { | |
200 public: | |
201 void GenerateSuspendEvent() { | |
202 ProcessPowerEvent(SUSPEND_EVENT); | |
203 base::MessageLoop::current()->RunUntilIdle(); | |
204 } | |
205 void GenerateResumeEvent() { | |
206 ProcessPowerEvent(RESUME_EVENT); | |
207 base::MessageLoop::current()->RunUntilIdle(); | |
208 } | |
209 | |
210 private: | |
211 bool IsOnBatteryPowerImpl() override { return false; } | |
212 }; | |
213 | |
193 class H264VideoToolboxEncoderTest : public ::testing::Test { | 214 class H264VideoToolboxEncoderTest : public ::testing::Test { |
194 protected: | 215 protected: |
195 H264VideoToolboxEncoderTest() | 216 H264VideoToolboxEncoderTest() = default; |
196 : operational_status_(STATUS_UNINITIALIZED) { | |
197 frame_->set_timestamp(base::TimeDelta()); | |
198 } | |
199 | 217 |
200 void SetUp() override { | 218 void SetUp() override { |
201 clock_ = new base::SimpleTestTickClock(); | 219 clock_ = new base::SimpleTestTickClock(); |
202 clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); | 220 clock_->Advance(base::TimeTicks::Now() - base::TimeTicks()); |
203 | 221 |
222 power_source_ = new TestPowerSource(); | |
223 power_monitor_.reset( | |
224 new base::PowerMonitor(scoped_ptr<TestPowerSource>(power_source_))); | |
225 | |
204 cast_environment_ = new CastEnvironment( | 226 cast_environment_ = new CastEnvironment( |
205 scoped_ptr<base::TickClock>(clock_).Pass(), | 227 scoped_ptr<base::TickClock>(clock_).Pass(), |
206 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), | 228 message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(), |
207 message_loop_.message_loop_proxy()); | 229 message_loop_.message_loop_proxy()); |
208 encoder_.reset(new H264VideoToolboxEncoder( | 230 encoder_.reset(new H264VideoToolboxEncoder( |
209 cast_environment_, | 231 cast_environment_, video_sender_config_, |
210 video_sender_config_, | |
211 base::Bind(&SaveOperationalStatus, &operational_status_))); | 232 base::Bind(&SaveOperationalStatus, &operational_status_))); |
212 message_loop_.RunUntilIdle(); | 233 message_loop_.RunUntilIdle(); |
213 EXPECT_EQ(STATUS_INITIALIZED, operational_status_); | 234 EXPECT_EQ(STATUS_INITIALIZED, operational_status_); |
214 } | 235 } |
215 | 236 |
216 void TearDown() override { | 237 void TearDown() override { |
217 encoder_.reset(); | 238 encoder_.reset(); |
218 message_loop_.RunUntilIdle(); | 239 message_loop_.RunUntilIdle(); |
240 power_monitor_.reset(); | |
219 } | 241 } |
220 | 242 |
221 void AdvanceClockAndVideoFrameTimestamp() { | 243 void AdvanceClockAndVideoFrameTimestamp() { |
222 clock_->Advance(base::TimeDelta::FromMilliseconds(33)); | 244 clock_->Advance(base::TimeDelta::FromMilliseconds(33)); |
223 frame_->set_timestamp(frame_->timestamp() + | 245 frame_->set_timestamp(frame_->timestamp() + |
224 base::TimeDelta::FromMilliseconds(33)); | 246 base::TimeDelta::FromMilliseconds(33)); |
225 } | 247 } |
226 | 248 |
227 static void SetUpTestCase() { | 249 static void SetUpTestCase() { |
228 // Reusable test data. | 250 // Reusable test data. |
229 video_sender_config_ = GetDefaultVideoSenderConfig(); | 251 video_sender_config_ = GetDefaultVideoSenderConfig(); |
230 video_sender_config_.codec = CODEC_VIDEO_H264; | 252 video_sender_config_.codec = CODEC_VIDEO_H264; |
231 const gfx::Size size(kVideoWidth, kVideoHeight); | 253 const gfx::Size size(kVideoWidth, kVideoHeight); |
232 frame_ = media::VideoFrame::CreateFrame( | 254 frame_ = media::VideoFrame::CreateFrame( |
233 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); | 255 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta()); |
234 PopulateVideoFrame(frame_.get(), 123); | 256 PopulateVideoFrame(frame_.get(), 123); |
235 } | 257 } |
236 | 258 |
237 static void TearDownTestCase() { frame_ = nullptr; } | 259 static void TearDownTestCase() { frame_ = nullptr; } |
238 | 260 |
239 static scoped_refptr<media::VideoFrame> frame_; | 261 static scoped_refptr<media::VideoFrame> frame_; |
240 static VideoSenderConfig video_sender_config_; | 262 static VideoSenderConfig video_sender_config_; |
241 | 263 |
242 base::SimpleTestTickClock* clock_; // Owned by CastEnvironment. | 264 base::SimpleTestTickClock* clock_; // Owned by CastEnvironment. |
243 base::MessageLoop message_loop_; | 265 base::MessageLoop message_loop_; |
244 scoped_refptr<CastEnvironment> cast_environment_; | 266 scoped_refptr<CastEnvironment> cast_environment_; |
245 scoped_ptr<VideoEncoder> encoder_; | 267 scoped_ptr<VideoEncoder> encoder_; |
246 OperationalStatus operational_status_; | 268 OperationalStatus operational_status_; |
269 TestPowerSource* power_source_; // Owned by the power monitor. | |
270 scoped_ptr<base::PowerMonitor> power_monitor_; | |
247 | 271 |
248 private: | 272 private: |
249 DISALLOW_COPY_AND_ASSIGN(H264VideoToolboxEncoderTest); | 273 DISALLOW_COPY_AND_ASSIGN(H264VideoToolboxEncoderTest); |
250 }; | 274 }; |
251 | 275 |
252 // static | 276 // static |
253 scoped_refptr<media::VideoFrame> H264VideoToolboxEncoderTest::frame_; | 277 scoped_refptr<media::VideoFrame> H264VideoToolboxEncoderTest::frame_; |
254 VideoSenderConfig H264VideoToolboxEncoderTest::video_sender_config_; | 278 VideoSenderConfig H264VideoToolboxEncoderTest::video_sender_config_; |
255 | 279 |
256 TEST_F(H264VideoToolboxEncoderTest, CheckFrameMetadataSequence) { | 280 TEST_F(H264VideoToolboxEncoderTest, CheckFrameMetadataSequence) { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
307 // The first call to |MaybeCreateFrame| will return null but post a task to | 331 // The first call to |MaybeCreateFrame| will return null but post a task to |
308 // the encoder to initialize for the specified frame size. We then drain the | 332 // the encoder to initialize for the specified frame size. We then drain the |
309 // message loop. After that, the encoder should have initialized and we | 333 // message loop. After that, the encoder should have initialized and we |
310 // request a frame again. | 334 // request a frame again. |
311 ASSERT_FALSE(video_frame_factory->MaybeCreateFrame( | 335 ASSERT_FALSE(video_frame_factory->MaybeCreateFrame( |
312 gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta())); | 336 gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta())); |
313 message_loop_.RunUntilIdle(); | 337 message_loop_.RunUntilIdle(); |
314 CreateFrameAndMemsetPlane(video_frame_factory.get()); | 338 CreateFrameAndMemsetPlane(video_frame_factory.get()); |
315 } | 339 } |
316 | 340 |
341 TEST_F(H264VideoToolboxEncoderTest, CheckPowerMonitoring) { | |
342 // Encode a frame, suspend, encode a frame, resume, encode a frame. | |
343 | |
344 VideoEncoder::FrameEncodedCallback cb = base::Bind(&NoopFrameEncodedCallback); | |
345 EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb)); | |
346 power_source_->GenerateSuspendEvent(); | |
347 EXPECT_FALSE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb)); | |
348 power_source_->GenerateResumeEvent(); | |
349 EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb)); | |
350 } | |
351 | |
352 TEST_F(H264VideoToolboxEncoderTest, CheckPowerMonitoringNoInitialFrame) { | |
353 // Suspend, encode a frame, resume, encode a frame. | |
354 | |
355 VideoEncoder::FrameEncodedCallback cb = base::Bind(&NoopFrameEncodedCallback); | |
356 power_source_->GenerateSuspendEvent(); | |
357 EXPECT_FALSE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb)); | |
358 power_source_->GenerateResumeEvent(); | |
359 EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb)); | |
360 } | |
361 | |
362 TEST_F(H264VideoToolboxEncoderTest, CheckPowerMonitoringVideoFrameFactory) { | |
363 VideoEncoder::FrameEncodedCallback cb = base::Bind(&NoopFrameEncodedCallback); | |
364 auto video_frame_factory = encoder_->CreateVideoFrameFactory(); | |
365 ASSERT_TRUE(video_frame_factory.get()); | |
366 | |
367 // The first call to |MaybeCreateFrame| will return null but post a task to | |
368 // the encoder to initialize for the specified frame size. We then drain the | |
369 // message loop. After that, the encoder should have initialized and we | |
370 // request a frame again. | |
371 ASSERT_FALSE(video_frame_factory->MaybeCreateFrame( | |
372 gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta())); | |
373 message_loop_.RunUntilIdle(); | |
374 CreateFrameAndMemsetPlane(video_frame_factory.get()); | |
375 | |
376 // After a power suspension, the factory should not produce frames. | |
377 power_source_->GenerateSuspendEvent(); | |
378 | |
379 ASSERT_FALSE(video_frame_factory->MaybeCreateFrame( | |
380 gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta())); | |
381 message_loop_.RunUntilIdle(); | |
382 ASSERT_FALSE(video_frame_factory->MaybeCreateFrame( | |
383 gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta())); | |
384 | |
385 // After a power resume event, the factory should produce frames right away | |
386 // because the encoder re-initializes on its own. | |
387 power_source_->GenerateResumeEvent(); | |
388 CreateFrameAndMemsetPlane(video_frame_factory.get()); | |
389 } | |
390 | |
391 TEST_F(H264VideoToolboxEncoderTest, | |
392 CheckPowerMonitoringVideoFrameFactoryNoInitialFrame) { | |
393 VideoEncoder::FrameEncodedCallback cb = base::Bind(&NoopFrameEncodedCallback); | |
394 auto video_frame_factory = encoder_->CreateVideoFrameFactory(); | |
395 ASSERT_TRUE(video_frame_factory.get()); | |
396 | |
397 // After a power suspension, the factory should not produce frames. | |
398 power_source_->GenerateSuspendEvent(); | |
399 | |
400 ASSERT_FALSE(video_frame_factory->MaybeCreateFrame( | |
401 gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta())); | |
402 message_loop_.RunUntilIdle(); | |
403 ASSERT_FALSE(video_frame_factory->MaybeCreateFrame( | |
404 gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta())); | |
405 | |
406 // After a power resume event, the factory should produce frames right away | |
407 // because the encoder re-initializes on its own. | |
408 power_source_->GenerateResumeEvent(); | |
409 CreateFrameAndMemsetPlane(video_frame_factory.get()); | |
410 } | |
411 | |
317 } // namespace cast | 412 } // namespace cast |
318 } // namespace media | 413 } // namespace media |
OLD | NEW |