| Index: media/cast/receiver/video_decoder_unittest.cc
|
| diff --git a/media/cast/receiver/video_decoder_unittest.cc b/media/cast/receiver/video_decoder_unittest.cc
|
| index f777cb38b2660dd737e973080cf6570e320a41a8..6fcde7af41c8ee24ea2e0289d47bd0d8bba90b88 100644
|
| --- a/media/cast/receiver/video_decoder_unittest.cc
|
| +++ b/media/cast/receiver/video_decoder_unittest.cc
|
| @@ -3,6 +3,7 @@
|
| // found in the LICENSE file.
|
|
|
| #include <cstdlib>
|
| +#include <vector>
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| @@ -22,14 +23,12 @@ namespace cast {
|
|
|
| namespace {
|
|
|
| -const int kWidth = 360;
|
| -const int kHeight = 240;
|
| +const int kStartingWidth = 360;
|
| +const int kStartingHeight = 240;
|
| const int kFrameRate = 10;
|
|
|
| VideoSenderConfig GetVideoSenderConfigForTest() {
|
| VideoSenderConfig config = GetDefaultVideoSenderConfig();
|
| - config.width = kWidth;
|
| - config.height = kHeight;
|
| config.max_frame_rate = kFrameRate;
|
| return config;
|
| }
|
| @@ -55,6 +54,7 @@ class VideoDecoderTest : public ::testing::TestWithParam<Codec> {
|
| video_decoder_.reset(new VideoDecoder(cast_environment_, GetParam()));
|
| CHECK_EQ(STATUS_VIDEO_INITIALIZED, video_decoder_->InitializationResult());
|
|
|
| + next_frame_size_ = gfx::Size(kStartingWidth, kStartingHeight);
|
| next_frame_timestamp_ = base::TimeDelta();
|
| last_frame_id_ = 0;
|
| seen_a_decoded_frame_ = false;
|
| @@ -63,34 +63,39 @@ class VideoDecoderTest : public ::testing::TestWithParam<Codec> {
|
| total_video_frames_decoded_ = 0;
|
| }
|
|
|
| + void SetNextFrameSize(const gfx::Size& size) {
|
| + next_frame_size_ = size;
|
| + }
|
| +
|
| // Called from the unit test thread to create another EncodedFrame and push it
|
| // into the decoding pipeline.
|
| void FeedMoreVideo(int num_dropped_frames) {
|
| // Prepare a simulated EncodedFrame to feed into the VideoDecoder.
|
|
|
| - const gfx::Size frame_size(kWidth, kHeight);
|
| const scoped_refptr<VideoFrame> video_frame =
|
| VideoFrame::CreateFrame(VideoFrame::YV12,
|
| - frame_size,
|
| - gfx::Rect(frame_size),
|
| - frame_size,
|
| + next_frame_size_,
|
| + gfx::Rect(next_frame_size_),
|
| + next_frame_size_,
|
| next_frame_timestamp_);
|
| + const base::TimeTicks reference_time =
|
| + base::TimeTicks::UnixEpoch() + next_frame_timestamp_;
|
| next_frame_timestamp_ += base::TimeDelta::FromSeconds(1) / kFrameRate;
|
| PopulateVideoFrame(video_frame.get(), 0);
|
|
|
| // Encode |frame| into |encoded_frame->data|.
|
| - scoped_ptr<EncodedFrame> encoded_frame(
|
| - new EncodedFrame());
|
| + scoped_ptr<EncodedFrame> encoded_frame(new EncodedFrame());
|
| // Test only supports VP8, currently.
|
| CHECK_EQ(CODEC_VIDEO_VP8, GetParam());
|
| - vp8_encoder_.Encode(video_frame, base::TimeTicks(), encoded_frame.get());
|
| + vp8_encoder_.Encode(video_frame, reference_time, encoded_frame.get());
|
| // Rewrite frame IDs for testing purposes.
|
| encoded_frame->frame_id = last_frame_id_ + 1 + num_dropped_frames;
|
| - if (last_frame_id_ == 0)
|
| + if (encoded_frame->dependency == EncodedFrame::KEY)
|
| encoded_frame->referenced_frame_id = encoded_frame->frame_id;
|
| else
|
| encoded_frame->referenced_frame_id = encoded_frame->frame_id - 1;
|
| last_frame_id_ = encoded_frame->frame_id;
|
| + ASSERT_EQ(reference_time, encoded_frame->reference_time);
|
|
|
| {
|
| base::AutoLock auto_lock(lock_);
|
| @@ -148,6 +153,7 @@ class VideoDecoderTest : public ::testing::TestWithParam<Codec> {
|
|
|
| const scoped_refptr<StandaloneCastEnvironment> cast_environment_;
|
| scoped_ptr<VideoDecoder> video_decoder_;
|
| + gfx::Size next_frame_size_;
|
| base::TimeDelta next_frame_timestamp_;
|
| uint32 last_frame_id_;
|
| bool seen_a_decoded_frame_;
|
| @@ -186,7 +192,38 @@ TEST_P(VideoDecoderTest, RecoversFromDroppedFrames) {
|
| WaitForAllVideoToBeDecoded();
|
| }
|
|
|
| -INSTANTIATE_TEST_CASE_P(VideoDecoderTestScenarios,
|
| +TEST_P(VideoDecoderTest, DecodesFramesOfVaryingSizes) {
|
| + std::vector<gfx::Size> frame_sizes;
|
| + frame_sizes.push_back(gfx::Size(1280, 720));
|
| + frame_sizes.push_back(gfx::Size(640, 360)); // Shrink both dimensions.
|
| + frame_sizes.push_back(gfx::Size(300, 200)); // Shrink both dimensions again.
|
| + frame_sizes.push_back(gfx::Size(200, 300)); // Same area.
|
| + frame_sizes.push_back(gfx::Size(600, 400)); // Grow both dimensions.
|
| + frame_sizes.push_back(gfx::Size(638, 400)); // Shrink only one dimension.
|
| + frame_sizes.push_back(gfx::Size(638, 398)); // Shrink the other dimension.
|
| + frame_sizes.push_back(gfx::Size(320, 180)); // Shrink both dimensions again.
|
| + frame_sizes.push_back(gfx::Size(322, 180)); // Grow only one dimension.
|
| + frame_sizes.push_back(gfx::Size(322, 182)); // Grow the other dimension.
|
| + frame_sizes.push_back(gfx::Size(1920, 1080)); // Grow both dimensions again.
|
| +
|
| + // Encode one frame at each size.
|
| + for (const auto& frame_size : frame_sizes) {
|
| + SetNextFrameSize(frame_size);
|
| + FeedMoreVideo(0);
|
| + }
|
| +
|
| + // Encode 10 frames at each size.
|
| + for (const auto& frame_size : frame_sizes) {
|
| + SetNextFrameSize(frame_size);
|
| + const int kNumFrames = 10;
|
| + for (int i = 0; i < kNumFrames; ++i)
|
| + FeedMoreVideo(0);
|
| + }
|
| +
|
| + WaitForAllVideoToBeDecoded();
|
| +}
|
| +
|
| +INSTANTIATE_TEST_CASE_P(,
|
| VideoDecoderTest,
|
| ::testing::Values(CODEC_VIDEO_VP8));
|
|
|
|
|