📄 vidinput_bsd.cxx
字号:
/*
* video4bsd.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): Roger Hardiman <roger@freebsd.org>
*
* $Log: vidinput_bsd.cxx,v $
* Revision 1.1 2006/06/29 04:17:59 joegenbaclor
* *** empty log message ***
*
* Revision 1.2 2005/08/09 09:08:09 rjongbloed
* Merged new video code from branch back to the trunk.
*
* Revision 1.1.8.2 2005/07/24 09:01:47 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.1.8.1 2005/07/17 09:27:04 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.1 2003/12/12 04:38:17 rogerhardiman
* Add plugin for the BSD Video Capture API (also called the meteor API)
* for FreeBSD, NetBSD and OpenBSD
*
* Revision 1.20 2002/10/28 19:12:45 rogerh
* Add svideo input support for Lars Eggert <larse@isi.edu>
*
* Revision 1.19 2002/04/10 08:40:36 rogerh
* Simplify the SetVideoChannelFormat() code. Use the implementation in the
* ancestor class.
*
* Revision 1.18 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.17 2002/01/08 17:16:13 rogerh
* Add code to grab Even fields (instead of interlaced frames) whenever
* possible. This improves the image quality.
* Add TestAllFormats
*
* Revision 1.16 2001/12/05 14:45:20 rogerh
* Implement GetFrameData and GetFrameDataNoDelay
*
* Revision 1.15 2001/12/05 14:32:48 rogerh
* Add GetParemters function
*
* Revision 1.14 2001/08/06 06:56:16 rogerh
* Add scaling for new methods to match BSD's Meteor API
*
* Revision 1.13 2001/08/06 06:19:33 rogerh
* Implement Brightness, Contract and Hue methods.
*
* Revision 1.12 2001/03/26 16:02:01 rogerh
* Add dummy function for VerifyHardwareFrameSize
*
* Revision 1.11 2001/03/08 03:59:13 robertj
* Fixed previous change, needed to allow for -1 as chammelNumber in Open().
*
* Revision 1.10 2001/03/08 02:23:17 robertj
* Added improved defaulting of video formats so Open() does not fail.
*
* Revision 1.9 2001/03/07 00:10:05 robertj
* Improved the device list, uses /proc, thanks Thorsten Westheider.
*
* Revision 1.8 2001/03/03 23:29:00 robertj
* Oops, fixed BSD version of video.
*
* Revision 1.7 2001/03/03 23:25:07 robertj
* Fixed use of video conversion function, returning bytes in destination frame.
*
* Revision 1.6 2001/03/03 06:13:01 robertj
* Major upgrade of video conversion and grabbing classes.
*
* Revision 1.5 2001/01/11 13:26:39 rogerh
* Add me in the Contributors section
*
* Revision 1.4 2001/01/05 18:12:30 rogerh
* First fully working version of video4bsd.
* Note that Start() and Stop() are not called, hence the first time hacks
* in GetFrameData(). Also video is always grabbed in interlaced mode
* so it does not look as good as it could.
*
* Revision 1.3 2001/01/05 14:52:36 rogerh
* More work on the FreeBSD video capture code
*
* Revision 1.2 2001/01/04 18:02:16 rogerh
* remove some old parts refering to linux
*
* Revision 1.1 2001/01/04 18:00:43 rogerh
* Start to add support for video capture using on FreeBSD/NetBSD and OpenBSD
* using the Meteor API (used by the Matrox Meteor and the bktr driver for
* Bt848/Bt878 TV Tuner Cards). This is incomplete but it does compile.
*/
#pragma implementation "vidinput_bsd.h"
#include "vidinput_bsd.h"
#include <sys/mman.h>
PCREATE_VIDINPUT_PLUGIN(BSDCAPTURE);
///////////////////////////////////////////////////////////////////////////////
// PVideoInputDevice_BSDCAPTURE
PVideoInputDevice_BSDCAPTURE::PVideoInputDevice_BSDCAPTURE()
{
videoFd = -1;
canMap = -1;
}
PVideoInputDevice_BSDCAPTURE::~PVideoInputDevice_BSDCAPTURE()
{
Close();
}
BOOL PVideoInputDevice_BSDCAPTURE::Open(const PString & devName, BOOL startImmediate)
{
Close();
deviceName = devName;
videoFd = ::open((const char *)devName, O_RDONLY);
if (videoFd < 0) {
videoFd = -1;
return FALSE;
}
// fill in a device capabilities structure
videoCapability.minheight = 32;
videoCapability.minwidth = 32;
videoCapability.maxheight = 768;
videoCapability.maxwidth = 576;
videoCapability.channels = 5;
// set height and width
frameHeight = videoCapability.maxheight;
frameWidth = videoCapability.maxwidth;
// select the specified input
if (!SetChannel(channelNumber)) {
::close (videoFd);
videoFd = -1;
return FALSE;
}
// select the video format (eg PAL, NTSC)
if (!SetVideoFormat(videoFormat)) {
::close (videoFd);
videoFd = -1;
return FALSE;
}
// select the colpur format (eg YUV420, or RGB)
if (!SetColourFormat(colourFormat)) {
::close (videoFd);
videoFd = -1;
return FALSE;
}
// select the image size
if (!SetFrameSize(frameWidth, frameHeight)) {
::close (videoFd);
videoFd = -1;
return FALSE;
}
return TRUE;
}
BOOL PVideoInputDevice_BSDCAPTURE::IsOpen()
{
return videoFd >= 0;
}
BOOL PVideoInputDevice_BSDCAPTURE::Close()
{
if (!IsOpen())
return FALSE;
ClearMapping();
::close(videoFd);
videoFd = -1;
canMap = -1;
return TRUE;
}
BOOL PVideoInputDevice_BSDCAPTURE::Start()
{
return TRUE;
}
BOOL PVideoInputDevice_BSDCAPTURE::Stop()
{
return TRUE;
}
BOOL PVideoInputDevice_BSDCAPTURE::IsCapturing()
{
return IsOpen();
}
PStringList PVideoInputDevice_BSDCAPTURE::GetInputDeviceNames()
{
PStringList list;
list.AppendString("/dev/bktr0");
list.AppendString("/dev/bktr1");
list.AppendString("/dev/meteor0");
list.AppendString("/dev/meteor1");
return list;
}
BOOL PVideoInputDevice_BSDCAPTURE::SetVideoFormat(VideoFormat newFormat)
{
if (!PVideoDevice::SetVideoFormat(newFormat))
return FALSE;
// set channel information
static int fmt[4] = { METEOR_FMT_PAL, METEOR_FMT_NTSC,
METEOR_FMT_SECAM, METEOR_FMT_AUTOMODE };
int format = fmt[newFormat];
// set the information
if (::ioctl(videoFd, METEORSFMT, &format) >= 0)
return TRUE;
// setting the format failed. Fall back trying other standard formats
if (newFormat != Auto)
return FALSE;
if (SetVideoFormat(PAL))
return TRUE;
if (SetVideoFormat(NTSC))
return TRUE;
if (SetVideoFormat(SECAM))
return TRUE;
return FALSE;
}
int PVideoInputDevice_BSDCAPTURE::GetNumChannels()
{
return videoCapability.channels;
}
BOOL PVideoInputDevice_BSDCAPTURE::SetChannel(int newChannel)
{
if (!PVideoDevice::SetChannel(newChannel))
return FALSE;
// set channel information
static int chnl[5] = { METEOR_INPUT_DEV0, METEOR_INPUT_DEV1,
METEOR_INPUT_DEV2, METEOR_INPUT_DEV3,
METEOR_INPUT_DEV_SVIDEO };
int channel = chnl[newChannel];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -