99 lines
2.7 KiB
C++
99 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "CaptureDevicePool.h"
|
|
#include "map_wrapper.h"
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
#include "critical_section_wrapper.h"
|
|
#include "vie_file.h"
|
|
|
|
CaptureDevicePool::CaptureDevicePool(VideoEngine* videoEngine):
|
|
_critSect(*CriticalSectionWrapper::CreateCriticalSection()),
|
|
_vieCapture(ViECapture::GetInterface(videoEngine)),
|
|
_vieFile(ViEFile::GetInterface(videoEngine))
|
|
{
|
|
}
|
|
|
|
CaptureDevicePool::~CaptureDevicePool(void)
|
|
{
|
|
assert(_deviceMap.Size()==0);
|
|
_vieCapture->Release();
|
|
_vieFile->Release();
|
|
delete &_critSect;
|
|
}
|
|
|
|
WebRtc_Word32 CaptureDevicePool::GetCaptureDevice(int& captureId, const char* uniqeDeviceName)
|
|
{
|
|
CriticalSectionScoped cs(_critSect);
|
|
DeviceItem* device=NULL;
|
|
|
|
for(MapItem* item=_deviceMap.First();
|
|
item!=NULL;
|
|
item=_deviceMap.Next(item))
|
|
{
|
|
//Found the device?
|
|
if(strcmp(uniqeDeviceName,(static_cast<DeviceItem*>( item->GetItem()))->uniqeDeviceName)==0)
|
|
{
|
|
device=static_cast<DeviceItem*>( item->GetItem());
|
|
device->refCount++;
|
|
captureId=device->captureId;
|
|
return 0;
|
|
}
|
|
}
|
|
device = new DeviceItem;
|
|
strncpy(device->uniqeDeviceName,uniqeDeviceName,255);
|
|
|
|
|
|
// Device does not exist. Create it.
|
|
WebRtc_Word32 result=_vieCapture->AllocateCaptureDevice(device->uniqeDeviceName,strlen(device->uniqeDeviceName),device->captureId);
|
|
if(result==0)
|
|
{
|
|
//CaptureCapability cap;
|
|
/*cap.height=1080;
|
|
cap.width=1920;
|
|
cap.maxFPS=25;
|
|
cap.interlaced=true;*/
|
|
// result=_vieCapture->StartCapture(device->captureId,cap);
|
|
result=_vieFile->SetCaptureDeviceImage(device->captureId,"captureDeviceImage.jpg");
|
|
}
|
|
captureId=device->captureId;
|
|
_deviceMap.Insert(captureId,device);
|
|
device->refCount++;
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
WebRtc_Word32 CaptureDevicePool::ReturnCaptureDevice(int captureId)
|
|
{
|
|
CriticalSectionScoped cs(_critSect);
|
|
|
|
MapItem* mapItem=_deviceMap.Find(captureId);
|
|
if(!mapItem)
|
|
return -1;
|
|
|
|
DeviceItem* item=static_cast<DeviceItem*> (mapItem->GetItem());
|
|
if(!item)
|
|
return 0;
|
|
item->refCount--;
|
|
WebRtc_Word32 result=0;
|
|
|
|
if(item->refCount==0)
|
|
{
|
|
result=_vieCapture->ReleaseCaptureDevice(captureId);
|
|
|
|
_deviceMap.Erase(mapItem);
|
|
delete item;
|
|
|
|
}
|
|
return result;
|
|
}
|