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 "webrtc/video_engine/test/auto_test/primitives/general_primitives.h"
12
13 #include "webrtc/modules/video_capture/include/video_capture_factory.h"
14 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest.h"
15 #include "webrtc/video_engine/test/auto_test/interface/vie_autotest_defines.h"
16 #include "webrtc/video_engine/test/libvietest/include/vie_to_file_renderer.h"
17
FindCaptureDeviceOnSystem(webrtc::ViECapture * capture,char * device_name,unsigned int device_name_length,int * device_id,webrtc::VideoCaptureModule ** device_video)18 void FindCaptureDeviceOnSystem(webrtc::ViECapture* capture,
19 char* device_name,
20 unsigned int device_name_length,
21 int* device_id,
22 webrtc::VideoCaptureModule** device_video) {
23
24 bool capture_device_set = false;
25 webrtc::VideoCaptureModule::DeviceInfo *dev_info =
26 webrtc::VideoCaptureFactory::CreateDeviceInfo(0);
27
28 const unsigned int kMaxUniqueIdLength = 256;
29 char unique_id[kMaxUniqueIdLength];
30 memset(unique_id, 0, kMaxUniqueIdLength);
31
32 for (unsigned int i = 0; i < dev_info->NumberOfDevices(); i++) {
33 EXPECT_EQ(0, dev_info->GetDeviceName(i, device_name, device_name_length,
34 unique_id, kMaxUniqueIdLength));
35
36 *device_video = webrtc::VideoCaptureFactory::Create(4571, unique_id);
37 EXPECT_TRUE(*device_video != NULL);
38
39 if (*device_video) {
40 (*device_video)->AddRef();
41
42 int error = capture->AllocateCaptureDevice(**device_video, *device_id);
43 if (error == 0) {
44 ViETest::Log("Using capture device: %s, captureId: %d.",
45 device_name, *device_id);
46 capture_device_set = true;
47 break;
48 } else {
49 (*device_video)->Release();
50 (*device_video) = NULL;
51 }
52 }
53 }
54 delete dev_info;
55 EXPECT_TRUE(capture_device_set) << "Found no suitable camera on your system.";
56 }
57
RenderInWindow(webrtc::ViERender * video_render_interface,int frame_provider_id,void * os_window,float z_index)58 void RenderInWindow(webrtc::ViERender* video_render_interface,
59 int frame_provider_id,
60 void* os_window,
61 float z_index) {
62 EXPECT_EQ(0,
63 video_render_interface->AddRenderer(frame_provider_id, os_window,
64 z_index, 0.0, 0.0, 1.0, 1.0));
65 EXPECT_EQ(0, video_render_interface->StartRender(frame_provider_id));
66 }
67
RenderToFile(webrtc::ViERender * renderer_interface,int frame_provider_id,ViEToFileRenderer * to_file_renderer)68 void RenderToFile(webrtc::ViERender* renderer_interface,
69 int frame_provider_id,
70 ViEToFileRenderer *to_file_renderer) {
71 EXPECT_EQ(0, renderer_interface->AddRenderer(
72 frame_provider_id, webrtc::kVideoI420, to_file_renderer));
73 EXPECT_EQ(0, renderer_interface->StartRender(frame_provider_id));
74 }
75
ConfigureRtpRtcp(webrtc::ViERTP_RTCP * rtcp_interface,ProtectionMethod protection_method,int video_channel)76 void ConfigureRtpRtcp(webrtc::ViERTP_RTCP* rtcp_interface,
77 ProtectionMethod protection_method,
78 int video_channel) {
79 EXPECT_EQ(0, rtcp_interface->SetRTCPStatus(video_channel,
80 webrtc::kRtcpCompound_RFC4585));
81 EXPECT_EQ(0, rtcp_interface->SetKeyFrameRequestMethod(
82 video_channel, webrtc::kViEKeyFrameRequestPliRtcp));
83 EXPECT_EQ(0, rtcp_interface->SetTMMBRStatus(video_channel, true));
84 switch (protection_method) {
85 case kNack:
86 EXPECT_EQ(0, rtcp_interface->SetNACKStatus(video_channel, true));
87 break;
88 case kHybridNackFec:
89 const int kRedPayloadType = 96;
90 const int kUlpFecPayloadType = 97;
91 EXPECT_EQ(0, rtcp_interface->SetHybridNACKFECStatus(video_channel,
92 true,
93 kRedPayloadType,
94 kUlpFecPayloadType));
95 break;
96 }
97 }
98
FindSpecificCodec(webrtc::VideoCodecType of_type,webrtc::ViECodec * codec_interface,webrtc::VideoCodec * result)99 bool FindSpecificCodec(webrtc::VideoCodecType of_type,
100 webrtc::ViECodec* codec_interface,
101 webrtc::VideoCodec* result) {
102
103 memset(result, 0, sizeof(webrtc::VideoCodec));
104
105 for (int i = 0; i < codec_interface->NumberOfCodecs(); i++) {
106 webrtc::VideoCodec codec;
107 memset(&codec, 0, sizeof(webrtc::VideoCodec));
108 if (codec_interface->GetCodec(i, codec) != 0) {
109 return false;
110 }
111 if (codec.codecType == of_type) {
112 // Done
113 *result = codec;
114 return true;
115 }
116 }
117 // Didn't find it
118 return false;
119 }
120
SetSuitableResolution(webrtc::VideoCodec * video_codec,int forced_codec_width,int forced_codec_height)121 void SetSuitableResolution(webrtc::VideoCodec* video_codec,
122 int forced_codec_width,
123 int forced_codec_height) {
124 if (forced_codec_width != kDoNotForceResolution &&
125 forced_codec_height != kDoNotForceResolution) {
126 video_codec->width = forced_codec_width;
127 video_codec->height = forced_codec_height;
128 } else if (video_codec->codecType == webrtc::kVideoCodecI420) {
129 // I420 is very bandwidth heavy, so limit it here.
130 video_codec->width = 176;
131 video_codec->height = 144;
132 } else {
133 // Otherwise go with 640x480.
134 video_codec->width = 640;
135 video_codec->height = 480;
136 }
137 }
138