Chromium Code Reviews| Index: remoting/codec/video_encoder_vpx_unittest.cc |
| diff --git a/remoting/codec/video_encoder_vpx_unittest.cc b/remoting/codec/video_encoder_vpx_unittest.cc |
| index 462af9c247ac222974e36add45e7ca8ebb7486d3..ccef34c1ec2c238f4b8a94db08febd607223c029 100644 |
| --- a/remoting/codec/video_encoder_vpx_unittest.cc |
| +++ b/remoting/codec/video_encoder_vpx_unittest.cc |
| @@ -13,50 +13,135 @@ |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
| -namespace { |
| - |
| -const int kIntMax = std::numeric_limits<int>::max(); |
| +namespace remoting { |
| -} // namespace |
| +// xRGB pixel colors for use by tests. |
| +const uint32 kBlueColor = 0x0000ff; |
| +const uint32 kGreenColor = 0x00ff00; |
| -namespace remoting { |
| +// Creates a frame stippled between blue and red pixels, which is useful for |
| +// lossy/lossless encode and color tests. |
| +static scoped_ptr<webrtc::DesktopFrame> CreateTestFrame( |
| + const webrtc::DesktopSize& frame_size) { |
| + scoped_ptr<webrtc::DesktopFrame> frame( |
| + new webrtc::BasicDesktopFrame(frame_size)); |
| + for (int x = 0; x < frame_size.width(); ++x) { |
| + for (int y = 0; y < frame_size.height(); ++y) { |
| + uint8* pixel_u8 = frame->data() + (y * frame->stride()) + |
| + (x * webrtc::DesktopFrame::kBytesPerPixel); |
| + *(reinterpret_cast<uint32*>(pixel_u8)) = |
| + ((x + y) & 1) ? kGreenColor : kBlueColor; |
| + } |
| + } |
| + return frame.Pass(); |
| +} |
| -TEST(VideoEncoderVp8Test, TestVideoEncoder) { |
| +TEST(VideoEncoderVpxTest, TestVp8VideoEncoder) { |
| scoped_ptr<VideoEncoderVpx> encoder(VideoEncoderVpx::CreateForVP8()); |
| TestVideoEncoder(encoder.get(), false); |
| } |
| +TEST(VideoEncoderVpxTest, TestVp9VideoEncoder) { |
| + scoped_ptr<VideoEncoderVpx> encoder(VideoEncoderVpx::CreateForVP9()); |
| + // VP9 encoder defaults to lossless encode and lossy (I420) color. |
| + TestVideoEncoder(encoder.get(), false); |
| +} |
| + |
| +// Test that the VP9 encoder can switch between lossy & lossless encode. |
| +TEST(VideoEncoderVpxTest, TestVp9VideoEncoderLossyEncode) { |
| + scoped_ptr<VideoEncoderVpx> encoder(VideoEncoderVpx::CreateForVP9()); |
| + |
| + webrtc::DesktopSize frame_size(1024, 768); |
| + scoped_ptr<webrtc::DesktopFrame> frame(CreateTestFrame(frame_size)); |
| + frame->mutable_updated_region()->SetRect( |
| + webrtc::DesktopRect::MakeSize(frame_size)); |
| + |
| + // Lossy encode the first frame. |
| + encoder->SetLosslessEncode(false); |
| + scoped_ptr<VideoPacket> lossy_packet = encoder->Encode(*frame); |
| + |
| + // Lossless encode the second frame. |
| + encoder->SetLosslessEncode(true); |
| + scoped_ptr<VideoPacket> lossless_packet = encoder->Encode(*frame); |
| + EXPECT_GT(lossless_packet->data().size(), lossy_packet->data().size()); |
| + |
| + // Lossy encode one more frame. |
| + encoder->SetLosslessEncode(false); |
| + lossy_packet = encoder->Encode(*frame); |
| + EXPECT_LT(lossy_packet->data().size(), lossless_packet->data().size()); |
| +} |
| + |
| +// Test that the VP9 encoder can switch between lossy & lossless color. |
| +TEST(VideoEncoderVpxTest, TestVp9VideoEncoderLossyColor) { |
| + scoped_ptr<VideoEncoderVpx> encoder(VideoEncoderVpx::CreateForVP9()); |
| + |
| + webrtc::DesktopSize frame_size(1024, 768); |
| + scoped_ptr<webrtc::DesktopFrame> frame(CreateTestFrame(frame_size)); |
| + frame->mutable_updated_region()->SetRect( |
| + webrtc::DesktopRect::MakeSize(frame_size)); |
| + |
| + // Lossy encode the first frame. |
| + encoder->SetLosslessColor(false); |
| + scoped_ptr<VideoPacket> lossy_packet = encoder->Encode(*frame); |
| + |
| + // Lossless encode the second frame. |
| + encoder->SetLosslessColor(true); |
| + scoped_ptr<VideoPacket> lossless_packet = encoder->Encode(*frame); |
| + EXPECT_GT(lossless_packet->data().size(), lossy_packet->data().size()); |
| + |
| + // Lossy encode one more frame. |
| + encoder->SetLosslessColor(false); |
| + lossy_packet = encoder->Encode(*frame); |
| + EXPECT_LT(lossy_packet->data().size(), lossless_packet->data().size()); |
| +} |
| + |
| +// Test that the VP8 encoder ignores lossless modes without crashing. |
| +TEST(VideoEncoderVpxTest, TestVp8VideoEncoderIgnoreLossy) { |
| + scoped_ptr<VideoEncoderVpx> encoder(VideoEncoderVpx::CreateForVP8()); |
| + |
| + webrtc::DesktopSize frame_size(1024, 768); |
| + scoped_ptr<webrtc::DesktopFrame> frame(CreateTestFrame(frame_size)); |
| + frame->mutable_updated_region()->SetRect( |
| + webrtc::DesktopRect::MakeSize(frame_size)); |
| + |
| + // Encode a frame, to give the encoder a chance to crash if misconfigured. |
| + encoder->SetLosslessEncode(true); |
| + encoder->SetLosslessColor(true); |
| + scoped_ptr<VideoPacket> packet = encoder->Encode(*frame); |
| + EXPECT_TRUE(packet); |
| +} |
| + |
| // Test that calling Encode with a differently-sized media::ScreenCaptureData |
| // does not leak memory. |
| -TEST(VideoEncoderVp8Test, TestSizeChangeNoLeak) { |
| - int height = 1000; |
| - int width = 1000; |
| +TEST(VideoEncoderVpxTest, TestSizeChangeNoLeak) { |
|
Jamie
2014/05/29 22:19:41
Are the changes to this test essential to this CL?
Wez
2014/05/29 22:39:26
Done.
|
| + webrtc::DesktopSize frame_size(1000, 1000); |
| scoped_ptr<VideoEncoderVpx> encoder(VideoEncoderVpx::CreateForVP8()); |
| - scoped_ptr<webrtc::DesktopFrame> frame( |
| - new webrtc::BasicDesktopFrame(webrtc::DesktopSize(width, height))); |
| - |
| + // Create first frame & encode it. |
| + scoped_ptr<webrtc::DesktopFrame> frame(CreateTestFrame(frame_size)); |
| + frame->mutable_updated_region()->SetRect( |
| + webrtc::DesktopRect::MakeSize(frame_size)); |
| scoped_ptr<VideoPacket> packet = encoder->Encode(*frame); |
| EXPECT_TRUE(packet); |
| - height /= 2; |
| - frame.reset( |
| - new webrtc::BasicDesktopFrame(webrtc::DesktopSize(width, height))); |
| + // Halve the size of the frame, and updated region, and encode again. |
| + frame_size.set(frame_size.width(), frame_size.height() / 2); |
| + frame = CreateTestFrame(frame_size); |
| + frame->mutable_updated_region()->SetRect( |
| + webrtc::DesktopRect::MakeSize(frame_size)); |
| packet = encoder->Encode(*frame); |
| EXPECT_TRUE(packet); |
| } |
| // Test that the DPI information is correctly propagated from the |
| // media::ScreenCaptureData to the VideoPacket. |
| -TEST(VideoEncoderVp8Test, TestDpiPropagation) { |
| - int height = 32; |
| - int width = 32; |
| +TEST(VideoEncoderVpxTest, TestDpiPropagation) { |
| + webrtc::DesktopSize frame_size(32, 32); |
| scoped_ptr<VideoEncoderVpx> encoder(VideoEncoderVpx::CreateForVP8()); |
| - scoped_ptr<webrtc::DesktopFrame> frame( |
| - new webrtc::BasicDesktopFrame(webrtc::DesktopSize(width, height))); |
| + scoped_ptr<webrtc::DesktopFrame> frame(CreateTestFrame(frame_size)); |
| frame->set_dpi(webrtc::DesktopVector(96, 97)); |
| scoped_ptr<VideoPacket> packet = encoder->Encode(*frame); |
| EXPECT_EQ(packet->format().x_dpi(), 96); |