| 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..2775dcbc594c70806d703e312e014d3d83ee8d23 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 {
|
|
|
| +static const int64 kStartMillisecond = GG_INT64_C(1245);
|
| +static const int kWidth = 1280;
|
| +static const int kHeight = 720;
|
| +static const int kStartbitrate = 4000000;
|
| +static const int kMaxQp = 54;
|
| +static const int kMinQp = 4;
|
| +static const int kMaxFrameRate = 30;
|
| +
|
| namespace {
|
| -const int kWidth = 1280;
|
| -const int kHeight = 720;
|
| -const int kStartbitrate = 4000000;
|
| -const int kMaxQp = 54;
|
| -const int kMinQp = 4;
|
| -const int kMaxFrameRate = 30;
|
| +class EncodeDecodeTestFrameCallback :
|
| + public base::RefCountedThreadSafe<EncodeDecodeTestFrameCallback> {
|
| + public:
|
| + EncodeDecodeTestFrameCallback()
|
| + : num_called_(0) {
|
| + 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() const {
|
| + return num_called_;
|
| + }
|
| +
|
| + protected:
|
| + virtual ~EncodeDecodeTestFrameCallback() {}
|
| +
|
| + private:
|
| + friend class base::RefCountedThreadSafe<EncodeDecodeTestFrameCallback>;
|
| +
|
| + int num_called_;
|
| + I420VideoFrame original_frame_;
|
| +};
|
| } // namespace
|
|
|
| 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,49 +89,46 @@ 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 void SetUp() {
|
| + virtual ~EncodeDecodeTest() {}
|
| +
|
| + virtual void SetUp() OVERRIDE {
|
| // Create test frame.
|
| int start_value = 10; // Random value to start from.
|
| video_frame_.reset(new I420VideoFrame());
|
| 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() {
|
| + virtual void TearDown() OVERRIDE {
|
| delete [] video_frame_->y_plane.data;
|
| delete [] video_frame_->u_plane.data;
|
| 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);
|
| + decoder_->Decode(&encoded_frame, base::TimeTicks(), base::Bind(
|
| + &EncodeDecodeTestFrameCallback::DecodeComplete, test_callback_));
|
| + task_runner_->RunTasks();
|
| }
|
|
|
| } // namespace cast
|
|
|