Home | History | Annotate | Download | only in video
      1 /*
      2  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 #include "webrtc/common_types.h"
     13 
     14 namespace webrtc {
     15 
     16 // Builds VP8 codec with 0 simulcast streams.
     17 void BuildVP8Codec(webrtc::VideoCodec* video_codec) {
     18   video_codec->codecType = kVideoCodecVP8;
     19   strncpy(video_codec->plName, "VP8", 4);
     20   video_codec->plType = 100;
     21   video_codec->width = 1280;
     22   video_codec->height = 720;
     23 
     24   video_codec->startBitrate = 1000;  // kbps
     25   video_codec->maxBitrate = 2000;  // kbps
     26   video_codec->minBitrate = 1000;  // kbps
     27   video_codec->maxFramerate = 30;
     28 
     29   video_codec->qpMax = 50;
     30   video_codec->numberOfSimulcastStreams = 0;
     31   video_codec->mode = kRealtimeVideo;
     32 
     33   // Set VP8 codec specific info.
     34   video_codec->codecSpecific.VP8.pictureLossIndicationOn = true;
     35   video_codec->codecSpecific.VP8.feedbackModeOn = true;
     36   video_codec->codecSpecific.VP8.complexity = kComplexityNormal;
     37   video_codec->codecSpecific.VP8.resilience = kResilienceOff;
     38   video_codec->codecSpecific.VP8.numberOfTemporalLayers = 0;
     39   video_codec->codecSpecific.VP8.denoisingOn = true;
     40   video_codec->codecSpecific.VP8.errorConcealmentOn = true;
     41   video_codec->codecSpecific.VP8.automaticResizeOn = true;
     42   video_codec->codecSpecific.VP8.frameDroppingOn = true;
     43   video_codec->codecSpecific.VP8.keyFrameInterval = 200;
     44 }
     45 
     46 
     47 void SetSimulcastSettings(webrtc::VideoCodec* video_codec) {
     48   // Simulcast settings.
     49   video_codec->numberOfSimulcastStreams = 1;
     50   video_codec->simulcastStream[0].width = 320;
     51   video_codec->simulcastStream[0].height = 180;
     52   video_codec->simulcastStream[0].numberOfTemporalLayers = 0;
     53   video_codec->simulcastStream[0].maxBitrate = 100;
     54   video_codec->simulcastStream[0].targetBitrate = 100;
     55   video_codec->simulcastStream[0].minBitrate = 0;
     56   video_codec->simulcastStream[0].qpMax = video_codec->qpMax;
     57 }
     58 
     59 
     60 // This test compares two VideoCodecInst objects except codec specific and
     61 // simulcast streams.
     62 TEST(ViECodecTest, TestCompareCodecs) {
     63   VideoCodec codec1, codec2;
     64   memset(&codec1, 0, sizeof(VideoCodec));
     65   memset(&codec2, 0, sizeof(VideoCodec));
     66 
     67   BuildVP8Codec(&codec1);
     68   BuildVP8Codec(&codec2);
     69 
     70   EXPECT_TRUE(codec1 == codec2);
     71   EXPECT_FALSE(codec1 != codec2);
     72 
     73   // plname is case insensitive.
     74   strncpy(codec2.plName, "vp8", 4);
     75   EXPECT_TRUE(codec1 == codec2);
     76 
     77   codec2.codecType = kVideoCodecUnknown;
     78   EXPECT_FALSE(codec1 == codec2);
     79 
     80   // Modify pltype.
     81   BuildVP8Codec(&codec2);
     82   codec2.plType = 101;
     83   EXPECT_FALSE(codec1 == codec2);
     84 
     85   // Modifing height and width.
     86   BuildVP8Codec(&codec2);
     87   codec2.width = 640;
     88   codec2.height = 480;
     89   EXPECT_FALSE(codec1 == codec2);
     90 
     91   // Modify framerate, default value is 30.
     92   BuildVP8Codec(&codec2);
     93   codec2.maxFramerate = 15;
     94   EXPECT_FALSE(codec1 == codec2);
     95 
     96   // Modifying startBitrate, default value is 1000 kbps.
     97   BuildVP8Codec(&codec2);
     98   codec2.startBitrate = 2000;
     99   EXPECT_FALSE(codec1 == codec2);
    100   // maxBitrate
    101   BuildVP8Codec(&codec2);
    102   codec2.startBitrate = 3000;
    103   EXPECT_FALSE(codec1 == codec2);
    104   // minBirate
    105   BuildVP8Codec(&codec2);
    106   codec2.startBitrate = 500;
    107   EXPECT_FALSE(codec1 == codec2);
    108 
    109   // Modify qpMax.
    110   BuildVP8Codec(&codec2);
    111   codec2.qpMax = 100;
    112   EXPECT_FALSE(codec1 == codec2);
    113 
    114   // Modify mode
    115   BuildVP8Codec(&codec2);
    116   codec2.mode = kScreensharing;
    117   EXPECT_FALSE(codec1 == codec2);
    118 }
    119 
    120 // Test VP8 specific comparision.
    121 TEST(ViECodecTest, TestCompareVP8CodecSpecific) {
    122   VideoCodec codec1, codec2;
    123   memset(&codec1, 0, sizeof(VideoCodec));
    124   memset(&codec2, 0, sizeof(VideoCodec));
    125 
    126   BuildVP8Codec(&codec1);
    127   BuildVP8Codec(&codec2);
    128   EXPECT_TRUE(codec1 == codec2);
    129 
    130   // pictureLossIndicationOn
    131   codec2.codecSpecific.VP8.pictureLossIndicationOn = false;
    132   EXPECT_FALSE(codec1 == codec2);
    133 
    134   // feedbackModeOn
    135   BuildVP8Codec(&codec2);
    136   codec2.codecSpecific.VP8.feedbackModeOn = false;
    137   EXPECT_FALSE(codec1 == codec2);
    138 
    139   // complexity
    140   BuildVP8Codec(&codec2);
    141   codec2.codecSpecific.VP8.complexity = kComplexityHigh;
    142   EXPECT_FALSE(codec1 == codec2);
    143 
    144   // resilience
    145   BuildVP8Codec(&codec2);
    146   codec2.codecSpecific.VP8.resilience = kResilientStream;
    147   EXPECT_FALSE(codec1 == codec2);
    148 
    149   // numberOfTemporalLayers
    150   BuildVP8Codec(&codec2);
    151   codec2.codecSpecific.VP8.numberOfTemporalLayers = 2;
    152   EXPECT_FALSE(codec1 == codec2);
    153 
    154   // denoisingOn
    155   BuildVP8Codec(&codec2);
    156   codec2.codecSpecific.VP8.denoisingOn = false;
    157   EXPECT_FALSE(codec1 == codec2);
    158 
    159   // errorConcealmentOn
    160   BuildVP8Codec(&codec2);
    161   codec2.codecSpecific.VP8.errorConcealmentOn = false;
    162   EXPECT_FALSE(codec1 == codec2);
    163 
    164   // pictureLossIndicationOn
    165   BuildVP8Codec(&codec2);
    166   codec2.codecSpecific.VP8.automaticResizeOn = false;
    167   EXPECT_FALSE(codec1 == codec2);
    168 
    169   // frameDroppingOn
    170   BuildVP8Codec(&codec2);
    171   codec2.codecSpecific.VP8.frameDroppingOn = false;
    172   EXPECT_FALSE(codec1 == codec2);
    173 
    174   // keyFrameInterval
    175   BuildVP8Codec(&codec2);
    176   codec2.codecSpecific.VP8.keyFrameInterval = 100;
    177   EXPECT_FALSE(codec1 == codec2);
    178 }
    179 
    180 // This test compares simulcast stream information in VideoCodec.
    181 TEST(ViECodecTest, TestCompareSimulcastStreams) {
    182   VideoCodec codec1, codec2;
    183   memset(&codec1, 0, sizeof(VideoCodec));
    184   memset(&codec2, 0, sizeof(VideoCodec));
    185 
    186   BuildVP8Codec(&codec1);
    187   BuildVP8Codec(&codec2);
    188   // Set simulacast settings.
    189   SetSimulcastSettings(&codec1);
    190   SetSimulcastSettings(&codec2);
    191   EXPECT_TRUE(codec1 == codec2);
    192 
    193   // Modify number of streams.
    194   codec2.numberOfSimulcastStreams = 2;
    195   EXPECT_FALSE(codec1 == codec2);
    196 
    197   // Resetting steram count.
    198   codec2.numberOfSimulcastStreams = 1;
    199   // Modify height and width in codec2.
    200   codec2.simulcastStream[0].width = 640;
    201   codec2.simulcastStream[0].height = 480;
    202   EXPECT_FALSE(codec1 == codec2);
    203 
    204   // numberOfTemporalLayers
    205   SetSimulcastSettings(&codec2);
    206   codec2.simulcastStream[0].numberOfTemporalLayers = 2;
    207   EXPECT_FALSE(codec1 == codec2);
    208 
    209   // maxBitrate
    210   SetSimulcastSettings(&codec2);
    211   codec2.simulcastStream[0].maxBitrate = 1000;
    212   EXPECT_FALSE(codec1 == codec2);
    213 
    214   // targetBitrate
    215   SetSimulcastSettings(&codec2);
    216   codec2.simulcastStream[0].targetBitrate = 1000;
    217   EXPECT_FALSE(codec1 == codec2);
    218 
    219   // minBitrate
    220   SetSimulcastSettings(&codec2);
    221   codec2.simulcastStream[0].minBitrate = 50;
    222   EXPECT_FALSE(codec1 == codec2);
    223 
    224   // qpMax
    225   SetSimulcastSettings(&codec2);
    226   codec2.simulcastStream[0].qpMax = 100;
    227   EXPECT_FALSE(codec1 == codec2);
    228 }
    229 
    230 }  // namespace webrtc
    231