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

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: Address review comments 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
« no previous file with comments | « remoting/codec/video_encoder_vpx.cc ('k') | remoting/host/client_session.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..5d001062cff56afeaf5a94db42a5d64c9945842c 100644
--- a/remoting/codec/video_encoder_vpx_unittest.cc
+++ b/remoting/codec/video_encoder_vpx_unittest.cc
@@ -13,19 +13,104 @@
#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) {
« no previous file with comments | « remoting/codec/video_encoder_vpx.cc ('k') | remoting/host/client_session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698