| Index: media/cast/sender/h264_vt_encoder_unittest.cc
|
| diff --git a/media/cast/sender/h264_vt_encoder_unittest.cc b/media/cast/sender/h264_vt_encoder_unittest.cc
|
| index 4be1b93c7606b9d309b22957c961c6a484e0404b..26ac0621d031ca3ba41e290cfc6a8b91aa1e391f 100644
|
| --- a/media/cast/sender/h264_vt_encoder_unittest.cc
|
| +++ b/media/cast/sender/h264_vt_encoder_unittest.cc
|
| @@ -7,7 +7,9 @@
|
| #include "base/bind.h"
|
| #include "base/command_line.h"
|
| #include "base/message_loop/message_loop.h"
|
| +#include "base/power_monitor/power_monitor.h"
|
| #include "base/test/launcher/unit_test_launcher.h"
|
| +#include "base/test/power_monitor_test_base.h"
|
| #include "base/test/simple_test_tick_clock.h"
|
| #include "base/test/test_suite.h"
|
| #include "media/base/decoder_buffer.h"
|
| @@ -190,24 +192,43 @@ void CreateFrameAndMemsetPlane(VideoFrameFactory* const video_frame_factory) {
|
| CVPixelBufferUnlockBaseAddress(cv_pixel_buffer, 0);
|
| }
|
|
|
| +void NoopFrameEncodedCallback(
|
| + scoped_ptr<media::cast::EncodedFrame> /*encoded_frame*/) {
|
| +}
|
| +
|
| +class TestPowerSource : public base::PowerMonitorSource {
|
| + public:
|
| + void GenerateSuspendEvent() {
|
| + ProcessPowerEvent(SUSPEND_EVENT);
|
| + base::MessageLoop::current()->RunUntilIdle();
|
| + }
|
| + void GenerateResumeEvent() {
|
| + ProcessPowerEvent(RESUME_EVENT);
|
| + base::MessageLoop::current()->RunUntilIdle();
|
| + }
|
| +
|
| + private:
|
| + bool IsOnBatteryPowerImpl() override { return false; }
|
| +};
|
| +
|
| class H264VideoToolboxEncoderTest : public ::testing::Test {
|
| protected:
|
| - H264VideoToolboxEncoderTest()
|
| - : operational_status_(STATUS_UNINITIALIZED) {
|
| - frame_->set_timestamp(base::TimeDelta());
|
| - }
|
| + H264VideoToolboxEncoderTest() = default;
|
|
|
| void SetUp() override {
|
| clock_ = new base::SimpleTestTickClock();
|
| clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
|
|
|
| + power_source_ = new TestPowerSource();
|
| + power_monitor_.reset(
|
| + new base::PowerMonitor(scoped_ptr<TestPowerSource>(power_source_)));
|
| +
|
| cast_environment_ = new CastEnvironment(
|
| scoped_ptr<base::TickClock>(clock_).Pass(),
|
| message_loop_.message_loop_proxy(), message_loop_.message_loop_proxy(),
|
| message_loop_.message_loop_proxy());
|
| encoder_.reset(new H264VideoToolboxEncoder(
|
| - cast_environment_,
|
| - video_sender_config_,
|
| + cast_environment_, video_sender_config_,
|
| base::Bind(&SaveOperationalStatus, &operational_status_)));
|
| message_loop_.RunUntilIdle();
|
| EXPECT_EQ(STATUS_INITIALIZED, operational_status_);
|
| @@ -216,6 +237,7 @@ class H264VideoToolboxEncoderTest : public ::testing::Test {
|
| void TearDown() override {
|
| encoder_.reset();
|
| message_loop_.RunUntilIdle();
|
| + power_monitor_.reset();
|
| }
|
|
|
| void AdvanceClockAndVideoFrameTimestamp() {
|
| @@ -244,6 +266,8 @@ class H264VideoToolboxEncoderTest : public ::testing::Test {
|
| scoped_refptr<CastEnvironment> cast_environment_;
|
| scoped_ptr<VideoEncoder> encoder_;
|
| OperationalStatus operational_status_;
|
| + TestPowerSource* power_source_; // Owned by the power monitor.
|
| + scoped_ptr<base::PowerMonitor> power_monitor_;
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(H264VideoToolboxEncoderTest);
|
| @@ -314,5 +338,76 @@ TEST_F(H264VideoToolboxEncoderTest, CheckVideoFrameFactory) {
|
| CreateFrameAndMemsetPlane(video_frame_factory.get());
|
| }
|
|
|
| +TEST_F(H264VideoToolboxEncoderTest, CheckPowerMonitoring) {
|
| + // Encode a frame, suspend, encode a frame, resume, encode a frame.
|
| +
|
| + VideoEncoder::FrameEncodedCallback cb = base::Bind(&NoopFrameEncodedCallback);
|
| + EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb));
|
| + power_source_->GenerateSuspendEvent();
|
| + EXPECT_FALSE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb));
|
| + power_source_->GenerateResumeEvent();
|
| + EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb));
|
| +}
|
| +
|
| +TEST_F(H264VideoToolboxEncoderTest, CheckPowerMonitoringNoInitialFrame) {
|
| + // Suspend, encode a frame, resume, encode a frame.
|
| +
|
| + VideoEncoder::FrameEncodedCallback cb = base::Bind(&NoopFrameEncodedCallback);
|
| + power_source_->GenerateSuspendEvent();
|
| + EXPECT_FALSE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb));
|
| + power_source_->GenerateResumeEvent();
|
| + EXPECT_TRUE(encoder_->EncodeVideoFrame(frame_, clock_->NowTicks(), cb));
|
| +}
|
| +
|
| +TEST_F(H264VideoToolboxEncoderTest, CheckPowerMonitoringVideoFrameFactory) {
|
| + VideoEncoder::FrameEncodedCallback cb = base::Bind(&NoopFrameEncodedCallback);
|
| + auto video_frame_factory = encoder_->CreateVideoFrameFactory();
|
| + ASSERT_TRUE(video_frame_factory.get());
|
| +
|
| + // The first call to |MaybeCreateFrame| will return null but post a task to
|
| + // the encoder to initialize for the specified frame size. We then drain the
|
| + // message loop. After that, the encoder should have initialized and we
|
| + // request a frame again.
|
| + ASSERT_FALSE(video_frame_factory->MaybeCreateFrame(
|
| + gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta()));
|
| + message_loop_.RunUntilIdle();
|
| + CreateFrameAndMemsetPlane(video_frame_factory.get());
|
| +
|
| + // After a power suspension, the factory should not produce frames.
|
| + power_source_->GenerateSuspendEvent();
|
| +
|
| + ASSERT_FALSE(video_frame_factory->MaybeCreateFrame(
|
| + gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta()));
|
| + message_loop_.RunUntilIdle();
|
| + ASSERT_FALSE(video_frame_factory->MaybeCreateFrame(
|
| + gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta()));
|
| +
|
| + // After a power resume event, the factory should produce frames right away
|
| + // because the encoder re-initializes on its own.
|
| + power_source_->GenerateResumeEvent();
|
| + CreateFrameAndMemsetPlane(video_frame_factory.get());
|
| +}
|
| +
|
| +TEST_F(H264VideoToolboxEncoderTest,
|
| + CheckPowerMonitoringVideoFrameFactoryNoInitialFrame) {
|
| + VideoEncoder::FrameEncodedCallback cb = base::Bind(&NoopFrameEncodedCallback);
|
| + auto video_frame_factory = encoder_->CreateVideoFrameFactory();
|
| + ASSERT_TRUE(video_frame_factory.get());
|
| +
|
| + // After a power suspension, the factory should not produce frames.
|
| + power_source_->GenerateSuspendEvent();
|
| +
|
| + ASSERT_FALSE(video_frame_factory->MaybeCreateFrame(
|
| + gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta()));
|
| + message_loop_.RunUntilIdle();
|
| + ASSERT_FALSE(video_frame_factory->MaybeCreateFrame(
|
| + gfx::Size(kVideoWidth, kVideoHeight), base::TimeDelta()));
|
| +
|
| + // After a power resume event, the factory should produce frames right away
|
| + // because the encoder re-initializes on its own.
|
| + power_source_->GenerateResumeEvent();
|
| + CreateFrameAndMemsetPlane(video_frame_factory.get());
|
| +}
|
| +
|
| } // namespace cast
|
| } // namespace media
|
|
|