videoio.h

Go to the documentation of this file.
00001 /*
00002  * videoio.h
00003  *
00004  * Classes to support streaming video input (grabbing) and output.
00005  *
00006  * Portable Windows Library
00007  *
00008  * Copyright (c) 1993-2000 Equivalence Pty. Ltd.
00009  *
00010  * The contents of this file are subject to the Mozilla Public License
00011  * Version 1.0 (the "License"); you may not use this file except in
00012  * compliance with the License. You may obtain a copy of the License at
00013  * http://www.mozilla.org/MPL/
00014  *
00015  * Software distributed under the License is distributed on an "AS IS"
00016  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
00017  * the License for the specific language governing rights and limitations
00018  * under the License.
00019  *
00020  * The Original Code is Portable Windows Library.
00021  *
00022  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
00023  *
00024  * Contributor(s): Mark Cooke (mpc@star.sr.bham.ac.uk)
00025  *
00026  * $Log: videoio.h,v $
00027  * Revision 1.48  2006/10/31 04:10:40  csoutheren
00028  * Make sure PVidFileDev class is loaded, and make it work with OPAL
00029  *
00030  * Revision 1.47  2006/10/25 11:04:38  shorne
00031  * fix for devices having same name for different drivers.
00032  *
00033  * Revision 1.46  2006/06/21 05:38:58  csoutheren
00034  * Fixed plugin compile for latest pwlib
00035  *
00036  * Revision 1.45  2006/06/21 03:28:41  csoutheren
00037  * Various cleanups thanks for Frederic Heem
00038  *
00039  * Revision 1.44  2006/03/17 06:56:22  csoutheren
00040  * Exposed video fonts to external access
00041  *
00042  * Revision 1.43  2005/11/25 03:43:47  csoutheren
00043  * Fixed function argument comments to be compatible with Doxygen
00044  *
00045  * Revision 1.42  2005/08/09 09:08:09  rjongbloed
00046  * Merged new video code from branch back to the trunk.
00047  *
00048  * Revision 1.41.4.1  2005/07/17 09:27:04  rjongbloed
00049  * Major revisions of the PWLib video subsystem including:
00050  *   removal of F suffix on colour formats for vertical flipping, all done with existing bool
00051  *   working through use of RGB and BGR formats so now consistent
00052  *   cleaning up the plug in system to use virtuals instead of pointers to functions.
00053  *   rewrite of SDL to be a plug in compatible video output device.
00054  *   extensive enhancement of video test program
00055  *
00056  * Revision 1.41  2005/01/04 07:44:03  csoutheren
00057  * More changes to implement the new configuration methodology, and also to
00058  * attack the global static problem
00059  *
00060  * Revision 1.40  2004/04/18 12:49:22  csoutheren
00061  * Patches to video code thanks to Guilhem Tardy (hope I get it right this time :)
00062  *
00063  * Revision 1.39  2004/01/18 14:23:30  dereksmithies
00064  * Add new function to make opening of video input devices easier.
00065  *
00066  * Revision 1.38  2004/01/02 23:30:18  rjongbloed
00067  * Removed extraneous static function for getting input device names that has been deprecated during the plug ins addition.
00068  *
00069  * Revision 1.37  2003/12/14 10:01:02  rjongbloed
00070  * Resolved issue with name space conflict os static and virtual forms of GetDeviceNames() function.
00071  *
00072  * Revision 1.36  2003/12/03 03:47:56  dereksmithies
00073  * Add fix so video output devices compile and run correctly.
00074  * Thanks to Craig Southeren.
00075  *
00076  * Revision 1.35  2003/11/19 04:29:02  csoutheren
00077  * Changed to support video output plugins
00078  *
00079  * Revision 1.34  2003/11/18 10:39:06  csoutheren
00080  * Fixed warnings regarding calling virtual Close in destructors
00081  *
00082  * Revision 1.33  2003/11/18 06:46:15  csoutheren
00083  * Changed to support video input plugins
00084  *
00085  * Revision 1.32  2003/09/17 05:41:59  csoutheren
00086  * Removed recursive includes
00087  *
00088  * Revision 1.31  2003/09/17 01:18:02  csoutheren
00089  * Removed recursive include file system and removed all references
00090  * to deprecated coooperative threading support
00091  *
00092  * Revision 1.30  2003/03/17 08:10:00  robertj
00093  * Fixed GNU warning
00094  *
00095  * Revision 1.29  2003/03/17 07:51:07  robertj
00096  * Added OpenFull() function to open with all video parameters in one go.
00097  * Made sure vflip variable is set in converter even if converter has not
00098  *   been set yet, should not depend on the order of functions!
00099  * Removed canCaptureVideo variable as this is really a virtual function to
00100  *   distinguish PVideoOutputDevice from PVideoInputDevice, it is not dynamic.
00101  * Made significant enhancements to PVideoOutputDevice class.
00102  * Added PVideoOutputDevice descendants for NULL and PPM files.
00103  *
00104  * Revision 1.28  2002/09/16 01:08:59  robertj
00105  * Added #define so can select if #pragma interface/implementation is used on
00106  *   platform basis (eg MacOS) rather than compiler, thanks Robert Monaghan.
00107  *
00108  * Revision 1.27  2002/04/12 08:25:12  robertj
00109  * Added text string output for tracing video format.
00110  *
00111  * Revision 1.26  2002/04/05 06:41:54  rogerh
00112  * Apply video changes from Damien Sandras <dsandras@seconix.com>.
00113  * The Video Channel and Format are no longer set in Open(). Instead
00114  * call the new SetVideoChannelFormat() method. This makes video capture
00115  * and GnomeMeeting more stable with certain Linux video capture devices.
00116  *
00117  * Revision 1.25  2002/02/20 02:37:26  dereks
00118  * Initial release of Firewire camera support for linux.
00119  * Many thanks to Ryutaroh Matsumoto <ryutaroh@rmatsumoto.org>.
00120  *
00121  * Revision 1.24  2002/01/16 07:51:06  robertj
00122  * MSVC compatibilty changes
00123  *
00124  * Revision 1.23  2002/01/16 03:51:20  dereks
00125  * Move flip methods in PVideoInputDevice  to  PVideoDevice
00126  *
00127  * Revision 1.22  2002/01/14 02:59:54  robertj
00128  * Added preferred colour format selection, thanks Walter Whitlock
00129  *
00130  * Revision 1.21  2002/01/04 04:11:45  dereks
00131  * Add video flip code from Walter Whitlock, which flips code at the grabber.
00132  *
00133  * Revision 1.20  2001/11/28 00:07:32  dereks
00134  * Locking added to PVideoChannel, allowing reader/writer to be changed mid call
00135  * Enabled adjustment of the video frame rate
00136  * New fictitous image, a blank grey area
00137  *
00138  * Revision 1.19  2001/08/06 06:12:45  rogerh
00139  * Fix comments
00140  *
00141  * Revision 1.18  2001/08/03 04:21:51  dereks
00142  * Add colour/size conversion for YUV422->YUV411P
00143  * Add Get/Set Brightness,Contrast,Hue,Colour for PVideoDevice,  and
00144  * Linux PVideoInputDevice.
00145  * Add lots of PTRACE statement for debugging colour conversion.
00146  * Add support for Sony Vaio laptop under linux. Requires 2.4.7 kernel.
00147  *
00148  * Revision 1.17  2001/05/22 23:38:45  robertj
00149  * Fixed bug in PVideoOutputDevice, removed redundent SetFrameSize.
00150  *
00151  * Revision 1.16  2001/05/22 12:49:32  robertj
00152  * Did some seriously wierd rewrite of platform headers to eliminate the
00153  *   stupid GNU compiler warning about braces not matching.
00154  *
00155  * Revision 1.15  2001/03/20 02:21:57  robertj
00156  * More enhancements from Mark Cooke
00157  *
00158  * Revision 1.14  2001/03/08 23:04:19  robertj
00159  * Fixed up some documentation.
00160  *
00161  * Revision 1.13  2001/03/08 08:31:34  robertj
00162  * Numerous enhancements to the video grabbing code including resizing
00163  *   infrastructure to converters. Thanks a LOT, Mark Cooke.
00164  *
00165  * Revision 1.12  2001/03/07 01:42:59  dereks
00166  * miscellaneous video fixes. Works on linux now. Add debug statements
00167  * (at PTRACE level of 1)
00168  *
00169  * Revision 1.11  2001/03/06 23:34:20  robertj
00170  * Added static function to get input device names.
00171  * Moved some inline virtuals to non-inline.
00172  *
00173  * Revision 1.10  2001/03/03 05:06:31  robertj
00174  * Major upgrade of video conversion and grabbing classes.
00175  *
00176  * Revision 1.9  2001/02/28 01:47:14  robertj
00177  * Removed function from ancestor and is not very useful, thanks Thorsten Westheider.
00178  *
00179  * Revision 1.8  2000/12/19 22:20:26  dereks
00180  * Add video channel classes to connect to the PwLib PVideoInputDevice class.
00181  * Add PFakeVideoInput class to generate test images for video.
00182  *
00183  * Revision 1.7  2000/11/09 00:20:38  robertj
00184  * Added qcif size constants
00185  *
00186  * Revision 1.6  2000/07/30 03:41:31  robertj
00187  * Added more colour formats to video device enum.
00188  *
00189  * Revision 1.5  2000/07/26 03:50:49  robertj
00190  * Added last error variable to video device.
00191  *
00192  * Revision 1.4  2000/07/26 02:13:46  robertj
00193  * Added some more "common" bounds checking to video device.
00194  *
00195  * Revision 1.3  2000/07/25 13:38:25  robertj
00196  * Added frame rate parameter to video frame grabber.
00197  *
00198  * Revision 1.2  2000/07/25 13:14:05  robertj
00199  * Got the video capture stuff going!
00200  *
00201  * Revision 1.1  2000/07/15 09:47:34  robertj
00202  * Added video I/O device classes.
00203  *
00204  */
00205 
00206 
00207 #ifndef _PVIDEOIO
00208 #define _PVIDEOIO
00209 
00210 #ifdef P_USE_PRAGMA
00211 #pragma interface
00212 #endif
00213 
00214 #include <ptlib/plugin.h>
00215 #include <ptlib/pluginmgr.h>
00216 
00217 class PColourConverter;
00218 
00249 class PVideoDevice : public PObject
00250 {
00251   PCLASSINFO(PVideoDevice, PObject);
00252 
00253   protected:
00256     PVideoDevice();
00257 
00258 
00259   public:
00262     virtual ~PVideoDevice();
00263 
00264     enum VideoFormat {
00265       PAL,
00266       NTSC,
00267       SECAM,
00268       Auto,
00269       NumVideoFormats
00270     };
00271 
00272     enum StandardSizes {
00273       CIF16Width = 1408,
00274       CIF16Height = 1152,
00275       CIF4Width = 704,
00276       CIF4Height = 576,
00277       CIFWidth = 352,
00278       CIFHeight = 288,
00279       QCIFWidth = 176,
00280       QCIFHeight = 144,
00281       SQCIFWidth = 144,
00282       SQCIFHeight = 96,
00283     };
00284 
00287     const PString & GetDeviceName() const
00288       { return deviceName; }
00289 
00292     virtual PStringList GetDeviceNames() const = 0;
00293 
00294     struct OpenArgs {
00295       OpenArgs()
00296         : deviceName("#1"),
00297           videoFormat(Auto),
00298           channelNumber(0),
00299           colourFormat("YUV420P"),
00300           convertFormat(TRUE),
00301           rate(0),
00302           width(CIFWidth),
00303           height(CIFHeight),
00304           convertSize(TRUE),
00305           scaleSize(FALSE),
00306           flip(FALSE),
00307           brightness(-1),
00308           whiteness(-1),
00309           contrast(-1),
00310           colour(-1),
00311           hue(-1)
00312         { }
00313       PString     deviceName;
00314       PString     filename;
00315       VideoFormat videoFormat;
00316       int         channelNumber;
00317       PString     colourFormat;
00318       bool        convertFormat;
00319       unsigned    rate;
00320       unsigned    width;
00321       unsigned    height;
00322       bool        convertSize;
00323       bool        scaleSize;
00324       bool        flip;
00325       int         brightness;
00326       int         whiteness;
00327       int         contrast;
00328       int         colour;
00329       int         hue;
00330     };
00331 
00334     virtual BOOL OpenFull(
00335       const OpenArgs & args,      
00336       BOOL startImmediate = TRUE  
00337     );
00338 
00341     virtual BOOL Open(
00342       const PString & deviceName,   
00343       BOOL startImmediate = TRUE    
00344     ) = 0;
00345 
00348     virtual BOOL IsOpen() = 0;
00349 
00352     virtual BOOL Close() = 0;
00353 
00356     virtual BOOL Start() = 0;
00357 
00360     virtual BOOL Stop() = 0;
00361 
00362 
00363 #if PTRACING
00364     friend ostream & operator<<(ostream &, VideoFormat);
00365 #endif
00366 
00372     virtual BOOL SetVideoFormat(
00373       VideoFormat videoFormat   
00374     );
00375 
00380     virtual VideoFormat GetVideoFormat() const;
00381 
00386     virtual int GetNumChannels();
00387 
00395     virtual BOOL SetChannel(
00396       int channelNumber  
00397     );
00398 
00403     virtual int GetChannel() const;
00404 
00411     virtual BOOL SetColourFormatConverter(
00412       const PString & colourFormat // New colour format for device.
00413     );
00414 
00425     virtual BOOL SetColourFormat(
00426       const PString & colourFormat // New colour format for device.
00427     );
00428 
00433     const PString & GetColourFormat() const;
00434 
00438     virtual BOOL GetVFlipState();
00439 
00443     virtual BOOL SetVFlipState(
00444       BOOL newVFlipState    
00445     );
00446 
00452     virtual BOOL SetFrameRate(
00453       unsigned rate  
00454     );
00455 
00460     virtual unsigned GetFrameRate() const;
00461 
00467     virtual BOOL GetFrameSizeLimits(
00468       unsigned & minWidth,   
00469       unsigned & minHeight,  
00470       unsigned & maxWidth,   
00471       unsigned & maxHeight   
00472     ) ;
00473 
00474 
00480     virtual BOOL SetFrameSizeConverter(
00481       unsigned width,        
00482       unsigned height,       
00483       BOOL     bScaleNotCrop 
00484     );
00485 
00494     virtual BOOL SetFrameSize(
00495       unsigned width,   
00496       unsigned height   
00497     );
00498 
00504     virtual BOOL GetFrameSize(
00505       unsigned & width,
00506       unsigned & height
00507     );
00508 
00513     virtual unsigned GetFrameWidth() const;
00514 
00519     virtual unsigned GetFrameHeight() const;
00520 
00526     virtual PINDEX GetMaxFrameBytes() = 0;
00527 
00530     static unsigned CalculateFrameBytes( 
00531       unsigned width,
00532       unsigned height,
00533       const PString & colourFormat
00534     );
00535 
00536     
00539     int GetLastError() const { return lastError; }
00540 
00541 
00544     virtual BOOL CanCaptureVideo() const = 0;
00545 
00548     virtual int GetBrightness();
00549 
00552     virtual BOOL SetBrightness(unsigned newBrightness);
00553 
00554 
00557     virtual int GetWhiteness();
00558 
00561     virtual BOOL SetWhiteness(unsigned newWhiteness);
00562 
00563 
00566     virtual int GetColour();
00567 
00570     virtual BOOL SetColour(unsigned newColour);
00571 
00572 
00575     virtual int GetContrast();
00576 
00579     virtual BOOL SetContrast(unsigned newContrast);
00580 
00581 
00584     virtual int GetHue();
00585 
00588     virtual BOOL SetHue(unsigned newHue);
00589     
00590     
00593     virtual BOOL GetParameters(
00594       int *whiteness,
00595       int *brightness,
00596       int *colour,
00597       int *contrast,
00598       int *hue
00599     );
00600 
00601     
00604     virtual BOOL SetVideoChannelFormat (
00605       int channelNumber, 
00606       VideoFormat videoFormat
00607     );
00608 
00609 
00613     void SetPreferredColourFormat(const PString & colourFmt) { preferredColourFormat = colourFmt; }
00614 
00618     const PString & GetPreferredColourFormat() { return preferredColourFormat; }
00619 
00620   protected:
00621     PINDEX GetMaxFrameBytesConverted(PINDEX rawFrameBytes) const;
00622 
00623     PString      deviceName;
00624     int          lastError;
00625     VideoFormat  videoFormat;
00626     int          channelNumber;
00627     PString      colourFormat;
00628     // Preferred native colour format from video input device, empty == no preference
00629     PString      preferredColourFormat;
00630     unsigned     frameRate;
00631     unsigned     frameWidth;
00632     unsigned     frameHeight;
00633     BOOL         nativeVerticalFlip;
00634 
00635     PColourConverter * converter;
00636  
00637     int          frameBrightness; // 16 bit entity, -1 is no value
00638     int          frameWhiteness;
00639     int          frameContrast;
00640     int          frameColour;
00641     int          frameHue;
00642 
00643     PTime        previousFrameTime; // Time of the last frame.
00644     int          msBetweenFrames;   // msBetween subsequent frames. 
00645     int          frameTimeError;    // determines  when this frame should happen.
00646 };
00647 
00648 
00651 class PVideoOutputDevice : public PVideoDevice
00652 {
00653   PCLASSINFO(PVideoOutputDevice, PVideoDevice);
00654 
00655   public:
00658     PVideoOutputDevice();
00659     
00662     virtual ~PVideoOutputDevice() { Close(); };      
00663 
00666     static PStringList GetDriverNames(
00667       PPluginManager * pluginMgr = NULL   
00668     );
00669 
00676     static PStringList GetDriversDeviceNames(
00677       const PString & driverName,         
00678       PPluginManager * pluginMgr = NULL   
00679     );
00680 
00683     static PVideoOutputDevice * CreateDevice(
00684       const PString & driverName,         
00685       PPluginManager * pluginMgr = NULL   
00686     );
00687 
00688     /* Create the matching video output device that corresponds to the device name.
00689 
00690        This is typically used with the return values from GetDriversDeviceNames().
00691      */
00692     static PVideoOutputDevice *CreateDeviceByName(
00693       const PString & deviceName,         
00694       PPluginManager * pluginMgr = NULL   
00695     );
00696 
00702     static PVideoOutputDevice *CreateOpenedDevice(
00703       const PString & driverName,         
00704       const PString & deviceName,         
00705       BOOL startImmediate = TRUE,         
00706       PPluginManager * pluginMgr = NULL   
00707     );
00708 
00711     virtual BOOL Close() { return TRUE; }
00712 
00715     virtual BOOL Start() { return TRUE; }
00716 
00719     virtual BOOL Stop() { return TRUE; }
00720 
00723     virtual BOOL CanCaptureVideo() const;
00724 
00727     virtual BOOL SetFrameData(
00728       unsigned x,
00729       unsigned y,
00730       unsigned width,
00731       unsigned height,
00732       const BYTE * data,
00733       BOOL endFrame = TRUE
00734     ) = 0;
00735 };
00736 
00737 
00740 class PVideoOutputDeviceRGB : public PVideoOutputDevice
00741 {
00742   PCLASSINFO(PVideoOutputDeviceRGB, PVideoOutputDevice);
00743 
00744   public:
00747     PVideoOutputDeviceRGB();
00748 
00759     virtual BOOL SetColourFormat(
00760       const PString & colourFormat // New colour format for device.
00761     );
00762 
00771     virtual BOOL SetFrameSize(
00772       unsigned width,   
00773       unsigned height   
00774     );
00775 
00781     virtual PINDEX GetMaxFrameBytes();
00782 
00785     virtual BOOL SetFrameData(
00786       unsigned x,
00787       unsigned y,
00788       unsigned width,
00789       unsigned height,
00790       const BYTE * data,
00791       BOOL endFrame = TRUE
00792     );
00793 
00796     virtual BOOL FrameComplete() = 0;
00797 
00798   protected:
00799     PMutex     mutex;
00800     PBYTEArray frameStore;
00801     PINDEX     bytesPerPixel;
00802     PINDEX     scanLineWidth;
00803     bool       swappedRedAndBlue;
00804 };
00805 
00806 
00807 #ifdef SHOULD_BE_MOVED_TO_PLUGIN
00808 
00811 class PVideoOutputDevicePPM : public PVideoOutputDeviceRGB
00812 {
00813   PCLASSINFO(PVideoOutputDevicePPM, PVideoOutputDeviceRGB);
00814 
00815   public:
00818     PVideoOutputDevicePPM();
00819 
00822     virtual BOOL Open(
00823       const PString & deviceName,   
00824       BOOL startImmediate = TRUE    
00825     );
00826 
00829     virtual BOOL IsOpen();
00830 
00833     virtual BOOL Close();
00834 
00837     virtual PStringList GetDeviceNames() const;
00838 
00841     virtual BOOL EndFrame();
00842 
00843   protected:
00844     unsigned   frameNumber;
00845 };
00846 
00847 #endif // SHOULD_BE_MOVED_TO_PLUGIN
00848 
00849 
00852 class PVideoInputDevice : public PVideoDevice
00853 {
00854   PCLASSINFO(PVideoInputDevice, PVideoDevice);
00855 
00856   public:
00859     //PVideoInputDevice();
00860 
00863     ~PVideoInputDevice() { Close(); }
00864 
00867     static PStringList GetDriverNames(
00868       PPluginManager * pluginMgr = NULL   
00869     );
00870 
00877     static PStringList GetDriversDeviceNames(
00878       const PString & driverName,         
00879       PPluginManager * pluginMgr = NULL   
00880     );
00881 
00884     static PVideoInputDevice *CreateDevice(
00885       const PString & driverName,         
00886       PPluginManager * pluginMgr = NULL   
00887     );
00888 
00889     /* Create the matching video input device that corresponds to the device name.
00890        So, for "fake" return a device that will generate fake video.
00891        For "Phillips 680 webcam" (eg) will return appropriate grabber.
00892        Note that Phillips will return the appropriate grabber also.
00893 
00894        This is typically used with the return values from GetDriversDeviceNames().
00895      */
00896     static PVideoInputDevice *CreateDeviceByName(
00897       const PString & deviceName,         
00898           const PString & driverName = PString::Empty(),  
00899       PPluginManager * pluginMgr = NULL   
00900     );
00901 
00907     static PVideoInputDevice *CreateOpenedDevice(
00908       const PString & driverName,         
00909       const PString & deviceName,         
00910       BOOL startImmediate = TRUE,         
00911       PPluginManager * pluginMgr = NULL   
00912     );
00913 
00916     virtual BOOL Open(
00917       const PString & deviceName,   
00918       BOOL startImmediate = TRUE    
00919     ) = 0;
00920 
00921     virtual BOOL Close(
00922     ) { return TRUE; }
00923 
00926     virtual BOOL CanCaptureVideo() const;
00927  
00930     virtual BOOL IsCapturing() = 0;
00931 
00934     virtual BOOL GetFrame(
00935       PBYTEArray & frame
00936     );
00937 
00940     virtual BOOL GetFrameData(
00941       BYTE * buffer,                 
00942       PINDEX * bytesReturned = NULL  
00943     ) = 0;
00944 
00947     virtual BOOL GetFrameDataNoDelay(
00948       BYTE * buffer,                 
00949       PINDEX * bytesReturned = NULL  
00950     ) = 0;
00951 
00954     virtual BOOL TestAllFormats() = 0;
00955 };
00956 
00957 
00959 //
00960 // declare macros and structures needed for video input plugins
00961 //
00962 
00963 template <class className> class PVideoInputPluginServiceDescriptor : public PDevicePluginServiceDescriptor
00964 {
00965   public:
00966     virtual PObject *   CreateInstance(int /*userData*/) const { return new className; }
00967     virtual PStringList GetDeviceNames(int /*userData*/) const { return className::GetInputDeviceNames(); }
00968 };
00969 
00970 #define PCREATE_VIDINPUT_PLUGIN(name) \
00971   static PVideoInputPluginServiceDescriptor<PVideoInputDevice_##name> PVideoInputDevice_##name##_descriptor; \
00972   PCREATE_PLUGIN(name, PVideoInputDevice, &PVideoInputDevice_##name##_descriptor)
00973 
00975 //
00976 // declare macros and structures needed for video output plugins
00977 //
00978 
00979 template <class className> class PVideoOutputPluginServiceDescriptor : public PDevicePluginServiceDescriptor
00980 {
00981   public:
00982     virtual PObject *   CreateInstance(int /*userData*/) const { return new className; }
00983     virtual PStringList GetDeviceNames(int /*userData*/) const { return className::GetOutputDeviceNames(); }
00984 };
00985 
00986 #define PCREATE_VIDOUTPUT_PLUGIN(name) \
00987   static PVideoOutputPluginServiceDescriptor<PVideoOutputDevice_##name> PVideoOutputDevice_##name##_descriptor; \
00988   PCREATE_PLUGIN(name, PVideoOutputDevice, &PVideoOutputDevice_##name##_descriptor)
00989 
00991 //
00992 // declare classes needed for access to simple video font
00993 //
00994 
00995 class PVideoFont : public PObject
00996 {
00997   PCLASSINFO(PVideoFont, PObject);
00998   public:
00999     enum {
01000       MAX_L_HEIGHT = 11
01001     };
01002     struct LetterData {
01003       char ascii;
01004       char *line[MAX_L_HEIGHT];
01005     };
01006 
01007     static LetterData * GetLetterData(char ascii);
01008 };
01009 
01010 
01011 #endif   // _PVIDEOIO
01012 
01013 // End Of File ///////////////////////////////////////////////////////////////

Generated on Sun Sep 6 03:50:34 2009 for PWLib by  doxygen 1.6.1