Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: media/cast/sender/external_video_encoder_unittest.cc

Issue 906403006: [Cast] Size-Adaptable platform video encoders. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed hubbe's comments. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/cast/sender/external_video_encoder.cc ('k') | media/cast/sender/h264_vt_encoder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include <vector>
6
7 #include "base/bind.h"
8 #include "base/memory/ref_counted.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "media/base/video_frame.h"
11 #include "media/cast/cast_defines.h"
12 #include "media/cast/cast_environment.h"
13 #include "media/cast/sender/external_video_encoder.h"
14 #include "media/cast/sender/fake_video_encode_accelerator_factory.h"
15 #include "media/cast/test/fake_single_thread_task_runner.h"
16 #include "media/cast/test/utility/video_utility.h"
17 #include "media/video/fake_video_encode_accelerator.h"
18 #include "testing/gmock/include/gmock/gmock.h"
19
20 namespace media {
21 namespace cast {
22
23 using testing::_;
24
25 namespace {
26
27 class TestVideoEncoderCallback
28 : public base::RefCountedThreadSafe<TestVideoEncoderCallback> {
29 public:
30 TestVideoEncoderCallback() {}
31
32 void SetExpectedResult(uint32 expected_frame_id,
33 uint32 expected_last_referenced_frame_id,
34 uint32 expected_rtp_timestamp,
35 const base::TimeTicks& expected_reference_time) {
36 expected_frame_id_ = expected_frame_id;
37 expected_last_referenced_frame_id_ = expected_last_referenced_frame_id;
38 expected_rtp_timestamp_ = expected_rtp_timestamp;
39 expected_reference_time_ = expected_reference_time;
40 }
41
42 void DeliverEncodedVideoFrame(
43 scoped_ptr<EncodedFrame> encoded_frame) {
44 if (expected_frame_id_ == expected_last_referenced_frame_id_) {
45 EXPECT_EQ(EncodedFrame::KEY, encoded_frame->dependency);
46 } else {
47 EXPECT_EQ(EncodedFrame::DEPENDENT,
48 encoded_frame->dependency);
49 }
50 EXPECT_EQ(expected_frame_id_, encoded_frame->frame_id);
51 EXPECT_EQ(expected_last_referenced_frame_id_,
52 encoded_frame->referenced_frame_id);
53 EXPECT_EQ(expected_rtp_timestamp_, encoded_frame->rtp_timestamp);
54 EXPECT_EQ(expected_reference_time_, encoded_frame->reference_time);
55 }
56
57 protected:
58 virtual ~TestVideoEncoderCallback() {}
59
60 private:
61 friend class base::RefCountedThreadSafe<TestVideoEncoderCallback>;
62
63 uint32 expected_frame_id_;
64 uint32 expected_last_referenced_frame_id_;
65 uint32 expected_rtp_timestamp_;
66 base::TimeTicks expected_reference_time_;
67
68 DISALLOW_COPY_AND_ASSIGN(TestVideoEncoderCallback);
69 };
70 } // namespace
71
72 class ExternalVideoEncoderTest : public ::testing::Test {
73 protected:
74 ExternalVideoEncoderTest()
75 : testing_clock_(new base::SimpleTestTickClock()),
76 task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
77 cast_environment_(new CastEnvironment(
78 scoped_ptr<base::TickClock>(testing_clock_).Pass(),
79 task_runner_,
80 task_runner_,
81 task_runner_)),
82 vea_factory_(task_runner_),
83 operational_status_(STATUS_UNINITIALIZED),
84 test_video_encoder_callback_(new TestVideoEncoderCallback()) {
85 testing_clock_->Advance(base::TimeTicks::Now() - base::TimeTicks());
86
87 video_config_.ssrc = 1;
88 video_config_.receiver_ssrc = 2;
89 video_config_.rtp_payload_type = 127;
90 video_config_.use_external_encoder = true;
91 video_config_.max_bitrate = 5000000;
92 video_config_.min_bitrate = 1000000;
93 video_config_.start_bitrate = 2000000;
94 video_config_.max_qp = 56;
95 video_config_.min_qp = 0;
96 video_config_.max_frame_rate = 30;
97 video_config_.max_number_of_video_buffers_used = 3;
98 video_config_.codec = CODEC_VIDEO_VP8;
99 const gfx::Size size(320, 240);
100 video_frame_ = media::VideoFrame::CreateFrame(
101 VideoFrame::I420, size, gfx::Rect(size), size, base::TimeDelta());
102 PopulateVideoFrame(video_frame_.get(), 123);
103
104 video_encoder_.reset(new ExternalVideoEncoder(
105 cast_environment_,
106 video_config_,
107 size,
108 base::Bind(&ExternalVideoEncoderTest::SaveOperationalStatus,
109 base::Unretained(this)),
110 base::Bind(
111 &FakeVideoEncodeAcceleratorFactory::CreateVideoEncodeAccelerator,
112 base::Unretained(&vea_factory_)),
113 base::Bind(&FakeVideoEncodeAcceleratorFactory::CreateSharedMemory,
114 base::Unretained(&vea_factory_))));
115 }
116
117 ~ExternalVideoEncoderTest() override {}
118
119 void AdvanceClockAndVideoFrameTimestamp() {
120 testing_clock_->Advance(base::TimeDelta::FromMilliseconds(33));
121 video_frame_->set_timestamp(
122 video_frame_->timestamp() + base::TimeDelta::FromMilliseconds(33));
123 }
124
125 void SaveOperationalStatus(OperationalStatus result) {
126 EXPECT_EQ(STATUS_UNINITIALIZED, operational_status_);
127 operational_status_ = result;
128 }
129
130 base::SimpleTestTickClock* const testing_clock_; // Owned by CastEnvironment.
131 const scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
132 const scoped_refptr<CastEnvironment> cast_environment_;
133 FakeVideoEncodeAcceleratorFactory vea_factory_;
134 OperationalStatus operational_status_;
135 scoped_refptr<TestVideoEncoderCallback> test_video_encoder_callback_;
136 VideoSenderConfig video_config_;
137 scoped_ptr<VideoEncoder> video_encoder_;
138 scoped_refptr<media::VideoFrame> video_frame_;
139
140 DISALLOW_COPY_AND_ASSIGN(ExternalVideoEncoderTest);
141 };
142
143 TEST_F(ExternalVideoEncoderTest, EncodePattern30fpsRunningOutOfAck) {
144 vea_factory_.SetAutoRespond(true);
145 task_runner_->RunTasks(); // Run the initializer on the correct thread.
146 EXPECT_EQ(STATUS_INITIALIZED, operational_status_);
147
148 VideoEncoder::FrameEncodedCallback frame_encoded_callback =
149 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame,
150 test_video_encoder_callback_.get());
151
152 test_video_encoder_callback_->SetExpectedResult(
153 0, 0, TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
154 testing_clock_->NowTicks());
155 video_encoder_->SetBitRate(2000);
156 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
157 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
158 task_runner_->RunTasks();
159
160 for (int i = 0; i < 6; ++i) {
161 AdvanceClockAndVideoFrameTimestamp();
162 test_video_encoder_callback_->SetExpectedResult(
163 i + 1,
164 i,
165 TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
166 testing_clock_->NowTicks());
167 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
168 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
169 task_runner_->RunTasks();
170 }
171
172 ASSERT_EQ(1u, vea_factory_.last_response_vea()->stored_bitrates().size());
173 EXPECT_EQ(2000u, vea_factory_.last_response_vea()->stored_bitrates()[0]);
174
175 // We need to run the task to cleanup the GPU instance.
176 video_encoder_.reset(NULL);
177 task_runner_->RunTasks();
178
179 EXPECT_EQ(1, vea_factory_.vea_response_count());
180 EXPECT_EQ(3, vea_factory_.shm_response_count());
181 }
182
183 TEST_F(ExternalVideoEncoderTest, StreamHeader) {
184 vea_factory_.SetAutoRespond(true);
185 task_runner_->RunTasks(); // Run the initializer on the correct thread.
186 EXPECT_EQ(STATUS_INITIALIZED, operational_status_);
187
188 VideoEncoder::FrameEncodedCallback frame_encoded_callback =
189 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame,
190 test_video_encoder_callback_.get());
191
192 // Force the FakeVideoEncodeAccelerator to return a dummy non-key frame first.
193 vea_factory_.last_response_vea()->SendDummyFrameForTesting(false);
194
195 // Verify the first returned bitstream buffer is still a key frame.
196 test_video_encoder_callback_->SetExpectedResult(
197 0, 0, TimeDeltaToRtpDelta(video_frame_->timestamp(), kVideoFrequency),
198 testing_clock_->NowTicks());
199 EXPECT_TRUE(video_encoder_->EncodeVideoFrame(
200 video_frame_, testing_clock_->NowTicks(), frame_encoded_callback));
201 task_runner_->RunTasks();
202
203 // We need to run the task to cleanup the GPU instance.
204 video_encoder_.reset(NULL);
205 task_runner_->RunTasks();
206
207 EXPECT_EQ(1, vea_factory_.vea_response_count());
208 EXPECT_EQ(3, vea_factory_.shm_response_count());
209 }
210
211 // Verify that everything goes well even if ExternalVideoEncoder is destroyed
212 // before it has a chance to receive the VEA creation callback.
213 TEST_F(ExternalVideoEncoderTest, DestroyBeforeVEACreatedCallback) {
214 video_encoder_.reset();
215 EXPECT_EQ(0, vea_factory_.vea_response_count());
216 vea_factory_.SetAutoRespond(true);
217 task_runner_->RunTasks();
218 EXPECT_EQ(1, vea_factory_.vea_response_count());
219 EXPECT_EQ(STATUS_UNINITIALIZED, operational_status_);
220 }
221
222 } // namespace cast
223 } // namespace media
OLDNEW
« no previous file with comments | « media/cast/sender/external_video_encoder.cc ('k') | media/cast/sender/h264_vt_encoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698