📄 videoio.cxx
字号:
{
if (converter == NULL)
return rawFrameBytes;
PINDEX srcFrameBytes = converter->GetMaxSrcFrameBytes();
PINDEX dstFrameBytes = converter->GetMaxDstFrameBytes();
PINDEX convertedFrameBytes = PMAX(srcFrameBytes, dstFrameBytes);
return PMAX(rawFrameBytes, convertedFrameBytes);
}
int PVideoDevice::GetBrightness()
{
return frameBrightness;
}
BOOL PVideoDevice::SetBrightness(unsigned newBrightness)
{
frameBrightness = newBrightness;
return TRUE;
}
int PVideoDevice::GetWhiteness()
{
return frameWhiteness;
}
BOOL PVideoDevice::SetWhiteness(unsigned newWhiteness)
{
frameWhiteness = newWhiteness;
return TRUE;
}
int PVideoDevice::GetColour()
{
return frameColour;
}
BOOL PVideoDevice::SetColour(unsigned newColour)
{
frameColour=newColour;
return TRUE;
}
int PVideoDevice::GetContrast()
{
return frameContrast;
}
BOOL PVideoDevice::SetContrast(unsigned newContrast)
{
frameContrast=newContrast;
return TRUE;
}
int PVideoDevice::GetHue()
{
return frameHue;
}
BOOL PVideoDevice::SetHue(unsigned newHue)
{
frameHue=newHue;
return TRUE;
}
BOOL PVideoDevice::GetParameters (int *whiteness,
int *brightness,
int *colour,
int *contrast,
int *hue)
{
if (!IsOpen())
return FALSE;
*brightness = frameBrightness;
*colour = frameColour;
*contrast = frameContrast;
*hue = frameHue;
*whiteness = frameWhiteness;
return TRUE;
}
BOOL PVideoDevice::SetVideoChannelFormat (int newNumber, VideoFormat newFormat)
{
BOOL err1, err2;
err1 = SetChannel (newNumber);
err2 = SetVideoFormat (newFormat);
return (err1 && err2);
}
PStringList PVideoDevice::GetDeviceNames() const
{
return PStringList();
}
///////////////////////////////////////////////////////////////////////////////
// PVideoOutputDevice
PVideoOutputDevice::PVideoOutputDevice()
{
}
BOOL PVideoOutputDevice::CanCaptureVideo() const
{
return FALSE;
}
///////////////////////////////////////////////////////////////////////////////
// PVideoOutputDeviceRGB
PVideoOutputDeviceRGB::PVideoOutputDeviceRGB()
{
PTRACE(6, "RGB\t Constructor of PVideoOutputDeviceRGB");
colourFormat = "RGB24";
bytesPerPixel = 3;
swappedRedAndBlue = false;
SetFrameSize(frameWidth, frameHeight);
}
BOOL PVideoOutputDeviceRGB::SetColourFormat(const PString & colourFormat)
{
PWaitAndSignal m(mutex);
PINDEX newBytesPerPixel;
bool newSwappedRedAndBlue;
if (colourFormat *= "RGB32") {
newBytesPerPixel = 4;
newSwappedRedAndBlue = false;
}
else if (colourFormat *= "RGB24") {
newBytesPerPixel = 3;
newSwappedRedAndBlue = false;
}
else if (colourFormat *= "BGR32") {
newBytesPerPixel = 4;
newSwappedRedAndBlue = true;
}
else if (colourFormat *= "BGR24") {
newBytesPerPixel = 3;
newSwappedRedAndBlue = true;
}
else
return FALSE;
if (!PVideoOutputDevice::SetColourFormat(colourFormat))
return FALSE;
bytesPerPixel = newBytesPerPixel;
scanLineWidth = ((frameWidth*bytesPerPixel+3)/4)*4;
return frameStore.SetSize(frameHeight*scanLineWidth);
}
BOOL PVideoOutputDeviceRGB::SetFrameSize(unsigned width, unsigned height)
{
PWaitAndSignal m(mutex);
if (!PVideoOutputDevice::SetFrameSize(width, height))
return FALSE;
scanLineWidth = ((frameWidth*bytesPerPixel+3)/4)*4;
return frameStore.SetSize(frameHeight*scanLineWidth);
}
PINDEX PVideoOutputDeviceRGB::GetMaxFrameBytes()
{
PWaitAndSignal m(mutex);
return GetMaxFrameBytesConverted(frameStore.GetSize());
}
BOOL PVideoOutputDeviceRGB::SetFrameData(unsigned x, unsigned y,
unsigned width, unsigned height,
const BYTE * data,
BOOL endFrame)
{
PWaitAndSignal m(mutex);
if (x+width > frameWidth || y+height > frameHeight)
return FALSE;
if (x == 0 && width == frameWidth && y == 0 && height == frameHeight) {
if (converter != NULL)
converter->Convert(data, frameStore.GetPointer());
else
memcpy(frameStore.GetPointer(), data, height*scanLineWidth);
}
else {
if (converter != NULL) {
PAssertAlways("Converted output of partial RGB frame not supported");
return FALSE;
}
if (x == 0 && width == frameWidth)
memcpy(frameStore.GetPointer() + y*scanLineWidth, data, height*scanLineWidth);
else {
for (unsigned dy = 0; dy < height; dy++)
memcpy(frameStore.GetPointer() + (y+dy)*scanLineWidth + x*bytesPerPixel,
data + dy*width*bytesPerPixel, width*bytesPerPixel);
}
}
if (endFrame)
return FrameComplete();
return TRUE;
}
///////////////////////////////////////////////////////////////////////////////
// PVideoOutputDevicePPM
#ifdef SHOULD_BE_MOVED_TO_PLUGIN
PVideoOutputDevicePPM::PVideoOutputDevicePPM()
{
PTRACE(6, "PPM\t Constructor of PVideoOutputDevicePPM");
frameNumber = 0;
}
BOOL PVideoOutputDevicePPM::Open(const PString & name,
BOOL /*startImmediate*/)
{
Close();
PFilePath path = name;
if (!PDirectory::Exists(path.GetDirectory()))
return FALSE;
if (path != psprintf(path, 12345))
deviceName = path;
else
deviceName = path.GetDirectory() + path.GetTitle() + "%u" + path.GetType();
return TRUE;
}
BOOL PVideoOutputDevicePPM::IsOpen()
{
return !deviceName;
}
BOOL PVideoOutputDevicePPM::Close()
{
deviceName.MakeEmpty();
return TRUE;
}
PStringList PVideoOutputDevicePPM::GetDeviceNames() const
{
PStringList list;
list += PDirectory();
return list;
}
BOOL PVideoOutputDevicePPM::EndFrame()
{
PFile file;
if (!file.Open(psprintf(deviceName, frameNumber++), PFile::WriteOnly)) {
PTRACE(1, "PPMVid\tFailed to open PPM output file \""
<< file.GetName() << "\": " << file.GetErrorText());
return FALSE;
}
file << "P6 " << frameWidth << " " << frameHeight << " " << 255 << "\n";
if (!file.Write(frameStore, frameStore.GetSize())) {
PTRACE(1, "PPMVid\tFailed to write frame data to PPM output file " << file.GetName());
return FALSE;
}
PTRACE(6, "PPMVid\tFinished writing PPM file " << file.GetName());
return file.Close();
}
#endif // SHOULD_BE_MOVED_TO_PLUGIN
///////////////////////////////////////////////////////////////////////////////
// PVideoInputDevice
BOOL PVideoInputDevice::CanCaptureVideo() const
{
return TRUE;
}
static const char videoInputPluginBaseClass[] = "PVideoInputDevice";
PStringList PVideoInputDevice::GetDriverNames(PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return pluginMgr->GetPluginsProviding(videoInputPluginBaseClass);
}
PStringList PVideoInputDevice::GetDriversDeviceNames(const PString & driverName, PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return pluginMgr->GetPluginsDeviceNames(driverName, videoInputPluginBaseClass);
}
PVideoInputDevice * PVideoInputDevice::CreateDevice(const PString &driverName, PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return (PVideoInputDevice *)pluginMgr->CreatePluginsDevice(driverName, videoInputPluginBaseClass);
}
PVideoInputDevice * PVideoInputDevice::CreateDeviceByName(const PString & deviceName, PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return (PVideoInputDevice *)pluginMgr->CreatePluginsDeviceByName(deviceName, videoInputPluginBaseClass);
}
PVideoInputDevice * PVideoInputDevice::CreateOpenedDevice(const PString & driverName,
const PString & deviceName,
BOOL startImmediate,
PPluginManager * pluginMgr)
{
PVideoInputDevice * device;
if (driverName.IsEmpty() || driverName == "*")
device = CreateDeviceByName(deviceName, pluginMgr);
else
device = CreateDevice(driverName, pluginMgr);
if (device != NULL && device->Open(deviceName, startImmediate))
return device;
delete device;
return NULL;
}
BOOL PVideoInputDevice::GetFrame(PBYTEArray & frame)
{
PINDEX returned;
if (!GetFrameData(frame.GetPointer(GetMaxFrameBytes()), &returned))
return FALSE;
frame.SetSize(returned);
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////
static const char videoOutputPluginBaseClass[] = "PVideoOutputDevice";
PStringList PVideoOutputDevice::GetDriverNames(PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return pluginMgr->GetPluginsProviding(videoOutputPluginBaseClass);
}
PStringList PVideoOutputDevice::GetDriversDeviceNames(const PString & driverName, PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return pluginMgr->GetPluginsDeviceNames(driverName, videoOutputPluginBaseClass);
}
PVideoOutputDevice * PVideoOutputDevice::CreateDevice(const PString & driverName, PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return (PVideoOutputDevice *)pluginMgr->CreatePluginsDevice(driverName, videoOutputPluginBaseClass);
}
PVideoOutputDevice * PVideoOutputDevice::CreateDeviceByName(const PString & deviceName, PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return (PVideoOutputDevice *)pluginMgr->CreatePluginsDeviceByName(deviceName, videoOutputPluginBaseClass);
}
PVideoOutputDevice * PVideoOutputDevice::CreateOpenedDevice(const PString &driverName,
const PString &deviceName,
BOOL startImmediate,
PPluginManager * pluginMgr)
{
PVideoOutputDevice * device;
if (driverName.IsEmpty() || driverName == "*")
device = CreateDeviceByName(deviceName, pluginMgr);
else
device = CreateDevice(driverName, pluginMgr);
if (device != NULL && device->Open(deviceName, startImmediate))
return device;
delete device;
return NULL;
}
// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -