1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
115600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org#include "webrtc/video_engine/test/auto_test/primitives/base_primitives.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
135e8ee6f8a182dd36d0c9f273f180d015a056cef4andrew@webrtc.org#include "webrtc/modules/video_capture/include/video_capture_factory.h"
145600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
155600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org#include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
165600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_external_transport.h"
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
185600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.orgstatic void ConfigureCodecsToI420(int video_channel,
195600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org                                  webrtc::VideoCodec video_codec,
205600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org                                  webrtc::ViECodec* codec_interface) {
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Set up the codec interface with all known receive codecs and with
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // I420 as the send codec.
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  for (int i = 0; i < codec_interface->NumberOfCodecs(); i++) {
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, codec_interface->GetCodec(i, video_codec));
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
265600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org    // Try to keep the test frame size small and bit rate generous when I420.
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (video_codec.codecType == webrtc::kVideoCodecI420) {
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec.width = 176;
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      video_codec.height = 144;
305600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org      video_codec.maxBitrate = 32000;
315600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org      video_codec.startBitrate = 32000;
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EXPECT_EQ(0, codec_interface->SetSendCodec(video_channel, video_codec));
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, codec_interface->SetReceiveCodec(video_channel, video_codec));
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Verify that we really found the I420 codec.
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, codec_interface->GetSendCodec(video_channel, video_codec));
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(webrtc::kVideoCodecI420, video_codec.codecType);
405600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org}
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
425600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.orgvoid TestI420CallSetup(webrtc::ViECodec* codec_interface,
435600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org                       webrtc::VideoEngine* video_engine,
445600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org                       webrtc::ViEBase* base_interface,
455600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org                       webrtc::ViENetwork* network_interface,
4619f89a1ab2ebe75e38d192c42453e9c50aae0c64stefan@webrtc.org                       webrtc::ViERTP_RTCP* rtp_rtcp_interface,
475600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org                       int video_channel,
485600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org                       const char* device_name) {
495600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  webrtc::VideoCodec video_codec;
505600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  memset(&video_codec, 0, sizeof(webrtc::VideoCodec));
5119f89a1ab2ebe75e38d192c42453e9c50aae0c64stefan@webrtc.org  EXPECT_EQ(0, rtp_rtcp_interface->SetTransmissionSmoothingStatus(video_channel,
5219f89a1ab2ebe75e38d192c42453e9c50aae0c64stefan@webrtc.org                                                                  false));
535600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org
545600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  ConfigureCodecsToI420(video_channel, video_codec, codec_interface);
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
565600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  TbExternalTransport external_transport(
575600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org      *network_interface, video_channel, NULL);
585600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  EXPECT_EQ(0, network_interface->RegisterSendTransport(
595600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org      video_channel, external_transport));
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, base_interface->StartReceive(video_channel));
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, base_interface->StartSend(video_channel));
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
635600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  // Let the call run for a while.
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViETest::Log("Call started");
655dee0551c0a2d86cf524e80c033936d3827a20c6stefan@webrtc.org  AutoTestSleep(kAutoTestSleepTimeMs);
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
675600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  // Stop the call.
685600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  ViETest::Log("Stopping call.");
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_EQ(0, base_interface->StopSend(video_channel));
705600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org
715600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  // Make sure we receive all packets.
725600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  AutoTestSleep(1000);
735600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org
745600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  EXPECT_EQ(0, base_interface->StopReceive(video_channel));
755600f6e86d3994726249fd1c77377c1d8534f107phoglund@webrtc.org  EXPECT_EQ(0, network_interface->DeregisterSendTransport(video_channel));
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
77