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
11281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_capture_device.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
14281cff8cd679728fe395f7f0203c05e763c0c789pbos@webrtc.org#include "webrtc/video_engine/test/libvietest/include/tb_interfaces.h"
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTbCaptureDevice::TbCaptureDevice(TbInterfaces& Engine) :
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    captureId(-1),
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ViE(Engine),
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    vcpm_(NULL)
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const unsigned int KMaxDeviceNameLength = 128;
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    const unsigned int KMaxUniqueIdLength = 256;
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char deviceName[KMaxDeviceNameLength];
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(deviceName, 0, KMaxDeviceNameLength);
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    char uniqueId[KMaxUniqueIdLength];
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    memset(uniqueId, 0, KMaxUniqueIdLength);
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool captureDeviceSet = false;
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    webrtc::VideoCaptureModule::DeviceInfo* devInfo =
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        webrtc::VideoCaptureFactory::CreateDeviceInfo(0);
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    for (size_t captureIdx = 0;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        captureIdx < devInfo->NumberOfDevices();
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        captureIdx++)
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        EXPECT_EQ(0, devInfo->GetDeviceName(captureIdx, deviceName,
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                            KMaxDeviceNameLength, uniqueId,
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                            KMaxUniqueIdLength));
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        vcpm_ = webrtc::VideoCaptureFactory::Create(
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            captureIdx, uniqueId);
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (vcpm_ == NULL)  // Failed to open this device. Try next.
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            continue;
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        vcpm_->AddRef();
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int error = ViE.capture->AllocateCaptureDevice(*vcpm_, captureId);
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (error == 0)
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        {
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            captureDeviceSet = true;
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            break;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    delete devInfo;
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_TRUE(captureDeviceSet);
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!captureDeviceSet) {
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return;
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    device_name_ = deviceName;
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, ViE.capture->StartCapture(captureId));
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTbCaptureDevice::~TbCaptureDevice(void)
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, ViE.capture->StopCapture(captureId));
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, ViE.capture->ReleaseCaptureDevice(captureId));
69e293cde234169fcd129599efb0a47d2544367e96tommi@webrtc.org    if (vcpm_)
70e293cde234169fcd129599efb0a47d2544367e96tommi@webrtc.org      vcpm_->Release();
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid TbCaptureDevice::ConnectTo(int videoChannel)
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, ViE.capture->ConnectCaptureDevice(captureId, videoChannel));
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid TbCaptureDevice::Disconnect(int videoChannel)
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_EQ(0, ViE.capture->DisconnectCaptureDevice(videoChannel));
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string TbCaptureDevice::device_name() const {
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return device_name_;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
86