diff options
Diffstat (limited to 'webrtc/video/vie_codec_unittest.cc')
-rw-r--r-- | webrtc/video/vie_codec_unittest.cc | 230 |
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 |