Home | History | Annotate | Download | only in source
      1 /*
      2  *  Copyright (c) 2012 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 <iostream>
     12 
     13 #include "webrtc/engine_configurations.h"
     14 #include "webrtc/test/testsupport/fileutils.h"
     15 #include "webrtc/video_engine/include/vie_rtp_rtcp.h"
     16 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
     17 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
     18 #include "webrtc/video_engine/test/libvietest/include/tb_capture_device.h"
     19 #include "webrtc/video_engine/test/libvietest/include/tb_external_transport.h"
     20 #include "webrtc/video_engine/test/libvietest/include/tb_interfaces.h"
     21 #include "webrtc/video_engine/test/libvietest/include/tb_video_channel.h"
     22 
     23 class ViERtpObserver: public webrtc::ViERTPObserver
     24 {
     25 public:
     26     ViERtpObserver()
     27     {
     28     }
     29     virtual ~ViERtpObserver()
     30     {
     31     }
     32 
     33     virtual void IncomingSSRCChanged(const int videoChannel,
     34                                      const unsigned int SSRC)
     35     {
     36     }
     37     virtual void IncomingCSRCChanged(const int videoChannel,
     38                                      const unsigned int CSRC, const bool added)
     39     {
     40     }
     41 };
     42 
     43 class ViERtcpObserver: public webrtc::ViERTCPObserver
     44 {
     45 public:
     46     int _channel;
     47     unsigned char _subType;
     48     unsigned int _name;
     49     char* _data;
     50     unsigned short _dataLength;
     51 
     52     ViERtcpObserver() :
     53         _channel(-1),
     54         _subType(0),
     55         _name(0),
     56         _data(NULL),
     57         _dataLength(0)
     58     {
     59     }
     60     ~ViERtcpObserver()
     61     {
     62         if (_data)
     63         {
     64             delete[] _data;
     65         }
     66     }
     67     virtual void OnApplicationDataReceived(
     68         const int videoChannel, const unsigned char subType,
     69         const unsigned int name, const char* data,
     70         const unsigned short dataLengthInBytes)
     71     {
     72         _channel = videoChannel;
     73         _subType = subType;
     74         _name = name;
     75         if (dataLengthInBytes > _dataLength)
     76         {
     77             delete[] _data;
     78             _data = NULL;
     79         }
     80         if (_data == NULL)
     81         {
     82             _data = new char[dataLengthInBytes];
     83         }
     84         memcpy(_data, data, dataLengthInBytes);
     85         _dataLength = dataLengthInBytes;
     86     }
     87 };
     88 
     89 void ViEAutoTest::ViERtpRtcpStandardTest()
     90 {
     91     // ***************************************************************
     92     // Begin create/initialize WebRTC Video Engine for testing
     93     // ***************************************************************
     94 
     95     // Create VIE
     96     TbInterfaces ViE("ViERtpRtcpStandardTest");
     97     // Create a video channel
     98     TbVideoChannel tbChannel(ViE, webrtc::kVideoCodecVP8);
     99 
    100     // Create a capture device
    101     TbCaptureDevice tbCapture(ViE);
    102     tbCapture.ConnectTo(tbChannel.videoChannel);
    103 
    104     ViETest::Log("\n");
    105     TbExternalTransport myTransport(*(ViE.network), tbChannel.videoChannel,
    106                                     NULL);
    107 
    108     ViE.network->DeregisterSendTransport(tbChannel.videoChannel);
    109     EXPECT_EQ(0, ViE.network->RegisterSendTransport(
    110         tbChannel.videoChannel, myTransport));
    111 
    112     // ***************************************************************
    113     // Engine ready. Begin testing class
    114     // ***************************************************************
    115     unsigned short startSequenceNumber = 12345;
    116     ViETest::Log("Set start sequence number: %u", startSequenceNumber);
    117     EXPECT_EQ(0, ViE.rtp_rtcp->SetStartSequenceNumber(
    118         tbChannel.videoChannel, startSequenceNumber));
    119     const unsigned int kVideoSsrc = 123456;
    120     // Set an SSRC to avoid issues with collisions.
    121     EXPECT_EQ(0, ViE.rtp_rtcp->SetLocalSSRC(tbChannel.videoChannel, kVideoSsrc,
    122                                             webrtc::kViEStreamTypeNormal, 0));
    123 
    124     myTransport.EnableSequenceNumberCheck();
    125 
    126     EXPECT_EQ(0, ViE.base->StartReceive(tbChannel.videoChannel));
    127     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    128 
    129     AutoTestSleep(2000);
    130 
    131     unsigned short receivedSequenceNumber =
    132         myTransport.GetFirstSequenceNumber();
    133     ViETest::Log("First received sequence number: %u\n",
    134                  receivedSequenceNumber);
    135     EXPECT_EQ(startSequenceNumber, receivedSequenceNumber);
    136 
    137     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    138 
    139     //
    140     // RTCP CName
    141     //
    142     ViETest::Log("Testing CName\n");
    143     const char* sendCName = "ViEAutoTestCName\0";
    144     EXPECT_EQ(0, ViE.rtp_rtcp->SetRTCPCName(tbChannel.videoChannel, sendCName));
    145 
    146     char returnCName[webrtc::ViERTP_RTCP::KMaxRTCPCNameLength];
    147     memset(returnCName, 0, webrtc::ViERTP_RTCP::KMaxRTCPCNameLength);
    148     EXPECT_EQ(0, ViE.rtp_rtcp->GetRTCPCName(
    149         tbChannel.videoChannel, returnCName));
    150     EXPECT_STRCASEEQ(sendCName, returnCName);
    151 
    152     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    153 
    154     AutoTestSleep(1000);
    155 
    156     if (FLAGS_include_timing_dependent_tests) {
    157       char remoteCName[webrtc::ViERTP_RTCP::KMaxRTCPCNameLength];
    158       memset(remoteCName, 0, webrtc::ViERTP_RTCP::KMaxRTCPCNameLength);
    159       EXPECT_EQ(0, ViE.rtp_rtcp->GetRemoteRTCPCName(
    160           tbChannel.videoChannel, remoteCName));
    161       EXPECT_STRCASEEQ(sendCName, remoteCName);
    162     }
    163 
    164 
    165     //
    166     // Pacing
    167     //
    168     webrtc::RtcpStatistics received;
    169     int recRttMs = 0;
    170     unsigned int sentTotalBitrate = 0;
    171     unsigned int sentVideoBitrate = 0;
    172     unsigned int sentFecBitrate = 0;
    173     unsigned int sentNackBitrate = 0;
    174 
    175     ViETest::Log("Testing Pacing\n");
    176     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    177     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    178 
    179     myTransport.ClearStats();
    180 
    181     EXPECT_EQ(0, ViE.rtp_rtcp->SetNACKStatus(tbChannel.videoChannel, true));
    182     EXPECT_EQ(0, ViE.base->StartReceive(tbChannel.videoChannel));
    183     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    184 
    185     NetworkParameters network;
    186     network.packet_loss_rate = 0;
    187     network.loss_model = kUniformLoss;
    188     myTransport.SetNetworkParameters(network);
    189 
    190     AutoTestSleep(kAutoTestSleepTimeMs);
    191 
    192     EXPECT_EQ(0, ViE.rtp_rtcp->GetReceiveChannelRtcpStatistics(
    193         tbChannel.videoChannel, received, recRttMs));
    194     EXPECT_EQ(0, ViE.rtp_rtcp->GetBandwidthUsage(
    195         tbChannel.videoChannel, sentTotalBitrate, sentVideoBitrate,
    196         sentFecBitrate, sentNackBitrate));
    197 
    198     int num_rtp_packets = 0;
    199     int num_dropped_packets = 0;
    200     int num_rtcp_packets = 0;
    201     std::map<uint8_t, int> packet_counters;
    202     myTransport.GetStats(num_rtp_packets, num_dropped_packets, num_rtcp_packets,
    203                          &packet_counters);
    204     EXPECT_GT(num_rtp_packets, 0);
    205     EXPECT_EQ(num_dropped_packets, 0);
    206     EXPECT_GT(num_rtcp_packets, 0);
    207     EXPECT_GT(sentTotalBitrate, 0u);
    208     EXPECT_EQ(sentNackBitrate, 0u);
    209     EXPECT_EQ(received.cumulative_lost, 0u);
    210 
    211     //
    212     // RTX
    213     //
    214     ViETest::Log("Testing NACK over RTX\n");
    215     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    216     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    217 
    218     myTransport.ClearStats();
    219 
    220     const uint8_t kRtxPayloadType = 96;
    221     // Temporarily disable pacing.
    222     EXPECT_EQ(0, ViE.rtp_rtcp->SetTransmissionSmoothingStatus(
    223         tbChannel.videoChannel, false));
    224     EXPECT_EQ(0, ViE.rtp_rtcp->SetNACKStatus(tbChannel.videoChannel, true));
    225     EXPECT_EQ(0, ViE.rtp_rtcp->SetRtxSendPayloadType(tbChannel.videoChannel,
    226                                                      kRtxPayloadType));
    227     EXPECT_EQ(0, ViE.rtp_rtcp->SetRtxReceivePayloadType(tbChannel.videoChannel,
    228                                                         kRtxPayloadType));
    229     EXPECT_EQ(0, ViE.rtp_rtcp->SetLocalSSRC(tbChannel.videoChannel, 1234,
    230                                             webrtc::kViEStreamTypeRtx, 0));
    231     EXPECT_EQ(0, ViE.rtp_rtcp->SetRemoteSSRCType(tbChannel.videoChannel,
    232                                                  webrtc::kViEStreamTypeRtx,
    233                                                  1234));
    234     EXPECT_EQ(0, ViE.rtp_rtcp->SetStartSequenceNumber(
    235         tbChannel.videoChannel, startSequenceNumber));
    236     EXPECT_EQ(0, ViE.base->StartReceive(tbChannel.videoChannel));
    237     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    238 
    239     // Make sure the first key frame gets through.
    240     AutoTestSleep(100);
    241     const int kPacketLossRate = 20;
    242     network.packet_loss_rate = kPacketLossRate;
    243     network.loss_model = kUniformLoss;
    244     myTransport.SetNetworkParameters(network);
    245     AutoTestSleep(kAutoTestSleepTimeMs);
    246 
    247     EXPECT_EQ(0, ViE.rtp_rtcp->GetReceiveChannelRtcpStatistics(
    248         tbChannel.videoChannel, received, recRttMs));
    249     EXPECT_EQ(0, ViE.rtp_rtcp->GetBandwidthUsage(
    250         tbChannel.videoChannel, sentTotalBitrate, sentVideoBitrate,
    251         sentFecBitrate, sentNackBitrate));
    252 
    253     packet_counters.clear();
    254     myTransport.GetStats(num_rtp_packets, num_dropped_packets, num_rtcp_packets,
    255                          &packet_counters);
    256     EXPECT_GT(num_rtp_packets, 0);
    257     EXPECT_GT(num_dropped_packets, 0);
    258     EXPECT_GT(num_rtcp_packets, 0);
    259     EXPECT_GT(packet_counters[kRtxPayloadType], 0);
    260 
    261     // Make sure we have lost packets and that they were retransmitted.
    262     // TODO(holmer): Disabled due to being flaky. Could be a bug in our stats.
    263     // EXPECT_GT(recCumulativeLost, 0u);
    264     EXPECT_GT(sentTotalBitrate, 0u);
    265     EXPECT_GT(sentNackBitrate, 0u);
    266 
    267     //
    268     //  Statistics
    269     //
    270     // Stop and restart to clear stats
    271     ViETest::Log("Testing statistics\n");
    272     EXPECT_EQ(0, ViE.rtp_rtcp->SetNACKStatus(tbChannel.videoChannel, false));
    273     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    274     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    275 
    276     myTransport.ClearStats();
    277     network.packet_loss_rate = kPacketLossRate;
    278     network.loss_model = kUniformLoss;
    279     myTransport.SetNetworkParameters(network);
    280 
    281     // Start send to verify sending stats
    282 
    283     EXPECT_EQ(0, ViE.rtp_rtcp->SetStartSequenceNumber(
    284         tbChannel.videoChannel, startSequenceNumber));
    285     EXPECT_EQ(0, ViE.base->StartReceive(tbChannel.videoChannel));
    286     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    287 
    288     webrtc::RtcpStatistics sent;
    289     int sentRttMs = 0;
    290 
    291     // Fraction lost is a transient value that can get reset after a new rtcp
    292     // report block. Make regular polls to make sure it is propagated.
    293     // TODO(sprang): Replace with callbacks, when those are fully implemented.
    294     int time_to_sleep = kAutoTestSleepTimeMs;
    295     bool got_send_channel_frac_lost = false;
    296     bool got_receive_channel_frac_lost = false;
    297     while (time_to_sleep > 0) {
    298       AutoTestSleep(500);
    299       time_to_sleep -= 500;
    300       EXPECT_EQ(0,
    301                 ViE.rtp_rtcp->GetSendChannelRtcpStatistics(
    302                     tbChannel.videoChannel, sent, sentRttMs));
    303       got_send_channel_frac_lost |= sent.fraction_lost > 0;
    304       EXPECT_EQ(0,
    305                 ViE.rtp_rtcp->GetReceiveChannelRtcpStatistics(
    306                     tbChannel.videoChannel, received, recRttMs));
    307       got_receive_channel_frac_lost |= received.fraction_lost > 0;
    308     }
    309     EXPECT_TRUE(got_send_channel_frac_lost);
    310     EXPECT_TRUE(got_receive_channel_frac_lost);
    311 
    312     EXPECT_EQ(0, ViE.rtp_rtcp->GetBandwidthUsage(
    313         tbChannel.videoChannel, sentTotalBitrate, sentVideoBitrate,
    314         sentFecBitrate, sentNackBitrate));
    315 
    316     EXPECT_GT(sentTotalBitrate, 0u);
    317     EXPECT_EQ(sentFecBitrate, 0u);
    318     EXPECT_EQ(sentNackBitrate, 0u);
    319 
    320     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    321 
    322     AutoTestSleep(2000);
    323 
    324     EXPECT_EQ(0, ViE.rtp_rtcp->GetSendChannelRtcpStatistics(
    325         tbChannel.videoChannel, sent, sentRttMs));
    326     EXPECT_GT(sent.cumulative_lost, 0u);
    327     EXPECT_GT(sent.extended_max_sequence_number, startSequenceNumber);
    328     EXPECT_GT(sent.jitter, 0u);
    329     EXPECT_GT(sentRttMs, 0);
    330 
    331     EXPECT_EQ(0, ViE.rtp_rtcp->GetReceiveChannelRtcpStatistics(
    332         tbChannel.videoChannel, received, recRttMs));
    333 
    334     EXPECT_GT(received.cumulative_lost, 0u);
    335     EXPECT_GT(received.extended_max_sequence_number, startSequenceNumber);
    336     EXPECT_GT(received.jitter, 0u);
    337     EXPECT_GT(recRttMs, 0);
    338 
    339     unsigned int estimated_bandwidth = 0;
    340     EXPECT_EQ(0, ViE.rtp_rtcp->GetEstimatedSendBandwidth(
    341         tbChannel.videoChannel,
    342         &estimated_bandwidth));
    343     EXPECT_GT(estimated_bandwidth, 0u);
    344 
    345     if (FLAGS_include_timing_dependent_tests) {
    346       EXPECT_EQ(0, ViE.rtp_rtcp->GetEstimatedReceiveBandwidth(
    347           tbChannel.videoChannel,
    348           &estimated_bandwidth));
    349       EXPECT_GT(estimated_bandwidth, 0u);
    350 
    351       int passive_channel = -1;
    352       EXPECT_EQ(ViE.base->CreateReceiveChannel(passive_channel,
    353                                                tbChannel.videoChannel), 0);
    354       EXPECT_EQ(ViE.base->StartReceive(passive_channel), 0);
    355       EXPECT_EQ(
    356           ViE.rtp_rtcp->GetEstimatedReceiveBandwidth(passive_channel,
    357                                                      &estimated_bandwidth),
    358           0);
    359       EXPECT_EQ(estimated_bandwidth, 0u);
    360     }
    361 
    362     // Check that rec stats extended max is greater than what we've sent.
    363     EXPECT_GE(received.extended_max_sequence_number,
    364               sent.extended_max_sequence_number);
    365     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    366     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    367 
    368     //
    369     // Test bandwidth statistics with reserved bitrate
    370     //
    371 
    372     myTransport.ClearStats();
    373     network.packet_loss_rate = 0;
    374     network.loss_model = kUniformLoss;
    375     myTransport.SetNetworkParameters(network);
    376 
    377     ViE.rtp_rtcp->SetReservedTransmitBitrate(tbChannel.videoChannel, 2000000);
    378 
    379     EXPECT_EQ(0, ViE.base->StartReceive(tbChannel.videoChannel));
    380     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    381 
    382     AutoTestSleep(kAutoTestSleepTimeMs);
    383 
    384     estimated_bandwidth = 0;
    385     EXPECT_EQ(0, ViE.rtp_rtcp->GetEstimatedSendBandwidth(tbChannel.videoChannel,
    386                                                          &estimated_bandwidth));
    387     if (FLAGS_include_timing_dependent_tests) {
    388       EXPECT_EQ(0u, estimated_bandwidth);
    389     }
    390 
    391     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    392     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    393 
    394     //
    395     // Test bandwidth statistics with NACK and FEC separately
    396     //
    397 
    398     myTransport.ClearStats();
    399     network.packet_loss_rate = kPacketLossRate;
    400     myTransport.SetNetworkParameters(network);
    401 
    402     EXPECT_EQ(0, ViE.rtp_rtcp->SetFECStatus(
    403         tbChannel.videoChannel, true, 96, 97));
    404     EXPECT_EQ(0, ViE.base->StartReceive(tbChannel.videoChannel));
    405     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    406 
    407     AutoTestSleep(kAutoTestSleepTimeMs);
    408 
    409     EXPECT_EQ(0, ViE.rtp_rtcp->GetBandwidthUsage(
    410         tbChannel.videoChannel, sentTotalBitrate, sentVideoBitrate,
    411          sentFecBitrate, sentNackBitrate));
    412 
    413     if (FLAGS_include_timing_dependent_tests) {
    414       EXPECT_GT(sentTotalBitrate, 0u);
    415       EXPECT_GT(sentFecBitrate, 0u);
    416       EXPECT_EQ(sentNackBitrate, 0u);
    417     }
    418 
    419     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    420     EXPECT_EQ(0, ViE.rtp_rtcp->SetFECStatus(
    421         tbChannel.videoChannel, false, 96, 97));
    422     EXPECT_EQ(0, ViE.rtp_rtcp->SetNACKStatus(tbChannel.videoChannel, true));
    423     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    424 
    425     AutoTestSleep(4 * kAutoTestSleepTimeMs);
    426 
    427     EXPECT_EQ(0, ViE.rtp_rtcp->GetBandwidthUsage(
    428         tbChannel.videoChannel, sentTotalBitrate, sentVideoBitrate,
    429         sentFecBitrate, sentNackBitrate));
    430 
    431     if (FLAGS_include_timing_dependent_tests) {
    432       EXPECT_GT(sentTotalBitrate, 0u);
    433       EXPECT_EQ(sentFecBitrate, 0u);
    434 
    435       // TODO(holmer): Test disabled due to being too flaky on buildbots. Tests
    436       // for new API provide partial coverage.
    437       // EXPECT_GT(sentNackBitrate, 0u);
    438     }
    439 
    440     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    441     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    442     EXPECT_EQ(0, ViE.rtp_rtcp->SetNACKStatus(tbChannel.videoChannel, false));
    443 
    444 
    445     // Test to set SSRC
    446     network.packet_loss_rate = 0;
    447     myTransport.SetNetworkParameters(network);
    448     myTransport.ClearStats();
    449 
    450     unsigned int setSSRC = 0x01234567;
    451     ViETest::Log("Set SSRC %u", setSSRC);
    452     EXPECT_EQ(0, ViE.rtp_rtcp->SetLocalSSRC(tbChannel.videoChannel, setSSRC));
    453     EXPECT_EQ(0, ViE.base->StartReceive(tbChannel.videoChannel));
    454     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    455 
    456     myTransport.EnableSSRCCheck();
    457 
    458     AutoTestSleep(2000);
    459     unsigned int receivedSSRC = myTransport.ReceivedSSRC();
    460     ViETest::Log("Received SSRC %u\n", receivedSSRC);
    461 
    462     if (FLAGS_include_timing_dependent_tests) {
    463       EXPECT_EQ(setSSRC, receivedSSRC);
    464 
    465       unsigned int localSSRC = 0;
    466       EXPECT_EQ(0, ViE.rtp_rtcp->GetLocalSSRC(
    467           tbChannel.videoChannel, localSSRC));
    468       EXPECT_EQ(setSSRC, localSSRC);
    469 
    470       unsigned int remoteSSRC = 0;
    471       EXPECT_EQ(0, ViE.rtp_rtcp->GetRemoteSSRC(
    472           tbChannel.videoChannel, remoteSSRC));
    473       EXPECT_EQ(setSSRC, remoteSSRC);
    474     }
    475 
    476     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    477 
    478     ViETest::Log("Testing RTP dump...\n");
    479 
    480     std::string inDumpName =
    481         ViETest::GetResultOutputPath() + "IncomingRTPDump.rtp";
    482     std::string outDumpName =
    483         ViETest::GetResultOutputPath() + "OutgoingRTPDump.rtp";
    484     EXPECT_EQ(0, ViE.rtp_rtcp->StartRTPDump(
    485         tbChannel.videoChannel, inDumpName.c_str(), webrtc::kRtpIncoming));
    486     EXPECT_EQ(0, ViE.rtp_rtcp->StartRTPDump(
    487         tbChannel.videoChannel, outDumpName.c_str(), webrtc::kRtpOutgoing));
    488 
    489     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    490 
    491     AutoTestSleep(kAutoTestSleepTimeMs);
    492 
    493     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    494 
    495     AutoTestSleep(1000);
    496 
    497     EXPECT_EQ(0, ViE.rtp_rtcp->StopRTPDump(
    498         tbChannel.videoChannel, webrtc::kRtpIncoming));
    499     EXPECT_EQ(0, ViE.rtp_rtcp->StopRTPDump(
    500         tbChannel.videoChannel, webrtc::kRtpOutgoing));
    501 
    502     // Make sure data was actually saved to the file and we stored the same
    503     // amount of data in both files
    504     FILE* inDump = fopen(inDumpName.c_str(), "r");
    505     fseek(inDump, 0L, SEEK_END);
    506     long inEndPos = ftell(inDump);
    507     fclose(inDump);
    508     FILE* outDump = fopen(outDumpName.c_str(), "r");
    509     fseek(outDump, 0L, SEEK_END);
    510     // long outEndPos = ftell(outDump);
    511     fclose(outDump);
    512 
    513     EXPECT_GT(inEndPos, 0);
    514 
    515     // TODO(phoglund): This is flaky for some reason. Are the sleeps too
    516     // short above?
    517     // EXPECT_LT(inEndPos, outEndPos + 100);
    518 
    519     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    520 
    521 
    522     ViETest::Log("Testing Network Down...\n");
    523 
    524     EXPECT_EQ(0, ViE.rtp_rtcp->SetNACKStatus(tbChannel.videoChannel, true));
    525     // Reenable pacing.
    526     EXPECT_EQ(0, ViE.rtp_rtcp->SetTransmissionSmoothingStatus(
    527         tbChannel.videoChannel, true));
    528 
    529     webrtc::StreamDataCounters sent_before;
    530     webrtc::StreamDataCounters received_before;
    531     webrtc::StreamDataCounters sent_after;
    532     webrtc::StreamDataCounters received_after;
    533 
    534     EXPECT_EQ(0, ViE.rtp_rtcp->GetRtpStatistics(tbChannel.videoChannel,
    535                                                 sent_before,
    536                                                 received_before));
    537     EXPECT_EQ(0, ViE.base->StartReceive(tbChannel.videoChannel));
    538     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    539 
    540     // Real-time mode.
    541     AutoTestSleep(kAutoTestSleepTimeMs);
    542     EXPECT_EQ(0, ViE.rtp_rtcp->GetRtpStatistics(tbChannel.videoChannel,
    543                                                 sent_after, received_after));
    544     if (FLAGS_include_timing_dependent_tests) {
    545       EXPECT_GT(received_after.bytes, received_before.bytes);
    546     }
    547     // Simulate lost reception and verify that nothing is sent during that time.
    548     ViE.network->SetNetworkTransmissionState(tbChannel.videoChannel, false);
    549     // Allow the encoder to finish the current frame before we expect that no
    550     // additional packets will be sent.
    551     AutoTestSleep(kAutoTestSleepTimeMs);
    552     received_before.bytes = received_after.bytes;
    553     ViETest::Log("Network Down...\n");
    554     AutoTestSleep(kAutoTestSleepTimeMs);
    555     EXPECT_EQ(0, ViE.rtp_rtcp->GetRtpStatistics(tbChannel.videoChannel,
    556                                                 sent_before,
    557                                                 received_before));
    558     if (FLAGS_include_timing_dependent_tests) {
    559       EXPECT_EQ(received_before.bytes, received_after.bytes);
    560     }
    561 
    562     // Network reception back. Video should now be sent.
    563     ViE.network->SetNetworkTransmissionState(tbChannel.videoChannel, true);
    564     ViETest::Log("Network Up...\n");
    565     AutoTestSleep(kAutoTestSleepTimeMs);
    566     EXPECT_EQ(0, ViE.rtp_rtcp->GetRtpStatistics(tbChannel.videoChannel,
    567                                                 sent_before,
    568                                                 received_before));
    569     if (FLAGS_include_timing_dependent_tests) {
    570       EXPECT_GT(received_before.bytes, received_after.bytes);
    571     }
    572     received_after.bytes = received_before.bytes;
    573     // Buffering mode.
    574     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    575     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    576     ViE.rtp_rtcp->SetSenderBufferingMode(tbChannel.videoChannel,
    577                                          kAutoTestSleepTimeMs / 2);
    578     // Add extra delay to the receiver to make sure it doesn't flush due to
    579     // too old packets being received (as the down-time introduced is longer
    580     // than what we buffer at the sender).
    581     ViE.rtp_rtcp->SetReceiverBufferingMode(tbChannel.videoChannel,
    582                                            3 * kAutoTestSleepTimeMs / 2);
    583     EXPECT_EQ(0, ViE.base->StartReceive(tbChannel.videoChannel));
    584     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    585     AutoTestSleep(kAutoTestSleepTimeMs);
    586     // Simulate lost reception and verify that nothing is sent during that time.
    587     ViETest::Log("Network Down...\n");
    588     ViE.network->SetNetworkTransmissionState(tbChannel.videoChannel, false);
    589     // Allow the encoder to finish the current frame before we expect that no
    590     // additional packets will be sent.
    591     AutoTestSleep(kAutoTestSleepTimeMs);
    592     EXPECT_EQ(0, ViE.rtp_rtcp->GetRtpStatistics(tbChannel.videoChannel,
    593                                                 sent_before,
    594                                                 received_before));
    595     if (FLAGS_include_timing_dependent_tests) {
    596       EXPECT_GT(received_before.bytes, received_after.bytes);
    597     }
    598     received_after.bytes = received_before.bytes;
    599     AutoTestSleep(kAutoTestSleepTimeMs);
    600     EXPECT_EQ(0, ViE.rtp_rtcp->GetRtpStatistics(tbChannel.videoChannel,
    601                                                 sent_before,
    602                                                 received_before));
    603     if (FLAGS_include_timing_dependent_tests) {
    604       EXPECT_EQ(received_after.bytes, received_before.bytes);
    605     }
    606     // Network reception back. Video should now be sent.
    607     ViETest::Log("Network Up...\n");
    608     ViE.network->SetNetworkTransmissionState(tbChannel.videoChannel, true);
    609     AutoTestSleep(kAutoTestSleepTimeMs);
    610     EXPECT_EQ(0, ViE.rtp_rtcp->GetRtpStatistics(tbChannel.videoChannel,
    611                                                 sent_before,
    612                                                 received_before));
    613     if (FLAGS_include_timing_dependent_tests) {
    614       EXPECT_GT(received_before.bytes, received_after.bytes);
    615     }
    616     // TODO(holmer): Verify that the decoded framerate doesn't decrease on an
    617     // outage when in buffering mode. This isn't currently possible because we
    618     // don't have an API to get decoded framerate.
    619 
    620     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    621     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    622 
    623 
    624     // Deregister external transport
    625     EXPECT_EQ(0, ViE.network->DeregisterSendTransport(tbChannel.videoChannel));
    626 
    627 
    628     //***************************************************************
    629     //  Testing finished. Tear down Video Engine
    630     //***************************************************************
    631 }
    632 
    633 void ViEAutoTest::ViERtpRtcpExtendedTest()
    634 {
    635     //***************************************************************
    636     //  Begin create/initialize WebRTC Video Engine for testing
    637     //***************************************************************
    638     // Create VIE
    639     TbInterfaces ViE("ViERtpRtcpExtendedTest");
    640     // Create a video channel
    641     TbVideoChannel tbChannel(ViE, webrtc::kVideoCodecVP8);
    642     // Create a capture device
    643     TbCaptureDevice tbCapture(ViE);
    644     tbCapture.ConnectTo(tbChannel.videoChannel);
    645 
    646     //tbChannel.StartReceive(rtpPort);
    647     //tbChannel.StartSend(rtpPort);
    648     TbExternalTransport myTransport(*(ViE.network), tbChannel.videoChannel,
    649                                     NULL);
    650 
    651     EXPECT_EQ(0, ViE.network->DeregisterSendTransport(tbChannel.videoChannel));
    652     EXPECT_EQ(0, ViE.network->RegisterSendTransport(
    653         tbChannel.videoChannel, myTransport));
    654     EXPECT_EQ(0, ViE.base->StartReceive(tbChannel.videoChannel));
    655     EXPECT_EQ(0, ViE.base->StartSend(tbChannel.videoChannel));
    656 
    657     //***************************************************************
    658     //  Engine ready. Begin testing class
    659     //***************************************************************
    660 
    661     //
    662     // Application specific RTCP
    663     //
    664     //
    665 
    666     ViERtcpObserver rtcpObserver;
    667     EXPECT_EQ(0, ViE.rtp_rtcp->RegisterRTCPObserver(
    668         tbChannel.videoChannel, rtcpObserver));
    669 
    670     unsigned char subType = 3;
    671     unsigned int name = static_cast<unsigned int> (0x41424344); // 'ABCD';
    672     const char* data = "ViEAutoTest Data of length 32 -\0";
    673     const unsigned short numBytes = 32;
    674 
    675     EXPECT_EQ(0, ViE.rtp_rtcp->SendApplicationDefinedRTCPPacket(
    676         tbChannel.videoChannel, subType, name, data, numBytes));
    677 
    678     ViETest::Log("Sending RTCP application data...\n");
    679     AutoTestSleep(kAutoTestSleepTimeMs);
    680 
    681     EXPECT_EQ(subType, rtcpObserver._subType);
    682     EXPECT_STRCASEEQ(data, rtcpObserver._data);
    683     EXPECT_EQ(name, rtcpObserver._name);
    684     EXPECT_EQ(numBytes, rtcpObserver._dataLength);
    685 
    686     ViETest::Log("\t RTCP application data received\n");
    687 
    688     //***************************************************************
    689     //  Testing finished. Tear down Video Engine
    690     //***************************************************************
    691     EXPECT_EQ(0, ViE.base->StopReceive(tbChannel.videoChannel));
    692     EXPECT_EQ(0, ViE.base->StopSend(tbChannel.videoChannel));
    693 
    694     EXPECT_EQ(0, ViE.network->DeregisterSendTransport(tbChannel.videoChannel));
    695 }
    696 
    697 void ViEAutoTest::ViERtpRtcpAPITest()
    698 {
    699     //***************************************************************
    700     //  Begin create/initialize WebRTC Video Engine for testing
    701     //***************************************************************
    702     // Create VIE
    703     TbInterfaces ViE("ViERtpRtcpAPITest");
    704 
    705     // Create a video channel
    706     TbVideoChannel tbChannel(ViE, webrtc::kVideoCodecVP8);
    707 
    708     // Create a capture device
    709     TbCaptureDevice tbCapture(ViE);
    710     tbCapture.ConnectTo(tbChannel.videoChannel);
    711 
    712     //***************************************************************
    713     //  Engine ready. Begin testing class
    714     //***************************************************************
    715 
    716     //
    717     // Check different RTCP modes
    718     //
    719     webrtc::ViERTCPMode rtcpMode = webrtc::kRtcpNone;
    720     EXPECT_EQ(0, ViE.rtp_rtcp->GetRTCPStatus(
    721         tbChannel.videoChannel, rtcpMode));
    722     EXPECT_EQ(webrtc::kRtcpCompound_RFC4585, rtcpMode);
    723     EXPECT_EQ(0, ViE.rtp_rtcp->SetRTCPStatus(
    724         tbChannel.videoChannel, webrtc::kRtcpCompound_RFC4585));
    725     EXPECT_EQ(0, ViE.rtp_rtcp->GetRTCPStatus(
    726         tbChannel.videoChannel, rtcpMode));
    727     EXPECT_EQ(webrtc::kRtcpCompound_RFC4585, rtcpMode);
    728     EXPECT_EQ(0, ViE.rtp_rtcp->SetRTCPStatus(
    729         tbChannel.videoChannel, webrtc::kRtcpNonCompound_RFC5506));
    730     EXPECT_EQ(0, ViE.rtp_rtcp->GetRTCPStatus(
    731         tbChannel.videoChannel, rtcpMode));
    732     EXPECT_EQ(webrtc::kRtcpNonCompound_RFC5506, rtcpMode);
    733     EXPECT_EQ(0, ViE.rtp_rtcp->SetRTCPStatus(
    734         tbChannel.videoChannel, webrtc::kRtcpNone));
    735     EXPECT_EQ(0, ViE.rtp_rtcp->GetRTCPStatus(
    736         tbChannel.videoChannel, rtcpMode));
    737     EXPECT_EQ(webrtc::kRtcpNone, rtcpMode);
    738     EXPECT_EQ(0, ViE.rtp_rtcp->SetRTCPStatus(
    739         tbChannel.videoChannel, webrtc::kRtcpCompound_RFC4585));
    740 
    741     //
    742     // CName is testedn in SimpleTest
    743     // Start sequence number is tested in SimplTEst
    744     //
    745     const char* testCName = "ViEAutotestCName";
    746     EXPECT_EQ(0, ViE.rtp_rtcp->SetRTCPCName(
    747         tbChannel.videoChannel, testCName));
    748 
    749     char returnCName[256];
    750     memset(returnCName, 0, 256);
    751     EXPECT_EQ(0, ViE.rtp_rtcp->GetRTCPCName(
    752         tbChannel.videoChannel, returnCName));
    753     EXPECT_STRCASEEQ(testCName, returnCName);
    754 
    755     //
    756     // SSRC
    757     //
    758     EXPECT_EQ(0, ViE.rtp_rtcp->SetLocalSSRC(
    759         tbChannel.videoChannel, 0x01234567));
    760     EXPECT_EQ(0, ViE.rtp_rtcp->SetLocalSSRC(
    761         tbChannel.videoChannel, 0x76543210));
    762 
    763     unsigned int ssrc = 0;
    764     EXPECT_EQ(0, ViE.rtp_rtcp->GetLocalSSRC(tbChannel.videoChannel, ssrc));
    765     EXPECT_EQ(0, ViE.rtp_rtcp->SetStartSequenceNumber(
    766         tbChannel.videoChannel, 1000));
    767     tbChannel.StartSend();
    768     EXPECT_NE(0, ViE.rtp_rtcp->SetStartSequenceNumber(
    769         tbChannel.videoChannel, 12345));
    770     tbChannel.StopSend();
    771 
    772     //
    773     // Start sequence number
    774     //
    775     EXPECT_EQ(0, ViE.rtp_rtcp->SetStartSequenceNumber(
    776         tbChannel.videoChannel, 12345));
    777     EXPECT_EQ(0, ViE.rtp_rtcp->SetStartSequenceNumber(
    778         tbChannel.videoChannel, 1000));
    779     tbChannel.StartSend();
    780     EXPECT_NE(0, ViE.rtp_rtcp->SetStartSequenceNumber(
    781         tbChannel.videoChannel, 12345));
    782     tbChannel.StopSend();
    783 
    784     //
    785     // Application specific RTCP
    786     //
    787     {
    788         unsigned char subType = 3;
    789         unsigned int name = static_cast<unsigned int> (0x41424344); // 'ABCD';
    790         const char* data = "ViEAutoTest Data of length 32 --";
    791         const unsigned short numBytes = 32;
    792 
    793         tbChannel.StartSend();
    794         EXPECT_EQ(0, ViE.rtp_rtcp->SendApplicationDefinedRTCPPacket(
    795             tbChannel.videoChannel, subType, name, data, numBytes));
    796         EXPECT_NE(0, ViE.rtp_rtcp->SendApplicationDefinedRTCPPacket(
    797             tbChannel.videoChannel, subType, name, NULL, numBytes)) <<
    798                 "Should fail on NULL input.";
    799         EXPECT_NE(0, ViE.rtp_rtcp->SendApplicationDefinedRTCPPacket(
    800             tbChannel.videoChannel, subType, name, data, numBytes - 1)) <<
    801                 "Should fail on incorrect length.";
    802 
    803         EXPECT_EQ(0, ViE.rtp_rtcp->GetRTCPStatus(
    804             tbChannel.videoChannel, rtcpMode));
    805         EXPECT_EQ(0, ViE.rtp_rtcp->SendApplicationDefinedRTCPPacket(
    806             tbChannel.videoChannel, subType, name, data, numBytes));
    807         EXPECT_EQ(0, ViE.rtp_rtcp->SetRTCPStatus(
    808             tbChannel.videoChannel, webrtc::kRtcpCompound_RFC4585));
    809         tbChannel.StopSend();
    810         EXPECT_NE(0, ViE.rtp_rtcp->SendApplicationDefinedRTCPPacket(
    811             tbChannel.videoChannel, subType, name, data, numBytes));
    812     }
    813 
    814     //
    815     // Statistics
    816     //
    817     // Tested in SimpleTest(), we'll get errors if we haven't received a RTCP
    818     // packet.
    819 
    820     //
    821     // RTP Dump
    822     //
    823     {
    824         std::string output_file = webrtc::test::OutputPath() +
    825             "DumpFileName.rtp";
    826         const char* dumpName = output_file.c_str();
    827 
    828         EXPECT_EQ(0, ViE.rtp_rtcp->StartRTPDump(
    829             tbChannel.videoChannel, dumpName, webrtc::kRtpIncoming));
    830         EXPECT_EQ(0, ViE.rtp_rtcp->StopRTPDump(
    831             tbChannel.videoChannel, webrtc::kRtpIncoming));
    832         EXPECT_NE(0, ViE.rtp_rtcp->StopRTPDump(
    833             tbChannel.videoChannel, webrtc::kRtpIncoming));
    834         EXPECT_EQ(0, ViE.rtp_rtcp->StartRTPDump(
    835             tbChannel.videoChannel, dumpName, webrtc::kRtpOutgoing));
    836         EXPECT_EQ(0, ViE.rtp_rtcp->StopRTPDump(
    837             tbChannel.videoChannel, webrtc::kRtpOutgoing));
    838         EXPECT_NE(0, ViE.rtp_rtcp->StopRTPDump(
    839             tbChannel.videoChannel, webrtc::kRtpOutgoing));
    840         EXPECT_NE(0, ViE.rtp_rtcp->StartRTPDump(
    841             tbChannel.videoChannel, dumpName, (webrtc::RTPDirections) 3));
    842     }
    843     //
    844     // RTP/RTCP Observers
    845     //
    846     {
    847         ViERtpObserver rtpObserver;
    848         EXPECT_EQ(0, ViE.rtp_rtcp->RegisterRTPObserver(
    849             tbChannel.videoChannel, rtpObserver));
    850         EXPECT_NE(0, ViE.rtp_rtcp->RegisterRTPObserver(
    851             tbChannel.videoChannel, rtpObserver));
    852         EXPECT_EQ(0, ViE.rtp_rtcp->DeregisterRTPObserver(
    853             tbChannel.videoChannel));
    854         EXPECT_NE(0, ViE.rtp_rtcp->DeregisterRTPObserver(
    855             tbChannel.videoChannel));
    856 
    857         ViERtcpObserver rtcpObserver;
    858         EXPECT_EQ(0, ViE.rtp_rtcp->RegisterRTCPObserver(
    859             tbChannel.videoChannel, rtcpObserver));
    860         EXPECT_NE(0, ViE.rtp_rtcp->RegisterRTCPObserver(
    861             tbChannel.videoChannel, rtcpObserver));
    862         EXPECT_EQ(0, ViE.rtp_rtcp->DeregisterRTCPObserver(
    863             tbChannel.videoChannel));
    864         EXPECT_NE(0, ViE.rtp_rtcp->DeregisterRTCPObserver(
    865             tbChannel.videoChannel));
    866     }
    867     //
    868     // PLI
    869     //
    870     {
    871         EXPECT_EQ(0, ViE.rtp_rtcp->SetKeyFrameRequestMethod(
    872             tbChannel.videoChannel, webrtc::kViEKeyFrameRequestPliRtcp));
    873         EXPECT_EQ(0, ViE.rtp_rtcp->SetKeyFrameRequestMethod(
    874             tbChannel.videoChannel, webrtc::kViEKeyFrameRequestPliRtcp));
    875         EXPECT_EQ(0, ViE.rtp_rtcp->SetKeyFrameRequestMethod(
    876             tbChannel.videoChannel, webrtc::kViEKeyFrameRequestNone));
    877         EXPECT_EQ(0, ViE.rtp_rtcp->SetKeyFrameRequestMethod(
    878             tbChannel.videoChannel, webrtc::kViEKeyFrameRequestNone));
    879     }
    880     //
    881     // NACK
    882     //
    883     {
    884       EXPECT_EQ(0, ViE.rtp_rtcp->SetNACKStatus(tbChannel.videoChannel, true));
    885     }
    886 
    887     // Timestamp offset extension.
    888     // Valid range is 1 to 14 inclusive.
    889     EXPECT_EQ(-1, ViE.rtp_rtcp->SetSendTimestampOffsetStatus(
    890         tbChannel.videoChannel, true, 0));
    891     EXPECT_EQ(-1, ViE.rtp_rtcp->SetSendTimestampOffsetStatus(
    892         tbChannel.videoChannel, true, 15));
    893     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendTimestampOffsetStatus(
    894         tbChannel.videoChannel, true, 3));
    895     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendTimestampOffsetStatus(
    896         tbChannel.videoChannel, true, 3));
    897     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendTimestampOffsetStatus(
    898             tbChannel.videoChannel, false, 3));
    899     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendTimestampOffsetStatus(
    900         tbChannel.videoChannel, true, 3));
    901     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendTimestampOffsetStatus(
    902               tbChannel.videoChannel, false, 3));
    903     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendTimestampOffsetStatus(
    904             tbChannel.videoChannel, false, 3));
    905 
    906     EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiveTimestampOffsetStatus(
    907         tbChannel.videoChannel, true, 0));
    908     EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiveTimestampOffsetStatus(
    909         tbChannel.videoChannel, true, 15));
    910     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveTimestampOffsetStatus(
    911         tbChannel.videoChannel, true, 3));
    912     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveTimestampOffsetStatus(
    913         tbChannel.videoChannel, true, 3));
    914     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveTimestampOffsetStatus(
    915             tbChannel.videoChannel, false, 3));
    916     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveTimestampOffsetStatus(
    917         tbChannel.videoChannel, true, 3));
    918     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveTimestampOffsetStatus(
    919               tbChannel.videoChannel, false, 3));
    920     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveTimestampOffsetStatus(
    921             tbChannel.videoChannel, false, 3));
    922 
    923     // Absolute send time extension.
    924     // Valid range is 1 to 14 inclusive.
    925     EXPECT_EQ(-1, ViE.rtp_rtcp->SetSendAbsoluteSendTimeStatus(
    926         tbChannel.videoChannel, true, 0));
    927     EXPECT_EQ(-1, ViE.rtp_rtcp->SetSendAbsoluteSendTimeStatus(
    928         tbChannel.videoChannel, true, 15));
    929     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendAbsoluteSendTimeStatus(
    930         tbChannel.videoChannel, true, 3));
    931     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendAbsoluteSendTimeStatus(
    932         tbChannel.videoChannel, true, 3));
    933     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendAbsoluteSendTimeStatus(
    934         tbChannel.videoChannel, false, 3));
    935     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendAbsoluteSendTimeStatus(
    936         tbChannel.videoChannel, true, 3));
    937     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendAbsoluteSendTimeStatus(
    938         tbChannel.videoChannel, false, 3));
    939     EXPECT_EQ(0, ViE.rtp_rtcp->SetSendAbsoluteSendTimeStatus(
    940         tbChannel.videoChannel, false, 3));
    941 
    942     EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiveAbsoluteSendTimeStatus(
    943         tbChannel.videoChannel, true, 0));
    944     EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiveAbsoluteSendTimeStatus(
    945         tbChannel.videoChannel, true, 15));
    946     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveAbsoluteSendTimeStatus(
    947         tbChannel.videoChannel, true, 3));
    948     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveAbsoluteSendTimeStatus(
    949         tbChannel.videoChannel, true, 3));
    950     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveAbsoluteSendTimeStatus(
    951         tbChannel.videoChannel, false, 3));
    952     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveAbsoluteSendTimeStatus(
    953         tbChannel.videoChannel, true, 3));
    954     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveAbsoluteSendTimeStatus(
    955         tbChannel.videoChannel, false, 3));
    956     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiveAbsoluteSendTimeStatus(
    957         tbChannel.videoChannel, false, 3));
    958 
    959     // Transmission smoothening.
    960     const int invalid_channel_id = 17;
    961     EXPECT_EQ(-1, ViE.rtp_rtcp->SetTransmissionSmoothingStatus(
    962         invalid_channel_id, true));
    963     EXPECT_EQ(0, ViE.rtp_rtcp->SetTransmissionSmoothingStatus(
    964         tbChannel.videoChannel, true));
    965     EXPECT_EQ(0, ViE.rtp_rtcp->SetTransmissionSmoothingStatus(
    966         tbChannel.videoChannel, true));
    967     EXPECT_EQ(0, ViE.rtp_rtcp->SetTransmissionSmoothingStatus(
    968         tbChannel.videoChannel, false));
    969     EXPECT_EQ(0, ViE.rtp_rtcp->SetTransmissionSmoothingStatus(
    970         tbChannel.videoChannel, false));
    971 
    972     // Buffering mode - sender side.
    973     EXPECT_EQ(-1, ViE.rtp_rtcp->SetSenderBufferingMode(
    974         invalid_channel_id, 0));
    975     int invalid_delay = -1;
    976     EXPECT_EQ(-1, ViE.rtp_rtcp->SetSenderBufferingMode(
    977         tbChannel.videoChannel, invalid_delay));
    978     invalid_delay = 15000;
    979     EXPECT_EQ(-1, ViE.rtp_rtcp->SetSenderBufferingMode(
    980         tbChannel.videoChannel, invalid_delay));
    981     EXPECT_EQ(0, ViE.rtp_rtcp->SetSenderBufferingMode(
    982         tbChannel.videoChannel, 5000));
    983 
    984     // Buffering mode - receiver side.
    985     // Run without VoE to verify it that does not crash, but return an error.
    986     EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiverBufferingMode(
    987         tbChannel.videoChannel, 0));
    988     EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiverBufferingMode(
    989         tbChannel.videoChannel, 2000));
    990 
    991     // Set VoE (required to set up stream-sync).
    992     webrtc::VoiceEngine* voice_engine = webrtc::VoiceEngine::Create();
    993     EXPECT_TRUE(NULL != voice_engine);
    994     webrtc::VoEBase* voe_base = webrtc::VoEBase::GetInterface(voice_engine);
    995     EXPECT_TRUE(NULL != voe_base);
    996     EXPECT_EQ(0, voe_base->Init());
    997     int audio_channel = voe_base->CreateChannel();
    998     EXPECT_NE(-1, audio_channel);
    999     EXPECT_EQ(0, ViE.base->SetVoiceEngine(voice_engine));
   1000     EXPECT_EQ(0, ViE.base->ConnectAudioChannel(tbChannel.videoChannel,
   1001                                                audio_channel));
   1002 
   1003     EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiverBufferingMode(
   1004         invalid_channel_id, 0));
   1005     EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiverBufferingMode(
   1006         tbChannel.videoChannel, invalid_delay));
   1007     invalid_delay = 15000;
   1008     EXPECT_EQ(-1, ViE.rtp_rtcp->SetReceiverBufferingMode(
   1009         tbChannel.videoChannel, invalid_delay));
   1010     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiverBufferingMode(
   1011         tbChannel.videoChannel, 5000));
   1012 
   1013     // Real-time mode - sender side.
   1014     EXPECT_EQ(0, ViE.rtp_rtcp->SetSenderBufferingMode(
   1015         tbChannel.videoChannel, 0));
   1016     // Real-time mode - receiver side.
   1017     EXPECT_EQ(0, ViE.rtp_rtcp->SetReceiverBufferingMode(
   1018         tbChannel.videoChannel, 0));
   1019 
   1020     EXPECT_EQ(0, ViE.base->DisconnectAudioChannel(tbChannel.videoChannel));
   1021     EXPECT_EQ(0, ViE.base->SetVoiceEngine(NULL));
   1022     EXPECT_EQ(0, voe_base->DeleteChannel(audio_channel));
   1023     voe_base->Release();
   1024     EXPECT_TRUE(webrtc::VoiceEngine::Delete(voice_engine));
   1025 
   1026     //***************************************************************
   1027     //  Testing finished. Tear down Video Engine
   1028     //***************************************************************
   1029 }
   1030