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