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

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

Issue 1094403002: Add power monitoring to the Cast VideoToolbox encoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase on latest version of 1094403002. 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
« no previous file with comments | « media/cast/sender/h264_vt_encoder.cc ('k') | no next file » | 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 <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
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(
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
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
OLDNEW
« no previous file with comments | « media/cast/sender/h264_vt_encoder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698