OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "remoting/codec/codec_test.h" |
| 6 |
5 #include <stddef.h> | 7 #include <stddef.h> |
6 #include <stdint.h> | 8 #include <stdint.h> |
7 #include <stdlib.h> | 9 #include <stdlib.h> |
8 | 10 |
9 #include <deque> | 11 #include <deque> |
| 12 #include <memory> |
10 #include <utility> | 13 #include <utility> |
11 | 14 |
12 #include "base/bind.h" | 15 #include "base/bind.h" |
13 #include "base/logging.h" | 16 #include "base/logging.h" |
14 #include "base/macros.h" | 17 #include "base/macros.h" |
15 #include "base/memory/scoped_ptr.h" | |
16 #include "media/base/video_frame.h" | 18 #include "media/base/video_frame.h" |
17 #include "remoting/base/util.h" | 19 #include "remoting/base/util.h" |
18 #include "remoting/codec/codec_test.h" | |
19 #include "remoting/codec/video_decoder.h" | 20 #include "remoting/codec/video_decoder.h" |
20 #include "remoting/codec/video_encoder.h" | 21 #include "remoting/codec/video_encoder.h" |
21 #include "remoting/proto/video.pb.h" | 22 #include "remoting/proto/video.pb.h" |
22 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
23 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" | 24 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
24 | 25 |
25 using webrtc::BasicDesktopFrame; | 26 using webrtc::BasicDesktopFrame; |
26 using webrtc::DesktopFrame; | 27 using webrtc::DesktopFrame; |
27 using webrtc::DesktopRect; | 28 using webrtc::DesktopRect; |
28 using webrtc::DesktopRegion; | 29 using webrtc::DesktopRegion; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 void Reset() { | 70 void Reset() { |
70 frame_.reset(new BasicDesktopFrame(frame_->size())); | 71 frame_.reset(new BasicDesktopFrame(frame_->size())); |
71 expected_region_.Clear(); | 72 expected_region_.Clear(); |
72 } | 73 } |
73 | 74 |
74 void ResetRenderedData() { | 75 void ResetRenderedData() { |
75 memset(frame_->data(), 0, | 76 memset(frame_->data(), 0, |
76 frame_->size().width() * frame_->size().height() * kBytesPerPixel); | 77 frame_->size().width() * frame_->size().height() * kBytesPerPixel); |
77 } | 78 } |
78 | 79 |
79 void ReceivedPacket(scoped_ptr<VideoPacket> packet) { | 80 void ReceivedPacket(std::unique_ptr<VideoPacket> packet) { |
80 ASSERT_TRUE(decoder_->DecodePacket(*packet, frame_.get())); | 81 ASSERT_TRUE(decoder_->DecodePacket(*packet, frame_.get())); |
81 } | 82 } |
82 | 83 |
83 void set_strict(bool strict) { | 84 void set_strict(bool strict) { |
84 strict_ = strict; | 85 strict_ = strict; |
85 } | 86 } |
86 | 87 |
87 void set_expected_frame(DesktopFrame* frame) { | 88 void set_expected_frame(DesktopFrame* frame) { |
88 expected_frame_ = frame; | 89 expected_frame_ = frame; |
89 } | 90 } |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 } | 160 } |
160 original++; | 161 original++; |
161 decoded++; | 162 decoded++; |
162 return sqrt(error_sum_squares / 3.0); | 163 return sqrt(error_sum_squares / 3.0); |
163 } | 164 } |
164 | 165 |
165 private: | 166 private: |
166 bool strict_; | 167 bool strict_; |
167 DesktopRegion expected_region_; | 168 DesktopRegion expected_region_; |
168 VideoDecoder* decoder_; | 169 VideoDecoder* decoder_; |
169 scoped_ptr<DesktopFrame> frame_; | 170 std::unique_ptr<DesktopFrame> frame_; |
170 DesktopFrame* expected_frame_; | 171 DesktopFrame* expected_frame_; |
171 | 172 |
172 DISALLOW_COPY_AND_ASSIGN(VideoDecoderTester); | 173 DISALLOW_COPY_AND_ASSIGN(VideoDecoderTester); |
173 }; | 174 }; |
174 | 175 |
175 // The VideoEncoderTester provides a hook for retrieving the data, and passing | 176 // The VideoEncoderTester provides a hook for retrieving the data, and passing |
176 // the message to other subprograms for validaton. | 177 // the message to other subprograms for validaton. |
177 class VideoEncoderTester { | 178 class VideoEncoderTester { |
178 public: | 179 public: |
179 VideoEncoderTester() : decoder_tester_(nullptr), data_available_(0) {} | 180 VideoEncoderTester() : decoder_tester_(nullptr), data_available_(0) {} |
180 | 181 |
181 ~VideoEncoderTester() { | 182 ~VideoEncoderTester() { |
182 EXPECT_GT(data_available_, 0); | 183 EXPECT_GT(data_available_, 0); |
183 } | 184 } |
184 | 185 |
185 void DataAvailable(scoped_ptr<VideoPacket> packet) { | 186 void DataAvailable(std::unique_ptr<VideoPacket> packet) { |
186 ++data_available_; | 187 ++data_available_; |
187 // Send the message to the VideoDecoderTester. | 188 // Send the message to the VideoDecoderTester. |
188 if (decoder_tester_) { | 189 if (decoder_tester_) { |
189 decoder_tester_->ReceivedPacket(std::move(packet)); | 190 decoder_tester_->ReceivedPacket(std::move(packet)); |
190 } | 191 } |
191 } | 192 } |
192 | 193 |
193 void set_decoder_tester(VideoDecoderTester* decoder_tester) { | 194 void set_decoder_tester(VideoDecoderTester* decoder_tester) { |
194 decoder_tester_ = decoder_tester; | 195 decoder_tester_ = decoder_tester; |
195 } | 196 } |
196 | 197 |
197 private: | 198 private: |
198 VideoDecoderTester* decoder_tester_; | 199 VideoDecoderTester* decoder_tester_; |
199 int data_available_; | 200 int data_available_; |
200 | 201 |
201 DISALLOW_COPY_AND_ASSIGN(VideoEncoderTester); | 202 DISALLOW_COPY_AND_ASSIGN(VideoEncoderTester); |
202 }; | 203 }; |
203 | 204 |
204 scoped_ptr<DesktopFrame> PrepareFrame(const DesktopSize& size) { | 205 std::unique_ptr<DesktopFrame> PrepareFrame(const DesktopSize& size) { |
205 scoped_ptr<DesktopFrame> frame(new BasicDesktopFrame(size)); | 206 std::unique_ptr<DesktopFrame> frame(new BasicDesktopFrame(size)); |
206 | 207 |
207 srand(0); | 208 srand(0); |
208 int memory_size = size.width() * size.height() * kBytesPerPixel; | 209 int memory_size = size.width() * size.height() * kBytesPerPixel; |
209 for (int i = 0; i < memory_size; ++i) { | 210 for (int i = 0; i < memory_size; ++i) { |
210 frame->data()[i] = rand() % 256; | 211 frame->data()[i] = rand() % 256; |
211 } | 212 } |
212 | 213 |
213 return frame; | 214 return frame; |
214 } | 215 } |
215 | 216 |
216 static void TestEncodingRects(VideoEncoder* encoder, | 217 static void TestEncodingRects(VideoEncoder* encoder, |
217 VideoEncoderTester* tester, | 218 VideoEncoderTester* tester, |
218 DesktopFrame* frame, | 219 DesktopFrame* frame, |
219 const DesktopRegion& region) { | 220 const DesktopRegion& region) { |
220 *frame->mutable_updated_region() = region; | 221 *frame->mutable_updated_region() = region; |
221 tester->DataAvailable(encoder->Encode(*frame)); | 222 tester->DataAvailable(encoder->Encode(*frame)); |
222 } | 223 } |
223 | 224 |
224 void TestVideoEncoder(VideoEncoder* encoder, bool strict) { | 225 void TestVideoEncoder(VideoEncoder* encoder, bool strict) { |
225 const int kSizes[] = {80, 79, 77, 54}; | 226 const int kSizes[] = {80, 79, 77, 54}; |
226 | 227 |
227 VideoEncoderTester tester; | 228 VideoEncoderTester tester; |
228 | 229 |
229 for (size_t xi = 0; xi < arraysize(kSizes); ++xi) { | 230 for (size_t xi = 0; xi < arraysize(kSizes); ++xi) { |
230 for (size_t yi = 0; yi < arraysize(kSizes); ++yi) { | 231 for (size_t yi = 0; yi < arraysize(kSizes); ++yi) { |
231 DesktopSize size(kSizes[xi], kSizes[yi]); | 232 DesktopSize size(kSizes[xi], kSizes[yi]); |
232 scoped_ptr<DesktopFrame> frame = PrepareFrame(size); | 233 std::unique_ptr<DesktopFrame> frame = PrepareFrame(size); |
233 for (const DesktopRegion& region : MakeTestRegionLists(size)) { | 234 for (const DesktopRegion& region : MakeTestRegionLists(size)) { |
234 TestEncodingRects(encoder, &tester, frame.get(), region); | 235 TestEncodingRects(encoder, &tester, frame.get(), region); |
235 } | 236 } |
236 | 237 |
237 // Pass some empty frames through the encoder. | 238 // Pass some empty frames through the encoder. |
238 for (int i = 0; i < 5; ++i) { | 239 for (int i = 0; i < 5; ++i) { |
239 TestEncodingRects(encoder, &tester, frame.get(), DesktopRegion()); | 240 TestEncodingRects(encoder, &tester, frame.get(), DesktopRegion()); |
240 } | 241 } |
241 } | 242 } |
242 } | 243 } |
243 } | 244 } |
244 | 245 |
245 void TestVideoEncoderEmptyFrames(VideoEncoder* encoder, | 246 void TestVideoEncoderEmptyFrames(VideoEncoder* encoder, |
246 int max_topoff_frames) { | 247 int max_topoff_frames) { |
247 const DesktopSize kSize(100, 100); | 248 const DesktopSize kSize(100, 100); |
248 scoped_ptr<DesktopFrame> frame(PrepareFrame(kSize)); | 249 std::unique_ptr<DesktopFrame> frame(PrepareFrame(kSize)); |
249 | 250 |
250 frame->mutable_updated_region()->SetRect( | 251 frame->mutable_updated_region()->SetRect( |
251 webrtc::DesktopRect::MakeSize(kSize)); | 252 webrtc::DesktopRect::MakeSize(kSize)); |
252 EXPECT_TRUE(encoder->Encode(*frame)); | 253 EXPECT_TRUE(encoder->Encode(*frame)); |
253 | 254 |
254 int topoff_frames = 0; | 255 int topoff_frames = 0; |
255 frame->mutable_updated_region()->Clear(); | 256 frame->mutable_updated_region()->Clear(); |
256 for (int i = 0; i < max_topoff_frames + 1; ++i) { | 257 for (int i = 0; i < max_topoff_frames + 1; ++i) { |
257 if (!encoder->Encode(*frame)) | 258 if (!encoder->Encode(*frame)) |
258 break; | 259 break; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 decoder_tester->Reset(); | 293 decoder_tester->Reset(); |
293 } | 294 } |
294 | 295 |
295 void TestVideoEncoderDecoder(VideoEncoder* encoder, | 296 void TestVideoEncoderDecoder(VideoEncoder* encoder, |
296 VideoDecoder* decoder, | 297 VideoDecoder* decoder, |
297 bool strict) { | 298 bool strict) { |
298 DesktopSize kSize = DesktopSize(160, 120); | 299 DesktopSize kSize = DesktopSize(160, 120); |
299 | 300 |
300 VideoEncoderTester encoder_tester; | 301 VideoEncoderTester encoder_tester; |
301 | 302 |
302 scoped_ptr<DesktopFrame> frame = PrepareFrame(kSize); | 303 std::unique_ptr<DesktopFrame> frame = PrepareFrame(kSize); |
303 | 304 |
304 VideoDecoderTester decoder_tester(decoder, kSize); | 305 VideoDecoderTester decoder_tester(decoder, kSize); |
305 decoder_tester.set_strict(strict); | 306 decoder_tester.set_strict(strict); |
306 decoder_tester.set_expected_frame(frame.get()); | 307 decoder_tester.set_expected_frame(frame.get()); |
307 encoder_tester.set_decoder_tester(&decoder_tester); | 308 encoder_tester.set_decoder_tester(&decoder_tester); |
308 | 309 |
309 for (const DesktopRegion& region : MakeTestRegionLists(kSize)) { | 310 for (const DesktopRegion& region : MakeTestRegionLists(kSize)) { |
310 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, | 311 TestEncodeDecodeRects(encoder, &encoder_tester, &decoder_tester, |
311 frame.get(), region); | 312 frame.get(), region); |
312 } | 313 } |
(...skipping 10 matching lines...) Expand all Loading... |
323 *p++ = 0; | 324 *p++ = 0; |
324 } | 325 } |
325 } | 326 } |
326 } | 327 } |
327 | 328 |
328 void TestVideoEncoderDecoderGradient(VideoEncoder* encoder, | 329 void TestVideoEncoderDecoderGradient(VideoEncoder* encoder, |
329 VideoDecoder* decoder, | 330 VideoDecoder* decoder, |
330 const DesktopSize& screen_size, | 331 const DesktopSize& screen_size, |
331 double max_error_limit, | 332 double max_error_limit, |
332 double mean_error_limit) { | 333 double mean_error_limit) { |
333 scoped_ptr<BasicDesktopFrame> frame( | 334 std::unique_ptr<BasicDesktopFrame> frame(new BasicDesktopFrame(screen_size)); |
334 new BasicDesktopFrame(screen_size)); | |
335 FillWithGradient(frame.get()); | 335 FillWithGradient(frame.get()); |
336 frame->mutable_updated_region()->SetRect(DesktopRect::MakeSize(screen_size)); | 336 frame->mutable_updated_region()->SetRect(DesktopRect::MakeSize(screen_size)); |
337 | 337 |
338 VideoDecoderTester decoder_tester(decoder, screen_size); | 338 VideoDecoderTester decoder_tester(decoder, screen_size); |
339 decoder_tester.set_expected_frame(frame.get()); | 339 decoder_tester.set_expected_frame(frame.get()); |
340 decoder_tester.AddRegion(frame->updated_region()); | 340 decoder_tester.AddRegion(frame->updated_region()); |
341 decoder_tester.ReceivedPacket(encoder->Encode(*frame)); | 341 decoder_tester.ReceivedPacket(encoder->Encode(*frame)); |
342 | 342 |
343 decoder_tester.VerifyResultsApprox(max_error_limit, mean_error_limit); | 343 decoder_tester.VerifyResultsApprox(max_error_limit, mean_error_limit); |
344 } | 344 } |
345 | 345 |
346 } // namespace remoting | 346 } // namespace remoting |
OLD | NEW |