📄 videoio.cxx
字号:
/*
* videoio.cxx
*
* Classes to support streaming video input (grabbing) and output.
*
* Portable Windows Library
*
* Copyright (c) 1993-2000 Equivalence Pty. Ltd.
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is Portable Windows Library.
*
* The Initial Developer of the Original Code is Equivalence Pty. Ltd.
*
* Contributor(s): Mark Cooke (mpc@star.sr.bham.ac.uk)
*
* $Log: videoio.cxx,v $
* Revision 1.3 2006/08/08 10:50:27 joegenbaclor
* Fixed compil error on linux where pragma implemntation is never reached
*
* Revision 1.2 2006/08/03 12:48:08 joegenbaclor
* Minor tweaks for integrating pwlib into OSS source tree
*
* Revision 1.1 2006/06/29 04:18:19 joegenbaclor
* *** empty log message ***
*
* Revision 1.61 2006/04/19 04:10:27 csoutheren
* Fix problem when using converter when frame size not supported
*
* Revision 1.60 2006/03/07 20:53:51 dsandras
* Added support for JPEG based webcams, thanks to Luc Saillard <luc saillard org>.
*
* Revision 1.59 2006/01/29 22:46:39 csoutheren
* Added support for cameras that return MJPEG streams
* Thanks to Luc Saillard and Damien Sandras
*
* Revision 1.58 2006/01/09 18:19:13 dsandras
* Add YUY2 (or YUV420) format. Resizing to YUV420P is done, but it's not very
* efficient.
* Fix the gray border when doing padding for YUV420P (change it to black).
* Logitech webcam fusion export only big format in yuy2.
* Patches provided by Luc Saillard <luc _AT____ saillard.org>. Many thanks!
*
* Revision 1.57 2005/11/30 12:47:42 csoutheren
* Removed tabs, reformatted some code, and changed tags for Doxygen
*
* Revision 1.56 2005/09/06 12:41:22 rjongbloed
* Fixed correct creation (or non creation) of converter when using SetFrameSizeConverter()
*
* Revision 1.55 2005/08/23 12:42:23 rjongbloed
* Fixed problems with negative hight native flipping not working with all sizes.
*
* Revision 1.54 2005/08/09 09:08:12 rjongbloed
* Merged new video code from branch back to the trunk.
*
* Revision 1.53.6.2 2005/07/17 12:17:41 rjongbloed
* Fixed deadlock changing size
*
* Revision 1.53.6.1 2005/07/17 09:27:08 rjongbloed
* Major revisions of the PWLib video subsystem including:
* removal of F suffix on colour formats for vertical flipping, all done with existing bool
* working through use of RGB and BGR formats so now consistent
* cleaning up the plug in system to use virtuals instead of pointers to functions.
* rewrite of SDL to be a plug in compatible video output device.
* extensive enhancement of video test program
*
* Revision 1.53 2005/01/04 08:09:42 csoutheren
* Fixed Linux configure problems
*
* Revision 1.52 2004/11/17 10:13:14 csoutheren
* Fixed compilation with gcc 4.0.0
*
* Revision 1.51 2004/10/27 09:24:18 dsandras
* Added patch from Nicola Orru' to convert from SBGGR8 to YUV420P. Thanks!
*
* Revision 1.50 2004/10/23 10:54:39 ykiryanov
* Added ifdef _WIN32_WCE for PocketPC 2003 SDK port
*
* Revision 1.49 2004/08/16 06:40:59 csoutheren
* Added adapters template to make device plugins available via the abstract factory interface
*
* Revision 1.48 2004/04/18 12:49:22 csoutheren
* Patches to video code thanks to Guilhem Tardy (hope I get it right this time :)
*
* Revision 1.47 2004/04/03 23:53:10 csoutheren
* Added various changes to improce compatibility with the Sun Forte compiler
* Thanks to Brian Cameron
* Added detection of readdir_r version
*
* Revision 1.46 2004/01/18 14:25:58 dereksmithies
* New methods to make the opening of video input devices easier.
*
* Revision 1.45 2004/01/17 17:41:50 csoutheren
* Changed to use PString::MakeEmpty
*
* Revision 1.44 2003/12/14 10:01:02 rjongbloed
* Resolved issue with name space conflict os static and virtual forms of GetDeviceNames() function.
*
* Revision 1.43 2003/11/23 22:17:35 dsandras
* Added YUV420P to BGR24 and BGR32 conversion.
*
* Revision 1.42 2003/11/19 04:30:15 csoutheren
* Changed to support video output plugins
*
* Revision 1.41 2003/11/18 10:40:51 csoutheren
* Added pragma implementation to fix vtable link problems
*
* Revision 1.40 2003/11/18 06:46:38 csoutheren
* Changed to support video input plugins
*
* Revision 1.39 2003/05/14 07:51:23 rjongbloed
* Changed SetColourFormatConverter so if converter already in place no
* change is made.
* Fixed some trace logs.
*
* Revision 1.38 2003/04/03 23:21:34 robertj
* Added reversed RGB byte order versions (BGR24), thanks Damien Sandras
*
* Revision 1.37 2003/03/21 04:09:33 robertj
* Changed PPM video output device so you can specify the full format of the
* output file uinng printf command for the frame number eg %u or %03i or
* something. If there is no %u in the Opan() argument, a %u is added after
* the filename.
* Fixed video output RGB SetFrameData so abide by correct semantics. The input
* is aways to be what was set using SetColourFormat() or
* SetColourFormatConverter().
*
* Revision 1.36 2003/03/20 23:42:01 dereks
* Make PPM video output device work correctly.
*
* Revision 1.35 2003/03/17 07:50:41 robertj
* Added OpenFull() function to open with all video parameters in one go.
* Made sure vflip variable is set in converter even if converter has not
* been set yet, should not depend on the order of functions!
* Removed canCaptureVideo variable as this is really a virtual function to
* distinguish PVideoOutputDevice from PVideoInputDevice, it is not dynamic.
* Made significant enhancements to PVideoOutputDevice class.
* Added PVideoOutputDevice descendants for NULL and PPM files.
*
* Revision 1.34 2002/09/01 23:25:26 dereks
* Documentation fix from Walter Whitlock. Many thanks.
*
* Revision 1.33 2002/09/01 22:38:21 dereks
* Remove previous clarification, cause it breaks openphone code.
*
* Revision 1.32 2002/08/30 02:31:43 dereks
* Make operation of the code more clear. Thanks Diego Tartara
*
* Revision 1.31 2002/04/12 08:24:53 robertj
* Added text string output for tracing video format.
*
* Revision 1.30 2002/04/07 22:49:32 rogerh
* Add some comments
*
* Revision 1.29 2002/04/05 06:41:54 rogerh
* Apply video changes from Damien Sandras <dsandras@seconix.com>.
* The Video Channel and Format are no longer set in Open(). Instead
* call the new SetVideoChannelFormat() method. This makes video capture
* and GnomeMeeting more stable with certain Linux video capture devices.
*
* Revision 1.28 2002/02/20 02:37:26 dereks
* Initial release of Firewire camera support for linux.
* Many thanks to Ryutaroh Matsumoto <ryutaroh@rmatsumoto.org>.
*
* Revision 1.27 2002/01/17 20:20:46 dereks
* Adjust PVideoInputDevice::SetVFlipState to cope better when a converter class is
* not attached. Thanks Walter Whitlock.
*
* Revision 1.26 2002/01/16 07:51:16 robertj
* MSVC compatibilty changes
*
* Revision 1.25 2002/01/14 02:59:41 robertj
* Added preferred colour format selection, thanks Walter Whitlock
*
* Revision 1.24 2002/01/08 01:32:20 robertj
* Tidied up some PTRACE debug output.
*
* Revision 1.23 2002/01/04 04:11:45 dereks
* Add video flip code from Walter Whitlock, which flips code at the grabber.
*
* Revision 1.22 2001/12/10 22:23:43 dereks
* Enable resize of CIF source image into QCIF size.
*
* Revision 1.21 2001/12/06 22:15:09 dereks
* Additional debugging lines
*
* Revision 1.20 2001/11/28 04:45:14 robertj
* Added Win32 flipped RGB colour formats.
*
* Revision 1.19 2001/11/28 00:07:32 dereks
* Locking added to PVideoChannel, allowing reader/writer to be changed mid call
* Enabled adjustment of the video frame rate
* New fictitous image, a blank grey area
*
* Revision 1.18 2001/09/25 04:25:38 dereks
* Add fix from Stelian Pop to improve the field of view for
* the small image with a Sony Vaio Motion Eye. Many thanks.
*
* Revision 1.17 2001/08/03 04:21:51 dereks
* Add colour/size conversion for YUV422->YUV411P
* Add Get/Set Brightness,Contrast,Hue,Colour for PVideoDevice, and
* Linux PVideoInputDevice.
* Add lots of PTRACE statement for debugging colour conversion.
* Add support for Sony Vaio laptop under linux. Requires 2.4.7 kernel.
*
* Revision 1.16 2001/06/27 17:23:33 rogerh
* Back out my previous change
*
* Revision 1.15 2001/06/26 15:48:31 rogerh
* Do not call GetInputDeviceName if there is no video grabber code
*
* Revision 1.14 2001/05/22 23:38:45 robertj
* Fixed bug in PVideoOutputDevice, removed redundent SetFrameSize.
*
* Revision 1.13 2001/03/20 02:21:57 robertj
* More enhancements from Mark Cooke
*
* Revision 1.12 2001/03/08 08:31:34 robertj
* Numerous enhancements to the video grabbing code including resizing
* infrastructure to converters. Thanks a LOT, Mark Cooke.
*
* Revision 1.11 2001/03/08 02:18:45 robertj
* Added improved defaulting of video formats so Open() does not fail.
* Removed the requirement that the device be open before you can set
* formats such as colour, video, channel number etc.
*
* Revision 1.10 2001/03/07 01:41:03 dereks
* Fix memory leak, on destroying PVideoDevice
* Ensure converter class is resized correctly.
*
* Revision 1.9 2001/03/06 23:34:20 robertj
* Added static function to get input device names.
* Moved some inline virtuals to non-inline.
*
* Revision 1.8 2001/03/05 01:12:41 robertj
* Added more source formats for conversion, use list. Thanks Mark Cooke.
*
* Revision 1.7 2001/03/03 05:06:31 robertj
* Major upgrade of video conversion and grabbing classes.
*
* Revision 1.6 2000/12/19 22:20:26 dereks
* Add video channel classes to connect to the PwLib PVideoInputDevice class.
* Add PFakeVideoInput class to generate test images for video.
*
* Revision 1.5 2000/11/09 00:20:58 robertj
* Added qcif size constants
*
* Revision 1.4 2000/07/26 03:50:50 robertj
* Added last error variable to video device.
*
* Revision 1.3 2000/07/26 02:13:48 robertj
* Added some more "common" bounds checking to video device.
*
* Revision 1.2 2000/07/25 13:38:26 robertj
* Added frame rate parameter to video frame grabber.
*
* Revision 1.1 2000/07/15 09:47:35 robertj
* Added video I/O device classes.
*
*/
#ifndef _WIN32_WCE
#ifndef _WIN32
#pragma implementation "videoio.h"
#endif
#endif // !_WIN32_WCE
#include <ptlib.h>
#include <ptlib/videoio.h>
#include <ptlib/vconvert.h>
namespace PWLibStupidWindowsHacks {
int loadVideoStuff;
};
namespace PWLib {
PFactory<PDevicePluginAdapterBase>::Worker< PDevicePluginAdapter<PVideoInputDevice> > vidinChannelFactoryAdapter("PVideoInputDevice", TRUE);
PFactory<PDevicePluginAdapterBase>::Worker< PDevicePluginAdapter<PVideoOutputDevice> > vidoutChannelFactoryAdapter("PVideoOutputDevice", TRUE);
};
template <> PVideoInputDevice * PDevicePluginFactory<PVideoInputDevice>::Worker::Create(const PString & type) const
{
return PVideoInputDevice::CreateDevice(type);
}
template <> PVideoOutputDevice * PDevicePluginFactory<PVideoOutputDevice>::Worker::Create(const PString & type) const
{
return PVideoOutputDevice::CreateDevice(type);
}
///////////////////////////////////////////////////////////////////////////////
#if PTRACING
ostream & operator<<(ostream & strm, PVideoDevice::VideoFormat fmt)
{
static const char * const VideoFormatNames[PVideoDevice::NumVideoFormats] = {
"PAL",
"NTSC",
"SECAM",
"Auto"
};
if (fmt < PVideoDevice::NumVideoFormats && VideoFormatNames[fmt] != NULL)
strm << VideoFormatNames[fmt];
else
strm << "VideoFormat<" << (unsigned)fmt << '>';
return strm;
}
#endif
///////////////////////////////////////////////////////////////////////////////
// PVideoDevice
PVideoDevice::PVideoDevice()
{
lastError = 0;
videoFormat = Auto;
channelNumber = -1; // -1 will find the first working channel number.
frameWidth = CIFWidth;
frameHeight = CIFHeight;
nativeVerticalFlip = FALSE;
converter = NULL;
SetFrameRate(0);
}
PVideoDevice::~PVideoDevice()
{
if (converter)
delete converter;
}
BOOL PVideoDevice::OpenFull(const OpenArgs & args, BOOL startImmediate)
{
if (args.deviceName[0] == '#') {
PStringArray devices = GetDeviceNames();
PINDEX id = args.deviceName.Mid(1).AsUnsigned();
if (id == 0 || id > devices.GetSize())
return FALSE;
if (!Open(devices[id-1], FALSE))
return FALSE;
}
else {
if (!Open(args.deviceName, FALSE))
return FALSE;
}
if (!SetVideoFormat(args.videoFormat))
return FALSE;
if (!SetChannel(args.channelNumber))
return FALSE;
if (args.convertFormat) {
if (!SetColourFormatConverter(args.colourFormat))
return FALSE;
}
else {
if (!SetColourFormat(args.colourFormat))
return FALSE;
}
if (args.rate > 0) {
if (!SetFrameRate(args.rate))
return FALSE;
}
if (args.convertSize) {
if (!SetFrameSizeConverter(args.width, args.height, args.scaleSize))
return FALSE;
}
else {
if (!SetFrameSize(args.width, args.height))
return FALSE;
}
if (!SetVFlipState(args.flip))
return FALSE;
if (args.brightness >= 0) {
if (!SetBrightness(args.brightness))
return FALSE;
}
if (args.whiteness >= 0) {
if (!SetWhiteness(args.whiteness))
return FALSE;
}
if (args.contrast >= 0) {
if (!SetContrast(args.contrast))
return FALSE;
}
if (args.colour >= 0) {
if (!SetColour(args.colour))
return FALSE;
}
if (args.hue >= 0) {
if (!SetColour(args.hue))
return FALSE;
}
if (startImmediate)
return Start();
return TRUE;
}
BOOL PVideoDevice::Close()
{
return TRUE;
}
BOOL PVideoDevice::Start()
{
return TRUE;
}
BOOL PVideoDevice::Stop()
{
return TRUE;
}
BOOL PVideoDevice::SetVideoFormat(VideoFormat videoFmt)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -