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

Unified Diff: remoting/codec/video_encoder_vpx_unittest.cc

Issue 304653002: Extend VideoControl to allow clients to request lossless modes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add tests Created 6 years, 7 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 side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698