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( |
| 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 |