Chromium Code Reviews| Index: media/cast/test/encode_decode_test.cc |
| diff --git a/media/cast/test/encode_decode_test.cc b/media/cast/test/encode_decode_test.cc |
| index bc2c0a17256fa2e172d1c9c5a36807f33e0eb8ca..2a5d68cb6055eab8ecf99a93df43649f9d62b4be 100644 |
| --- a/media/cast/test/encode_decode_test.cc |
| +++ b/media/cast/test/encode_decode_test.cc |
| @@ -8,7 +8,10 @@ |
| #include <gtest/gtest.h> |
| +#include "base/bind.h" |
| #include "base/memory/scoped_ptr.h" |
| +#include "media/cast/cast_environment.h" |
| +#include "media/cast/test/fake_task_runner.h" |
| #include "media/cast/test/video_utility.h" |
| #include "media/cast/video_receiver/codecs/vp8/vp8_decoder.h" |
| #include "media/cast/video_sender/codecs/vp8/vp8_encoder.h" |
| @@ -16,18 +19,65 @@ |
| namespace media { |
| namespace cast { |
| -namespace { |
| +static const int64 kStartMillisecond = GG_INT64_C(1245); |
|
Alpha Left Google
2013/11/06 02:22:06
The other const values don't have static, why this
mikhal
2013/11/06 18:29:16
The are all local to this file - making them all s
|
| const int kWidth = 1280; |
| const int kHeight = 720; |
| const int kStartbitrate = 4000000; |
| const int kMaxQp = 54; |
| const int kMinQp = 4; |
| const int kMaxFrameRate = 30; |
| -} // namespace |
| + |
| +class EncodeDecodeTestFrameCallback : |
|
Alpha Left Google
2013/11/06 02:22:06
nit: put this in an anonymous namespace.
mikhal
2013/11/06 18:29:16
Done.
|
| + public base::RefCountedThreadSafe<EncodeDecodeTestFrameCallback> { |
|
Alpha Left Google
2013/11/06 02:22:06
nit: I think this is 4 space indentation.
mikhal
2013/11/06 18:29:16
Done.
|
| + public: |
| + EncodeDecodeTestFrameCallback() |
| + : num_called_(0), |
| + original_frame_() { |
|
Alpha Left Google
2013/11/06 02:22:06
nit: This line is not needed.
mikhal
2013/11/06 18:29:16
Done.
|
| + original_frame_.width = kWidth; |
| + original_frame_.height = kHeight; |
| + } |
| + |
| + void SetFrameStartValue(int start_value) { |
| + PopulateVideoFrame(&original_frame_, start_value); |
| + } |
| + |
| + void DecodeComplete(scoped_ptr<I420VideoFrame> decoded_frame, |
| + const base::TimeTicks& render_time) { |
| + ++num_called_; |
| + // Compare frames. |
| + // Compare resolution. |
| + EXPECT_EQ(original_frame_.width, decoded_frame->width); |
| + EXPECT_EQ(original_frame_.height, decoded_frame->height); |
| + // Compare data. |
| + EXPECT_GT(I420PSNR(original_frame_, *(decoded_frame.get())), 40.0); |
| + } |
| + |
| + int num_called() { |
|
Alpha Left Google
2013/11/06 02:22:06
nit: int num_called() const {}
mikhal
2013/11/06 18:29:16
Done.
|
| + return num_called_; |
| + } |
| + |
| + protected: |
| + virtual ~EncodeDecodeTestFrameCallback() {} |
| + |
| + private: |
| + friend class base::RefCountedThreadSafe<EncodeDecodeTestFrameCallback>; |
| + |
| + int num_called_; |
| + I420VideoFrame original_frame_; |
| + |
|
Alpha Left Google
2013/11/06 02:22:06
nit: remove this empty line.
mikhal
2013/11/06 18:29:16
Done.
|
| +}; |
| class EncodeDecodeTest : public ::testing::Test { |
| protected: |
| - EncodeDecodeTest() { |
| + EncodeDecodeTest() |
| + : task_runner_(new test::FakeTaskRunner(&testing_clock_)), |
| + // CastEnvironment will only be used by the vp8 decoder; Enable only the |
| + // video decoder and main threads. |
| + cast_environment_(new CastEnvironment(&testing_clock_, task_runner_, |
| + NULL, NULL, NULL, task_runner_)), |
| + test_callback_(new EncodeDecodeTestFrameCallback()) { |
| + testing_clock_.Advance( |
| + base::TimeDelta::FromMilliseconds(kStartMillisecond)); |
| encoder_config_.max_number_of_video_buffers_used = 1; |
| encoder_config_.number_of_cores = 1; |
| encoder_config_.width = kWidth; |
| @@ -39,9 +89,11 @@ class EncodeDecodeTest : public ::testing::Test { |
| int max_unacked_frames = 1; |
| encoder_.reset(new Vp8Encoder(encoder_config_, max_unacked_frames)); |
| // Initialize to use one core. |
| - decoder_.reset(new Vp8Decoder(1)); |
| + decoder_.reset(new Vp8Decoder(1, cast_environment_)); |
| } |
| + virtual ~EncodeDecodeTest() {} |
| + |
| virtual void SetUp() { |
|
Alpha Left Google
2013/11/06 02:22:06
nit: while you're at it. This should SetUp() OVERR
mikhal
2013/11/06 18:29:16
Done.
|
| // Create test frame. |
| int start_value = 10; // Random value to start from. |
| @@ -49,6 +101,7 @@ class EncodeDecodeTest : public ::testing::Test { |
| video_frame_->width = encoder_config_.width; |
| video_frame_->height = encoder_config_.height; |
| PopulateVideoFrame(video_frame_.get(), start_value); |
| + test_callback_->SetFrameStartValue(start_value); |
| } |
| virtual void TearDown() { |
|
Alpha Left Google
2013/11/06 02:22:06
nit: while you're at it. This should TearDown() OV
mikhal
2013/11/06 18:29:16
Done.
|
| @@ -57,31 +110,28 @@ class EncodeDecodeTest : public ::testing::Test { |
| delete [] video_frame_->v_plane.data; |
| } |
| - void Compare(const I420VideoFrame& original_image, |
| - const I420VideoFrame& decoded_image) { |
| - // Compare resolution. |
| - EXPECT_EQ(original_image.width, decoded_image.width); |
| - EXPECT_EQ(original_image.height, decoded_image.height); |
| - // Compare data. |
| - EXPECT_GT(I420PSNR(original_image, decoded_image), 40.0); |
| - } |
| - |
| VideoSenderConfig encoder_config_; |
| scoped_ptr<Vp8Encoder> encoder_; |
| scoped_ptr<Vp8Decoder> decoder_; |
| scoped_ptr<I420VideoFrame> video_frame_; |
| + base::SimpleTestTickClock testing_clock_; |
| + scoped_refptr<test::FakeTaskRunner> task_runner_; |
| + scoped_refptr<CastEnvironment> cast_environment_; |
| + scoped_refptr<EncodeDecodeTestFrameCallback> test_callback_; |
| }; |
| TEST_F(EncodeDecodeTest, BasicEncodeDecode) { |
| EncodedVideoFrame encoded_frame; |
| - I420VideoFrame decoded_frame; |
| // Encode frame. |
| encoder_->Encode(*(video_frame_.get()), &encoded_frame); |
| EXPECT_GT(encoded_frame.data.size(), GG_UINT64_C(0)); |
| // Decode frame. |
| - decoder_->Decode(encoded_frame, &decoded_frame); |
| - // Validate data. |
| - Compare(*(video_frame_.get()), decoded_frame); |
| + base::TimeTicks render_time; |
|
Alpha Left Google
2013/11/06 02:22:06
nit: There's no need to have this local variable.
mikhal
2013/11/06 18:29:16
Done.
|
| + VideoFrameDecodedCallback frame_decoded_callback = |
|
Alpha Left Google
2013/11/06 02:22:06
nit: We don't usually define the callback as a loc
mikhal
2013/11/06 18:29:16
Done.
|
| + base::Bind(&EncodeDecodeTestFrameCallback::DecodeComplete, |
| + test_callback_); |
| + decoder_->Decode(&encoded_frame, render_time, frame_decoded_callback); |
|
Alpha Left Google
2013/11/06 02:22:06
You can replace render_time with base::TimeTicks()
mikhal
2013/11/06 18:29:16
Done.
|
| + task_runner_->RunTasks(); |
| } |
| } // namespace cast |