aboutsummaryrefslogtreecommitdiff
path: root/webrtc/video/vie_codec_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'webrtc/video/vie_codec_unittest.cc')
-rw-r--r--webrtc/video/vie_codec_unittest.cc230
1 files changed, 230 insertions, 0 deletions
diff --git a/webrtc/video/vie_codec_unittest.cc b/webrtc/video/vie_codec_unittest.cc
new file mode 100644
index 0000000000..9f648ec521
--- /dev/null
+++ b/webrtc/video/vie_codec_unittest.cc
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "webrtc/common_types.h"
+
+namespace webrtc {
+
+// Builds VP8 codec with 0 simulcast streams.
+void BuildVP8Codec(webrtc::VideoCodec* video_codec) {
+ video_codec->codecType = kVideoCodecVP8;
+ strncpy(video_codec->plName, "VP8", 4);
+ video_codec->plType = 100;
+ video_codec->width = 1280;
+ video_codec->height = 720;
+
+ video_codec->startBitrate = 1000; // kbps
+ video_codec->maxBitrate = 2000; // kbps
+ video_codec->minBitrate = 1000; // kbps
+ video_codec->maxFramerate = 30;
+
+ video_codec->qpMax = 50;
+ video_codec->numberOfSimulcastStreams = 0;
+ video_codec->mode = kRealtimeVideo;
+
+ // Set VP8 codec specific info.
+ video_codec->codecSpecific.VP8.pictureLossIndicationOn = true;
+ video_codec->codecSpecific.VP8.feedbackModeOn = true;
+ video_codec->codecSpecific.VP8.complexity = kComplexityNormal;
+ video_codec->codecSpecific.VP8.resilience = kResilienceOff;
+ video_codec->codecSpecific.VP8.numberOfTemporalLayers = 0;
+ video_codec->codecSpecific.VP8.denoisingOn = true;
+ video_codec->codecSpecific.VP8.errorConcealmentOn = true;
+ video_codec->codecSpecific.VP8.automaticResizeOn = true;
+ video_codec->codecSpecific.VP8.frameDroppingOn = true;
+ video_codec->codecSpecific.VP8.keyFrameInterval = 200;
+}
+
+
+void SetSimulcastSettings(webrtc::VideoCodec* video_codec) {
+ // Simulcast settings.
+ video_codec->numberOfSimulcastStreams = 1;
+ video_codec->simulcastStream[0].width = 320;
+ video_codec->simulcastStream[0].height = 180;
+ video_codec->simulcastStream[0].numberOfTemporalLayers = 0;
+ video_codec->simulcastStream[0].maxBitrate = 100;
+ video_codec->simulcastStream[0].targetBitrate = 100;
+ video_codec->simulcastStream[0].minBitrate = 0;
+ video_codec->simulcastStream[0].qpMax = video_codec->qpMax;
+}
+
+
+// This test compares two VideoCodecInst objects except codec specific and
+// simulcast streams.
+TEST(ViECodecTest, TestCompareCodecs) {
+ VideoCodec codec1, codec2;
+ memset(&codec1, 0, sizeof(VideoCodec));
+ memset(&codec2, 0, sizeof(VideoCodec));
+
+ BuildVP8Codec(&codec1);
+ BuildVP8Codec(&codec2);
+
+ EXPECT_TRUE(codec1 == codec2);
+ EXPECT_FALSE(codec1 != codec2);
+
+ // plname is case insensitive.
+ strncpy(codec2.plName, "vp8", 4);
+ EXPECT_TRUE(codec1 == codec2);
+
+ codec2.codecType = kVideoCodecUnknown;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // Modify pltype.
+ BuildVP8Codec(&codec2);
+ codec2.plType = 101;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // Modifing height and width.
+ BuildVP8Codec(&codec2);
+ codec2.width = 640;
+ codec2.height = 480;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // Modify framerate, default value is 30.
+ BuildVP8Codec(&codec2);
+ codec2.maxFramerate = 15;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // Modifying startBitrate, default value is 1000 kbps.
+ BuildVP8Codec(&codec2);
+ codec2.startBitrate = 2000;
+ EXPECT_FALSE(codec1 == codec2);
+ // maxBitrate
+ BuildVP8Codec(&codec2);
+ codec2.startBitrate = 3000;
+ EXPECT_FALSE(codec1 == codec2);
+ // minBirate
+ BuildVP8Codec(&codec2);
+ codec2.startBitrate = 500;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // Modify qpMax.
+ BuildVP8Codec(&codec2);
+ codec2.qpMax = 100;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // Modify mode
+ BuildVP8Codec(&codec2);
+ codec2.mode = kScreensharing;
+ EXPECT_FALSE(codec1 == codec2);
+}
+
+// Test VP8 specific comparision.
+TEST(ViECodecTest, TestCompareVP8CodecSpecific) {
+ VideoCodec codec1, codec2;
+ memset(&codec1, 0, sizeof(VideoCodec));
+ memset(&codec2, 0, sizeof(VideoCodec));
+
+ BuildVP8Codec(&codec1);
+ BuildVP8Codec(&codec2);
+ EXPECT_TRUE(codec1 == codec2);
+
+ // pictureLossIndicationOn
+ codec2.codecSpecific.VP8.pictureLossIndicationOn = false;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // feedbackModeOn
+ BuildVP8Codec(&codec2);
+ codec2.codecSpecific.VP8.feedbackModeOn = false;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // complexity
+ BuildVP8Codec(&codec2);
+ codec2.codecSpecific.VP8.complexity = kComplexityHigh;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // resilience
+ BuildVP8Codec(&codec2);
+ codec2.codecSpecific.VP8.resilience = kResilientStream;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // numberOfTemporalLayers
+ BuildVP8Codec(&codec2);
+ codec2.codecSpecific.VP8.numberOfTemporalLayers = 2;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // denoisingOn
+ BuildVP8Codec(&codec2);
+ codec2.codecSpecific.VP8.denoisingOn = false;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // errorConcealmentOn
+ BuildVP8Codec(&codec2);
+ codec2.codecSpecific.VP8.errorConcealmentOn = false;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // pictureLossIndicationOn
+ BuildVP8Codec(&codec2);
+ codec2.codecSpecific.VP8.automaticResizeOn = false;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // frameDroppingOn
+ BuildVP8Codec(&codec2);
+ codec2.codecSpecific.VP8.frameDroppingOn = false;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // keyFrameInterval
+ BuildVP8Codec(&codec2);
+ codec2.codecSpecific.VP8.keyFrameInterval = 100;
+ EXPECT_FALSE(codec1 == codec2);
+}
+
+// This test compares simulcast stream information in VideoCodec.
+TEST(ViECodecTest, TestCompareSimulcastStreams) {
+ VideoCodec codec1, codec2;
+ memset(&codec1, 0, sizeof(VideoCodec));
+ memset(&codec2, 0, sizeof(VideoCodec));
+
+ BuildVP8Codec(&codec1);
+ BuildVP8Codec(&codec2);
+ // Set simulacast settings.
+ SetSimulcastSettings(&codec1);
+ SetSimulcastSettings(&codec2);
+ EXPECT_TRUE(codec1 == codec2);
+
+ // Modify number of streams.
+ codec2.numberOfSimulcastStreams = 2;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // Resetting steram count.
+ codec2.numberOfSimulcastStreams = 1;
+ // Modify height and width in codec2.
+ codec2.simulcastStream[0].width = 640;
+ codec2.simulcastStream[0].height = 480;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // numberOfTemporalLayers
+ SetSimulcastSettings(&codec2);
+ codec2.simulcastStream[0].numberOfTemporalLayers = 2;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // maxBitrate
+ SetSimulcastSettings(&codec2);
+ codec2.simulcastStream[0].maxBitrate = 1000;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // targetBitrate
+ SetSimulcastSettings(&codec2);
+ codec2.simulcastStream[0].targetBitrate = 1000;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // minBitrate
+ SetSimulcastSettings(&codec2);
+ codec2.simulcastStream[0].minBitrate = 50;
+ EXPECT_FALSE(codec1 == codec2);
+
+ // qpMax
+ SetSimulcastSettings(&codec2);
+ codec2.simulcastStream[0].qpMax = 100;
+ EXPECT_FALSE(codec1 == codec2);
+}
+
+} // namespace webrtc