📄 videoio.cxx
字号:
{
PBoolean err1, err2;
err1 = SetChannel (newNumber);
err2 = SetVideoFormat (newFormat);
return (err1 && err2);
}
PStringArray PVideoDevice::GetDeviceNames() const
{
return PStringArray();
}
///////////////////////////////////////////////////////////////////////////////
// PVideoOutputDevice
PVideoOutputDevice::PVideoOutputDevice()
{
}
PBoolean PVideoOutputDevice::CanCaptureVideo() const
{
return PFalse;
}
PBoolean PVideoOutputDevice::GetPosition(int &, int &) const
{
return PFalse;
}
///////////////////////////////////////////////////////////////////////////////
// PVideoOutputDeviceRGB
PVideoOutputDeviceRGB::PVideoOutputDeviceRGB()
{
PTRACE(6, "RGB\t Constructor of PVideoOutputDeviceRGB");
colourFormat = "RGB24";
bytesPerPixel = 3;
swappedRedAndBlue = false;
// SetFrameSize(frameWidth, frameHeight);
}
PBoolean PVideoOutputDeviceRGB::SetColourFormat(const PString & colourFormat)
{
PWaitAndSignal m(mutex);
PINDEX newBytesPerPixel;
if (colourFormat *= "RGB32") {
newBytesPerPixel = 4;
swappedRedAndBlue = false;
}
else if (colourFormat *= "RGB24") {
newBytesPerPixel = 3;
swappedRedAndBlue = false;
}
else if (colourFormat *= "BGR32") {
newBytesPerPixel = 4;
swappedRedAndBlue = true;
}
else if (colourFormat *= "BGR24") {
newBytesPerPixel = 3;
swappedRedAndBlue = true;
}
else
return PFalse;
if (!PVideoOutputDevice::SetColourFormat(colourFormat))
return PFalse;
bytesPerPixel = newBytesPerPixel;
scanLineWidth = ((frameWidth*bytesPerPixel+3)/4)*4;
return frameStore.SetSize(frameHeight*scanLineWidth);
}
PBoolean PVideoOutputDeviceRGB::SetFrameSize(unsigned width, unsigned height)
{
PWaitAndSignal m(mutex);
if (!PVideoOutputDevice::SetFrameSize(width, height))
return PFalse;
scanLineWidth = ((frameWidth*bytesPerPixel+3)/4)*4;
return frameStore.SetSize(frameHeight*scanLineWidth);
}
PINDEX PVideoOutputDeviceRGB::GetMaxFrameBytes()
{
PWaitAndSignal m(mutex);
return GetMaxFrameBytesConverted(frameStore.GetSize());
}
PBoolean PVideoOutputDeviceRGB::SetFrameData(unsigned x, unsigned y,
unsigned width, unsigned height,
const BYTE * data,
PBoolean endFrame)
{
PWaitAndSignal m(mutex);
if (x+width > frameWidth || y+height > frameHeight)
return PFalse;
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 PFalse;
}
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 PTrue;
}
///////////////////////////////////////////////////////////////////////////////
// PVideoOutputDevicePPM
#ifdef SHOULD_BE_MOVED_TO_PLUGIN
PVideoOutputDevicePPM::PVideoOutputDevicePPM()
{
PTRACE(6, "PPM\t Constructor of PVideoOutputDevicePPM");
frameNumber = 0;
}
PBoolean PVideoOutputDevicePPM::Open(const PString & name,
PBoolean /*startImmediate*/)
{
Close();
PFilePath path = name;
if (!PDirectory::Exists(path.GetDirectory()))
return PFalse;
if (path != psprintf(path, 12345))
deviceName = path;
else
deviceName = path.GetDirectory() + path.GetTitle() + "%u" + path.GetType();
return PTrue;
}
PBoolean PVideoOutputDevicePPM::IsOpen()
{
return !deviceName;
}
PBoolean PVideoOutputDevicePPM::Close()
{
deviceName.MakeEmpty();
return PTrue;
}
PStringArray PVideoOutputDevicePPM::GetDeviceNames() const
{
return PDirectory();
}
PBoolean 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 PFalse;
}
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 PFalse;
}
PTRACE(6, "PPMVid\tFinished writing PPM file " << file.GetName());
return file.Close();
}
#endif // SHOULD_BE_MOVED_TO_PLUGIN
///////////////////////////////////////////////////////////////////////////////
// PVideoInputDevice
PBoolean PVideoInputDevice::CanCaptureVideo() const
{
return PTrue;
}
static const char videoInputPluginBaseClass[] = "PVideoInputDevice";
PStringArray PVideoInputDevice::GetDriverNames(PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return pluginMgr->GetPluginsProviding(videoInputPluginBaseClass);
}
PStringArray 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, const PString & driverName, PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return (PVideoInputDevice *)pluginMgr->CreatePluginsDeviceByName(deviceName, videoInputPluginBaseClass,0,driverName);
}
PBoolean PVideoInputDevice::GetDeviceCapabilities(const PString & deviceName, Capabilities * caps, PPluginManager * pluginMgr)
{
return GetDeviceCapabilities(deviceName, "*", caps, pluginMgr);
}
PBoolean PVideoInputDevice::GetDeviceCapabilities(const PString & deviceName, const PString & driverName, Capabilities * caps, PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return pluginMgr->GetPluginsDeviceCapabilities(videoInputPluginBaseClass,driverName,deviceName, caps);
}
PVideoInputDevice * PVideoInputDevice::CreateOpenedDevice(const PString & driverName,
const PString & deviceName,
PBoolean startImmediate,
PPluginManager * pluginMgr)
{
PString adjustedDeviceName = deviceName;
PVideoInputDevice * device = CreateDeviceWithDefaults<PVideoInputDevice>(adjustedDeviceName, driverName, pluginMgr);
if (device == NULL)
return NULL;
if (device->Open(adjustedDeviceName, startImmediate))
return device;
delete device;
return NULL;
}
PVideoInputDevice * PVideoInputDevice::CreateOpenedDevice(const OpenArgs & args,
PBoolean startImmediate)
{
OpenArgs adjustedArgs = args;
PVideoInputDevice * device = CreateDeviceWithDefaults<PVideoInputDevice>(adjustedArgs.deviceName, args.driverName, NULL);
if (device == NULL)
return NULL;
if (device->OpenFull(adjustedArgs, startImmediate))
return device;
delete device;
return NULL;
}
PBoolean PVideoInputDevice::GetFrame(PBYTEArray & frame)
{
PINDEX returned;
if (!GetFrameData(frame.GetPointer(GetMaxFrameBytes()), &returned))
return PFalse;
frame.SetSize(returned);
return PTrue;
}
PBoolean PVideoInputDevice::GetFrameData(
BYTE * buffer,
PINDEX * bytesReturned,
unsigned int & flags
)
{
flags = 0;
return GetFrameData(buffer, bytesReturned);
}
PBoolean PVideoInputDevice::GetFrameDataNoDelay(
BYTE * buffer,
PINDEX * bytesReturned,
unsigned & flags
)
{
flags = 0;
return GetFrameDataNoDelay(buffer, bytesReturned);
}
PBoolean PVideoOutputDevice::SetFrameData(
unsigned x,
unsigned y,
unsigned width,
unsigned height,
const BYTE * data,
PBoolean endFrame,
unsigned /*flags*/
)
{
return SetFrameData(x, y, width, height, data, endFrame);
}
////////////////////////////////////////////////////////////////////////////////////////////
static const char videoOutputPluginBaseClass[] = "PVideoOutputDevice";
PStringArray PVideoOutputDevice::GetDriverNames(PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return pluginMgr->GetPluginsProviding(videoOutputPluginBaseClass);
}
PStringArray 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, const PString & driverName, PPluginManager * pluginMgr)
{
if (pluginMgr == NULL)
pluginMgr = &PPluginManager::GetPluginManager();
return (PVideoOutputDevice *)pluginMgr->CreatePluginsDeviceByName(deviceName, videoOutputPluginBaseClass, 0, driverName);
}
PVideoOutputDevice * PVideoOutputDevice::CreateOpenedDevice(const PString &driverName,
const PString &deviceName,
PBoolean startImmediate,
PPluginManager * pluginMgr)
{
PString adjustedDeviceName = deviceName;
PVideoOutputDevice * device = CreateDeviceWithDefaults<PVideoOutputDevice>(adjustedDeviceName, driverName, pluginMgr);
if (device == NULL)
return NULL;
if (device->Open(adjustedDeviceName, startImmediate))
return device;
delete device;
return NULL;
}
PVideoOutputDevice * PVideoOutputDevice::CreateOpenedDevice(const OpenArgs & args,
PBoolean startImmediate)
{
OpenArgs adjustedArgs = args;
PVideoOutputDevice * device = CreateDeviceWithDefaults<PVideoOutputDevice>(adjustedArgs.deviceName, args.driverName, NULL);
if (device == NULL)
return NULL;
if (device->OpenFull(adjustedArgs, startImmediate))
return device;
delete device;
return NULL;
}
#endif // P_VIDEO
// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -