blob: 8f7c9a2d7ff3e3593ad4057d88b80e5c9d94c999 [file] [log] [blame]
/*
* 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;
}