OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 // Joint encoder and decoder testing. | 5 // Joint encoder and decoder testing. |
6 // These tests operate directly on the VP8 encoder and decoder, not the | 6 // These tests operate directly on the VP8 encoder and decoder, not the |
7 // transport layer, and are targeted at validating the bit stream. | 7 // transport layer, and are targeted at validating the bit stream. |
8 | 8 |
9 #include <gtest/gtest.h> | 9 #include <gtest/gtest.h> |
10 | 10 |
11 #include "base/bind.h" | |
11 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "media/cast/cast_environment.h" | |
14 #include "media/cast/test/fake_task_runner.h" | |
12 #include "media/cast/test/video_utility.h" | 15 #include "media/cast/test/video_utility.h" |
13 #include "media/cast/video_receiver/codecs/vp8/vp8_decoder.h" | 16 #include "media/cast/video_receiver/codecs/vp8/vp8_decoder.h" |
14 #include "media/cast/video_sender/codecs/vp8/vp8_encoder.h" | 17 #include "media/cast/video_sender/codecs/vp8/vp8_encoder.h" |
15 | 18 |
16 namespace media { | 19 namespace media { |
17 namespace cast { | 20 namespace cast { |
18 | 21 |
19 namespace { | 22 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
| |
20 const int kWidth = 1280; | 23 const int kWidth = 1280; |
21 const int kHeight = 720; | 24 const int kHeight = 720; |
22 const int kStartbitrate = 4000000; | 25 const int kStartbitrate = 4000000; |
23 const int kMaxQp = 54; | 26 const int kMaxQp = 54; |
24 const int kMinQp = 4; | 27 const int kMinQp = 4; |
25 const int kMaxFrameRate = 30; | 28 const int kMaxFrameRate = 30; |
26 } // namespace | 29 |
30 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.
| |
31 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.
| |
32 public: | |
33 EncodeDecodeTestFrameCallback() | |
34 : num_called_(0), | |
35 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.
| |
36 original_frame_.width = kWidth; | |
37 original_frame_.height = kHeight; | |
38 } | |
39 | |
40 void SetFrameStartValue(int start_value) { | |
41 PopulateVideoFrame(&original_frame_, start_value); | |
42 } | |
43 | |
44 void DecodeComplete(scoped_ptr<I420VideoFrame> decoded_frame, | |
45 const base::TimeTicks& render_time) { | |
46 ++num_called_; | |
47 // Compare frames. | |
48 // Compare resolution. | |
49 EXPECT_EQ(original_frame_.width, decoded_frame->width); | |
50 EXPECT_EQ(original_frame_.height, decoded_frame->height); | |
51 // Compare data. | |
52 EXPECT_GT(I420PSNR(original_frame_, *(decoded_frame.get())), 40.0); | |
53 } | |
54 | |
55 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.
| |
56 return num_called_; | |
57 } | |
58 | |
59 protected: | |
60 virtual ~EncodeDecodeTestFrameCallback() {} | |
61 | |
62 private: | |
63 friend class base::RefCountedThreadSafe<EncodeDecodeTestFrameCallback>; | |
64 | |
65 int num_called_; | |
66 I420VideoFrame original_frame_; | |
67 | |
Alpha Left Google
2013/11/06 02:22:06
nit: remove this empty line.
mikhal
2013/11/06 18:29:16
Done.
| |
68 }; | |
27 | 69 |
28 class EncodeDecodeTest : public ::testing::Test { | 70 class EncodeDecodeTest : public ::testing::Test { |
29 protected: | 71 protected: |
30 EncodeDecodeTest() { | 72 EncodeDecodeTest() |
73 : task_runner_(new test::FakeTaskRunner(&testing_clock_)), | |
74 // CastEnvironment will only be used by the vp8 decoder; Enable only the | |
75 // video decoder and main threads. | |
76 cast_environment_(new CastEnvironment(&testing_clock_, task_runner_, | |
77 NULL, NULL, NULL, task_runner_)), | |
78 test_callback_(new EncodeDecodeTestFrameCallback()) { | |
79 testing_clock_.Advance( | |
80 base::TimeDelta::FromMilliseconds(kStartMillisecond)); | |
31 encoder_config_.max_number_of_video_buffers_used = 1; | 81 encoder_config_.max_number_of_video_buffers_used = 1; |
32 encoder_config_.number_of_cores = 1; | 82 encoder_config_.number_of_cores = 1; |
33 encoder_config_.width = kWidth; | 83 encoder_config_.width = kWidth; |
34 encoder_config_.height = kHeight; | 84 encoder_config_.height = kHeight; |
35 encoder_config_.start_bitrate = kStartbitrate; | 85 encoder_config_.start_bitrate = kStartbitrate; |
36 encoder_config_.min_qp = kMaxQp; | 86 encoder_config_.min_qp = kMaxQp; |
37 encoder_config_.min_qp = kMinQp; | 87 encoder_config_.min_qp = kMinQp; |
38 encoder_config_.max_frame_rate = kMaxFrameRate; | 88 encoder_config_.max_frame_rate = kMaxFrameRate; |
39 int max_unacked_frames = 1; | 89 int max_unacked_frames = 1; |
40 encoder_.reset(new Vp8Encoder(encoder_config_, max_unacked_frames)); | 90 encoder_.reset(new Vp8Encoder(encoder_config_, max_unacked_frames)); |
41 // Initialize to use one core. | 91 // Initialize to use one core. |
42 decoder_.reset(new Vp8Decoder(1)); | 92 decoder_.reset(new Vp8Decoder(1, cast_environment_)); |
43 } | 93 } |
44 | 94 |
95 virtual ~EncodeDecodeTest() {} | |
96 | |
45 virtual void SetUp() { | 97 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.
| |
46 // Create test frame. | 98 // Create test frame. |
47 int start_value = 10; // Random value to start from. | 99 int start_value = 10; // Random value to start from. |
48 video_frame_.reset(new I420VideoFrame()); | 100 video_frame_.reset(new I420VideoFrame()); |
49 video_frame_->width = encoder_config_.width; | 101 video_frame_->width = encoder_config_.width; |
50 video_frame_->height = encoder_config_.height; | 102 video_frame_->height = encoder_config_.height; |
51 PopulateVideoFrame(video_frame_.get(), start_value); | 103 PopulateVideoFrame(video_frame_.get(), start_value); |
104 test_callback_->SetFrameStartValue(start_value); | |
52 } | 105 } |
53 | 106 |
54 virtual void TearDown() { | 107 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.
| |
55 delete [] video_frame_->y_plane.data; | 108 delete [] video_frame_->y_plane.data; |
56 delete [] video_frame_->u_plane.data; | 109 delete [] video_frame_->u_plane.data; |
57 delete [] video_frame_->v_plane.data; | 110 delete [] video_frame_->v_plane.data; |
58 } | 111 } |
59 | 112 |
60 void Compare(const I420VideoFrame& original_image, | |
61 const I420VideoFrame& decoded_image) { | |
62 // Compare resolution. | |
63 EXPECT_EQ(original_image.width, decoded_image.width); | |
64 EXPECT_EQ(original_image.height, decoded_image.height); | |
65 // Compare data. | |
66 EXPECT_GT(I420PSNR(original_image, decoded_image), 40.0); | |
67 } | |
68 | |
69 VideoSenderConfig encoder_config_; | 113 VideoSenderConfig encoder_config_; |
70 scoped_ptr<Vp8Encoder> encoder_; | 114 scoped_ptr<Vp8Encoder> encoder_; |
71 scoped_ptr<Vp8Decoder> decoder_; | 115 scoped_ptr<Vp8Decoder> decoder_; |
72 scoped_ptr<I420VideoFrame> video_frame_; | 116 scoped_ptr<I420VideoFrame> video_frame_; |
117 base::SimpleTestTickClock testing_clock_; | |
118 scoped_refptr<test::FakeTaskRunner> task_runner_; | |
119 scoped_refptr<CastEnvironment> cast_environment_; | |
120 scoped_refptr<EncodeDecodeTestFrameCallback> test_callback_; | |
73 }; | 121 }; |
74 | 122 |
75 TEST_F(EncodeDecodeTest, BasicEncodeDecode) { | 123 TEST_F(EncodeDecodeTest, BasicEncodeDecode) { |
76 EncodedVideoFrame encoded_frame; | 124 EncodedVideoFrame encoded_frame; |
77 I420VideoFrame decoded_frame; | |
78 // Encode frame. | 125 // Encode frame. |
79 encoder_->Encode(*(video_frame_.get()), &encoded_frame); | 126 encoder_->Encode(*(video_frame_.get()), &encoded_frame); |
80 EXPECT_GT(encoded_frame.data.size(), GG_UINT64_C(0)); | 127 EXPECT_GT(encoded_frame.data.size(), GG_UINT64_C(0)); |
81 // Decode frame. | 128 // Decode frame. |
82 decoder_->Decode(encoded_frame, &decoded_frame); | 129 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.
| |
83 // Validate data. | 130 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.
| |
84 Compare(*(video_frame_.get()), decoded_frame); | 131 base::Bind(&EncodeDecodeTestFrameCallback::DecodeComplete, |
132 test_callback_); | |
133 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.
| |
134 task_runner_->RunTasks(); | |
85 } | 135 } |
86 | 136 |
87 } // namespace cast | 137 } // namespace cast |
88 } // namespace media | 138 } // namespace media |
OLD | NEW |