
VideoCodecDerived added to handle changes to talk (fakewebrtcvideoengine.h). R=mflodman@webrtc.org TBR=mflodman@webrtc.org Review URL: https://webrtc-codereview.appspot.com/10569004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@5784 4adac7df-926f-26a2-2b94-8c16560cd09d
231 lines
6.6 KiB
C++
231 lines
6.6 KiB
C++
/*
|
|
* 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
|