OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 #include <vector> | 5 #include <vector> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "media/base/video_frame.h" | 10 #include "media/base/video_frame.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 return; | 38 return; |
39 } | 39 } |
40 callback.Run(shm.Pass()); | 40 callback.Run(shm.Pass()); |
41 } | 41 } |
42 | 42 |
43 class TestVideoEncoderCallback | 43 class TestVideoEncoderCallback |
44 : public base::RefCountedThreadSafe<TestVideoEncoderCallback> { | 44 : public base::RefCountedThreadSafe<TestVideoEncoderCallback> { |
45 public: | 45 public: |
46 TestVideoEncoderCallback() {} | 46 TestVideoEncoderCallback() {} |
47 | 47 |
48 void SetExpectedResult(bool expected_key_frame, | 48 void SetExpectedResult(uint32 expected_frame_id, |
49 uint8 expected_frame_id, | 49 uint32 expected_last_referenced_frame_id, |
50 uint8 expected_last_referenced_frame_id, | |
51 const base::TimeTicks& expected_capture_time) { | 50 const base::TimeTicks& expected_capture_time) { |
52 expected_key_frame_ = expected_key_frame; | |
53 expected_frame_id_ = expected_frame_id; | 51 expected_frame_id_ = expected_frame_id; |
54 expected_last_referenced_frame_id_ = expected_last_referenced_frame_id; | 52 expected_last_referenced_frame_id_ = expected_last_referenced_frame_id; |
55 expected_capture_time_ = expected_capture_time; | 53 expected_capture_time_ = expected_capture_time; |
56 } | 54 } |
57 | 55 |
58 void DeliverEncodedVideoFrame( | 56 void DeliverEncodedVideoFrame( |
59 scoped_ptr<transport::EncodedVideoFrame> encoded_frame, | 57 scoped_ptr<transport::EncodedFrame> encoded_frame) { |
60 const base::TimeTicks& capture_time) { | 58 if (expected_frame_id_ == expected_last_referenced_frame_id_) { |
61 EXPECT_EQ(expected_key_frame_, encoded_frame->key_frame); | 59 EXPECT_EQ(transport::EncodedFrame::KEY, encoded_frame->dependency); |
| 60 } else { |
| 61 EXPECT_EQ(transport::EncodedFrame::DEPENDENT, |
| 62 encoded_frame->dependency); |
| 63 } |
62 EXPECT_EQ(expected_frame_id_, encoded_frame->frame_id); | 64 EXPECT_EQ(expected_frame_id_, encoded_frame->frame_id); |
63 EXPECT_EQ(expected_last_referenced_frame_id_, | 65 EXPECT_EQ(expected_last_referenced_frame_id_, |
64 encoded_frame->last_referenced_frame_id); | 66 encoded_frame->referenced_frame_id); |
65 EXPECT_EQ(expected_capture_time_, capture_time); | 67 EXPECT_EQ(expected_capture_time_, encoded_frame->reference_time); |
66 } | 68 } |
67 | 69 |
68 protected: | 70 protected: |
69 virtual ~TestVideoEncoderCallback() {} | 71 virtual ~TestVideoEncoderCallback() {} |
70 | 72 |
71 private: | 73 private: |
72 friend class base::RefCountedThreadSafe<TestVideoEncoderCallback>; | 74 friend class base::RefCountedThreadSafe<TestVideoEncoderCallback>; |
73 | 75 |
74 bool expected_key_frame_; | 76 bool expected_key_frame_; |
75 uint8 expected_frame_id_; | 77 uint32 expected_frame_id_; |
76 uint8 expected_last_referenced_frame_id_; | 78 uint32 expected_last_referenced_frame_id_; |
77 base::TimeTicks expected_capture_time_; | 79 base::TimeTicks expected_capture_time_; |
78 | 80 |
79 DISALLOW_COPY_AND_ASSIGN(TestVideoEncoderCallback); | 81 DISALLOW_COPY_AND_ASSIGN(TestVideoEncoderCallback); |
80 }; | 82 }; |
81 } // namespace | 83 } // namespace |
82 | 84 |
83 class ExternalVideoEncoderTest : public ::testing::Test { | 85 class ExternalVideoEncoderTest : public ::testing::Test { |
84 protected: | 86 protected: |
85 ExternalVideoEncoderTest() | 87 ExternalVideoEncoderTest() |
86 : test_video_encoder_callback_(new TestVideoEncoderCallback()) { | 88 : test_video_encoder_callback_(new TestVideoEncoderCallback()) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
138 | 140 |
139 TEST_F(ExternalVideoEncoderTest, EncodePattern30fpsRunningOutOfAck) { | 141 TEST_F(ExternalVideoEncoderTest, EncodePattern30fpsRunningOutOfAck) { |
140 task_runner_->RunTasks(); // Run the initializer on the correct thread. | 142 task_runner_->RunTasks(); // Run the initializer on the correct thread. |
141 | 143 |
142 VideoEncoder::FrameEncodedCallback frame_encoded_callback = | 144 VideoEncoder::FrameEncodedCallback frame_encoded_callback = |
143 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, | 145 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, |
144 test_video_encoder_callback_.get()); | 146 test_video_encoder_callback_.get()); |
145 | 147 |
146 base::TimeTicks capture_time; | 148 base::TimeTicks capture_time; |
147 capture_time += base::TimeDelta::FromMilliseconds(33); | 149 capture_time += base::TimeDelta::FromMilliseconds(33); |
148 test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); | 150 test_video_encoder_callback_->SetExpectedResult(0, 0, capture_time); |
149 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 151 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
150 video_frame_, capture_time, frame_encoded_callback)); | 152 video_frame_, capture_time, frame_encoded_callback)); |
151 task_runner_->RunTasks(); | 153 task_runner_->RunTasks(); |
152 | 154 |
153 for (int i = 0; i < 6; ++i) { | 155 for (int i = 0; i < 6; ++i) { |
154 capture_time += base::TimeDelta::FromMilliseconds(33); | 156 capture_time += base::TimeDelta::FromMilliseconds(33); |
155 test_video_encoder_callback_->SetExpectedResult( | 157 test_video_encoder_callback_->SetExpectedResult(i + 1, i, capture_time); |
156 false, i + 1, i, capture_time); | |
157 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 158 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
158 video_frame_, capture_time, frame_encoded_callback)); | 159 video_frame_, capture_time, frame_encoded_callback)); |
159 task_runner_->RunTasks(); | 160 task_runner_->RunTasks(); |
160 } | 161 } |
161 // We need to run the task to cleanup the GPU instance. | 162 // We need to run the task to cleanup the GPU instance. |
162 video_encoder_.reset(NULL); | 163 video_encoder_.reset(NULL); |
163 task_runner_->RunTasks(); | 164 task_runner_->RunTasks(); |
164 } | 165 } |
165 | 166 |
166 TEST_F(ExternalVideoEncoderTest, SkipNextFrame) { | 167 TEST_F(ExternalVideoEncoderTest, SkipNextFrame) { |
167 task_runner_->RunTasks(); // Run the initializer on the correct thread. | 168 task_runner_->RunTasks(); // Run the initializer on the correct thread. |
168 | 169 |
169 VideoEncoder::FrameEncodedCallback frame_encoded_callback = | 170 VideoEncoder::FrameEncodedCallback frame_encoded_callback = |
170 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, | 171 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, |
171 test_video_encoder_callback_.get()); | 172 test_video_encoder_callback_.get()); |
172 | 173 |
173 base::TimeTicks capture_time; | 174 base::TimeTicks capture_time; |
174 capture_time += base::TimeDelta::FromMilliseconds(33); | 175 capture_time += base::TimeDelta::FromMilliseconds(33); |
175 test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); | 176 test_video_encoder_callback_->SetExpectedResult(0, 0, capture_time); |
176 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 177 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
177 video_frame_, capture_time, frame_encoded_callback)); | 178 video_frame_, capture_time, frame_encoded_callback)); |
178 task_runner_->RunTasks(); | 179 task_runner_->RunTasks(); |
179 | 180 |
180 video_encoder_->SkipNextFrame(true); | 181 video_encoder_->SkipNextFrame(true); |
181 for (int i = 0; i < 2; ++i) { | 182 for (int i = 0; i < 2; ++i) { |
182 capture_time += base::TimeDelta::FromMilliseconds(33); | 183 capture_time += base::TimeDelta::FromMilliseconds(33); |
183 EXPECT_FALSE(video_encoder_->EncodeVideoFrame( | 184 EXPECT_FALSE(video_encoder_->EncodeVideoFrame( |
184 video_frame_, capture_time, frame_encoded_callback)); | 185 video_frame_, capture_time, frame_encoded_callback)); |
185 task_runner_->RunTasks(); | 186 task_runner_->RunTasks(); |
186 } | 187 } |
187 | 188 |
188 video_encoder_->SkipNextFrame(false); | 189 video_encoder_->SkipNextFrame(false); |
189 for (int i = 0; i < 2; ++i) { | 190 for (int i = 0; i < 2; ++i) { |
190 capture_time += base::TimeDelta::FromMilliseconds(33); | 191 capture_time += base::TimeDelta::FromMilliseconds(33); |
191 test_video_encoder_callback_->SetExpectedResult( | 192 test_video_encoder_callback_->SetExpectedResult(i + 1, i, capture_time); |
192 false, i + 1, i, capture_time); | |
193 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 193 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
194 video_frame_, capture_time, frame_encoded_callback)); | 194 video_frame_, capture_time, frame_encoded_callback)); |
195 task_runner_->RunTasks(); | 195 task_runner_->RunTasks(); |
196 } | 196 } |
197 // We need to run the task to cleanup the GPU instance. | 197 // We need to run the task to cleanup the GPU instance. |
198 video_encoder_.reset(NULL); | 198 video_encoder_.reset(NULL); |
199 task_runner_->RunTasks(); | 199 task_runner_->RunTasks(); |
200 } | 200 } |
201 | 201 |
202 TEST_F(ExternalVideoEncoderTest, StreamHeader) { | 202 TEST_F(ExternalVideoEncoderTest, StreamHeader) { |
203 task_runner_->RunTasks(); // Run the initializer on the correct thread. | 203 task_runner_->RunTasks(); // Run the initializer on the correct thread. |
204 | 204 |
205 VideoEncoder::FrameEncodedCallback frame_encoded_callback = | 205 VideoEncoder::FrameEncodedCallback frame_encoded_callback = |
206 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, | 206 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, |
207 test_video_encoder_callback_.get()); | 207 test_video_encoder_callback_.get()); |
208 | 208 |
209 // Force the FakeVideoEncodeAccelerator to return a dummy non-key frame first. | 209 // Force the FakeVideoEncodeAccelerator to return a dummy non-key frame first. |
210 fake_vea_->SendDummyFrameForTesting(false); | 210 fake_vea_->SendDummyFrameForTesting(false); |
211 | 211 |
212 // Verify the first returned bitstream buffer is still a key frame. | 212 // Verify the first returned bitstream buffer is still a key frame. |
213 base::TimeTicks capture_time; | 213 base::TimeTicks capture_time; |
214 capture_time += base::TimeDelta::FromMilliseconds(33); | 214 capture_time += base::TimeDelta::FromMilliseconds(33); |
215 test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); | 215 test_video_encoder_callback_->SetExpectedResult(0, 0, capture_time); |
216 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 216 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
217 video_frame_, capture_time, frame_encoded_callback)); | 217 video_frame_, capture_time, frame_encoded_callback)); |
218 task_runner_->RunTasks(); | 218 task_runner_->RunTasks(); |
219 | 219 |
220 // We need to run the task to cleanup the GPU instance. | 220 // We need to run the task to cleanup the GPU instance. |
221 video_encoder_.reset(NULL); | 221 video_encoder_.reset(NULL); |
222 task_runner_->RunTasks(); | 222 task_runner_->RunTasks(); |
223 } | 223 } |
224 | 224 |
225 } // namespace cast | 225 } // namespace cast |
226 } // namespace media | 226 } // namespace media |
OLD | NEW |