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 3// found in the LICENSE file. 4 5#include "remoting/codec/video_decoder_vpx.h" 6 7#include "media/base/video_frame.h" 8#include "remoting/codec/codec_test.h" 9#include "remoting/codec/video_encoder_vpx.h" 10#include "testing/gtest/include/gtest/gtest.h" 11#include "third_party/webrtc/modules/desktop_capture/desktop_geometry.h" 12 13namespace remoting { 14 15namespace { 16 17class VideoDecoderVpxTest : public testing::Test { 18 protected: 19 scoped_ptr<VideoEncoderVpx> encoder_; 20 scoped_ptr<VideoDecoderVpx> decoder_; 21 22 VideoDecoderVpxTest() : encoder_(VideoEncoderVpx::CreateForVP8()), 23 decoder_(VideoDecoderVpx::CreateForVP8()) { 24 } 25 26 void TestGradient(int screen_width, int screen_height, 27 int view_width, int view_height, 28 double max_error_limit, double mean_error_limit) { 29 TestVideoEncoderDecoderGradient( 30 encoder_.get(), decoder_.get(), 31 webrtc::DesktopSize(screen_width, screen_height), 32 webrtc::DesktopSize(view_width, view_height), 33 max_error_limit, mean_error_limit); 34 } 35}; 36 37class VideoDecoderVp8Test : public VideoDecoderVpxTest { 38 protected: 39 VideoDecoderVp8Test() { 40 encoder_ = VideoEncoderVpx::CreateForVP8(); 41 decoder_ = VideoDecoderVpx::CreateForVP8(); 42 } 43}; 44 45class VideoDecoderVp9Test : public VideoDecoderVpxTest { 46 protected: 47 VideoDecoderVp9Test() { 48 encoder_ = VideoEncoderVpx::CreateForVP9(); 49 decoder_ = VideoDecoderVpx::CreateForVP9(); 50 } 51}; 52 53} // namespace 54 55// 56// Test the VP8 codec. 57// 58 59TEST_F(VideoDecoderVp8Test, VideoEncodeAndDecode) { 60 TestVideoEncoderDecoder(encoder_.get(), decoder_.get(), false); 61} 62 63// Check that encoding and decoding a particular frame doesn't change the 64// frame too much. The frame used is a gradient, which does not contain sharp 65// transitions, so encoding lossiness should not be too high. 66TEST_F(VideoDecoderVp8Test, Gradient) { 67 TestGradient(320, 240, 320, 240, 0.04, 0.02); 68} 69 70TEST_F(VideoDecoderVp8Test, GradientScaleUpEvenToEven) { 71 TestGradient(320, 240, 640, 480, 0.04, 0.02); 72} 73 74TEST_F(VideoDecoderVp8Test, GradientScaleUpEvenToOdd) { 75 TestGradient(320, 240, 641, 481, 0.04, 0.02); 76} 77 78TEST_F(VideoDecoderVp8Test, GradientScaleUpOddToEven) { 79 TestGradient(321, 241, 640, 480, 0.04, 0.02); 80} 81 82TEST_F(VideoDecoderVp8Test, GradientScaleUpOddToOdd) { 83 TestGradient(321, 241, 641, 481, 0.04, 0.02); 84} 85 86TEST_F(VideoDecoderVp8Test, GradientScaleDownEvenToEven) { 87 TestGradient(320, 240, 160, 120, 0.04, 0.02); 88} 89 90TEST_F(VideoDecoderVp8Test, GradientScaleDownEvenToOdd) { 91 // The maximum error is non-deterministic. The mean error is not too high, 92 // which suggests that the problem is restricted to a small area of the output 93 // image. See crbug.com/139437 and crbug.com/139633. 94 TestGradient(320, 240, 161, 121, 1.0, 0.02); 95} 96 97TEST_F(VideoDecoderVp8Test, GradientScaleDownOddToEven) { 98 TestGradient(321, 241, 160, 120, 0.04, 0.02); 99} 100 101TEST_F(VideoDecoderVp8Test, GradientScaleDownOddToOdd) { 102 TestGradient(321, 241, 161, 121, 0.04, 0.02); 103} 104 105// 106// Test the VP9 codec. 107// 108 109TEST_F(VideoDecoderVp9Test, VideoEncodeAndDecode) { 110 TestVideoEncoderDecoder(encoder_.get(), decoder_.get(), false); 111} 112 113// Check that encoding and decoding a particular frame doesn't change the 114// frame too much. The frame used is a gradient, which does not contain sharp 115// transitions, so encoding lossiness should not be too high. 116TEST_F(VideoDecoderVp9Test, Gradient) { 117 TestGradient(320, 240, 320, 240, 0.04, 0.02); 118} 119 120TEST_F(VideoDecoderVp9Test, GradientScaleUpEvenToEven) { 121 TestGradient(320, 240, 640, 480, 0.04, 0.02); 122} 123 124TEST_F(VideoDecoderVp9Test, GradientScaleUpEvenToOdd) { 125 TestGradient(320, 240, 641, 481, 0.04, 0.02); 126} 127 128TEST_F(VideoDecoderVp9Test, GradientScaleUpOddToEven) { 129 TestGradient(321, 241, 640, 480, 0.04, 0.02); 130} 131 132TEST_F(VideoDecoderVp9Test, GradientScaleUpOddToOdd) { 133 TestGradient(321, 241, 641, 481, 0.04, 0.02); 134} 135 136TEST_F(VideoDecoderVp9Test, GradientScaleDownEvenToEven) { 137 TestGradient(320, 240, 160, 120, 0.04, 0.02); 138} 139 140TEST_F(VideoDecoderVp9Test, GradientScaleDownEvenToOdd) { 141 // The maximum error is non-deterministic. The mean error is not too high, 142 // which suggests that the problem is restricted to a small area of the output 143 // image. See crbug.com/139437 and crbug.com/139633. 144 TestGradient(320, 240, 161, 121, 1.0, 0.02); 145} 146 147TEST_F(VideoDecoderVp9Test, GradientScaleDownOddToEven) { 148 TestGradient(321, 241, 160, 120, 0.04, 0.02); 149} 150 151TEST_F(VideoDecoderVp9Test, GradientScaleDownOddToOdd) { 152 TestGradient(321, 241, 161, 121, 0.04, 0.02); 153} 154 155} // namespace remoting 156