/* * 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