PTLib
Version 2.10.4
|
00001 /* 00002 * vconvert.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): Derek Smithies (derek@indranet.co.nz) 00025 * Thorsten Westheider (thorsten.westheider@teleos-web.de) 00026 * Mark Cooke (mpc@star.sr.bham.ac.uk) 00027 * 00028 * $Revision: 26686 $ 00029 * $Author: rjongbloed $ 00030 * $Date: 2011-11-23 20:22:20 -0600 (Wed, 23 Nov 2011) $ 00031 */ 00032 00033 #ifndef PTLIB_CONVERT_H 00034 #define PTLIB_CONVERT_H 00035 00036 #ifdef P_USE_PRAGMA 00037 #ifndef P_MACOSX 00038 #pragma interface 00039 #endif 00040 #endif 00041 00042 #include <ptbuildopts.h> 00043 00044 #if P_VIDEO 00045 00046 #include <ptlib/videoio.h> 00047 00048 struct jdec_private; 00049 00050 00056 class PColourConverterRegistration : public PCaselessString 00057 { 00058 PCLASSINFO(PColourConverterRegistration, PCaselessString); 00059 public: 00060 PColourConverterRegistration( 00061 const PString & srcColourFormat, 00062 const PString & destColourFormat 00063 ); 00064 00065 protected: 00066 virtual PColourConverter * Create( 00067 const PVideoFrameInfo & src, 00068 const PVideoFrameInfo & dst 00069 ) const = 0; 00070 00071 PColourConverterRegistration * link; 00072 00073 friend class PColourConverter; 00074 }; 00075 00076 00080 class PColourConverter : public PObject 00081 { 00082 PCLASSINFO(PColourConverter, PObject); 00083 public: 00086 PColourConverter( 00087 const PString & srcColourFormat, 00088 const PString & dstColourFormat, 00089 unsigned width, 00090 unsigned height 00091 ); 00092 PColourConverter( 00093 const PVideoFrameInfo & src, 00094 const PVideoFrameInfo & dst 00095 ); 00096 00098 virtual void PrintOn( 00099 ostream & strm 00100 ) const; 00101 00104 PBoolean GetVFlipState() 00105 { return verticalFlip; } 00106 00109 void SetVFlipState( 00110 PBoolean vFlipState 00111 ) { verticalFlip = vFlipState; } 00112 00117 virtual PBoolean SetFrameSize( 00118 unsigned width, 00119 unsigned height 00120 ); 00121 00130 virtual PBoolean SetSrcFrameInfo( 00131 const PVideoFrameInfo & info 00132 ); 00133 00142 virtual PBoolean SetDstFrameInfo( 00143 const PVideoFrameInfo & info 00144 ); 00145 00148 virtual void GetSrcFrameInfo( 00149 PVideoFrameInfo & info 00150 ); 00151 00154 virtual void GetDstFrameInfo( 00155 PVideoFrameInfo & info 00156 ); 00157 00164 virtual PBoolean SetSrcFrameSize( 00165 unsigned width, 00166 unsigned height 00167 ); 00168 00175 virtual PBoolean SetDstFrameSize( 00176 unsigned width, 00177 unsigned height 00178 ); 00179 virtual PBoolean SetDstFrameSize( 00180 unsigned width, 00181 unsigned height, 00182 PBoolean bScale 00183 ); 00184 00187 const PString & GetSrcColourFormat() { return srcColourFormat; } 00188 00191 const PString & GetDstColourFormat() { return dstColourFormat; } 00192 00198 PINDEX GetMaxSrcFrameBytes() { return srcFrameBytes; } 00199 00205 PINDEX GetMaxDstFrameBytes() { return dstFrameBytes; } 00206 00207 00217 virtual PBoolean Convert( 00218 const BYTE * srcFrameBuffer, 00219 BYTE * dstFrameBuffer, 00220 PINDEX * bytesReturned = NULL 00221 ) = 0; 00222 00223 virtual PBoolean Convert( 00224 const BYTE * srcFrameBuffer, 00225 BYTE * dstFrameBuffer, 00226 unsigned int srcFrameBytes, 00227 PINDEX * bytesReturned = NULL 00228 ) = 0; 00229 00246 virtual PBoolean ConvertInPlace( 00247 BYTE * frameBuffer, 00248 PINDEX * bytesReturned = NULL, 00249 PBoolean noIntermediateFrame = false 00250 ); 00251 00252 00257 static PColourConverter * Create( 00258 const PVideoFrameInfo & src, 00259 const PVideoFrameInfo & dst 00260 ); 00261 static PColourConverter * Create( 00262 const PString & srcColourFormat, 00263 const PString & destColourFormat, 00264 unsigned width, 00265 unsigned height 00266 ); 00267 00270 PBoolean GetDstFrameSize( 00271 unsigned & width, 00272 unsigned & height 00273 ) const; 00274 00277 PBoolean GetSrcFrameSize( 00278 unsigned & width, 00279 unsigned & height 00280 ) const; 00281 00282 unsigned GetSrcFrameWidth() const { return srcFrameWidth; } 00283 unsigned GetSrcFrameHeight() const { return srcFrameHeight; } 00284 unsigned GetDstFrameWidth() const { return dstFrameWidth; } 00285 unsigned GetDstFrameHeight() const { return dstFrameHeight; } 00286 00289 void SetResizeMode( 00290 PVideoFrameInfo::ResizeMode mode 00291 ) { if (mode < PVideoFrameInfo::eMaxResizeMode) resizeMode = mode; } 00292 00295 PVideoFrameInfo::ResizeMode GetResizeMode() const { return resizeMode; } 00296 00299 static void RGBtoYUV( 00300 unsigned r, unsigned g, unsigned b, 00301 unsigned & y, unsigned & u, unsigned & v 00302 ); 00303 static void RGBtoYUV( 00304 unsigned r, unsigned g, unsigned b, 00305 BYTE & y, BYTE & u, BYTE & v 00306 ); 00307 00311 static bool CopyYUV420P( 00312 unsigned srcX, unsigned srcY, unsigned srcWidth, unsigned srcHeight, 00313 unsigned srcFrameWidth, unsigned srcFrameHeight, const BYTE * srcYUV, 00314 unsigned dstX, unsigned dstY, unsigned dstWidth, unsigned dstHeight, 00315 unsigned dstFrameWidth, unsigned dstFrameHeight, BYTE * dstYUV, 00316 PVideoFrameInfo::ResizeMode resizeMode 00317 ); 00318 00319 static bool FillYUV420P( 00320 unsigned x, unsigned y, int width, int height, 00321 unsigned frameWidth, unsigned frameHeight, BYTE * yuv, 00322 unsigned r, unsigned g, unsigned b 00323 ); 00324 00325 protected: 00326 void Construct( 00327 const PVideoFrameInfo & src, 00328 const PVideoFrameInfo & dst 00329 ); 00330 00331 PString srcColourFormat; 00332 PString dstColourFormat; 00333 unsigned srcFrameWidth; 00334 unsigned srcFrameHeight; 00335 unsigned srcFrameBytes; 00336 00337 // Needed for resizing 00338 unsigned dstFrameWidth; 00339 unsigned dstFrameHeight; 00340 unsigned dstFrameBytes; 00341 00342 PVideoFrameInfo::ResizeMode resizeMode; 00343 00344 PBoolean verticalFlip; 00345 00346 PBYTEArray intermediateFrameStore; 00347 00348 #ifndef P_MACOSX 00349 /* Use by the jpeg decompressor */ 00350 struct jdec_private *jdec; 00351 #endif 00352 00353 friend class PColourConverterRegistration; 00354 }; 00355 00356 00362 #define PCOLOUR_CONVERTER2(cls,ancestor,srcFmt,dstFmt) \ 00363 class cls : public ancestor { \ 00364 public: \ 00365 cls(const PVideoFrameInfo & src, const PVideoFrameInfo & dst) \ 00366 : ancestor(src, dst) { } \ 00367 virtual PBoolean Convert(const BYTE *, BYTE *, PINDEX * = NULL); \ 00368 virtual PBoolean Convert(const BYTE *, BYTE *, unsigned int , PINDEX * = NULL); \ 00369 }; \ 00370 static class cls##_Registration : public PColourConverterRegistration { \ 00371 public: cls##_Registration() \ 00372 : PColourConverterRegistration(srcFmt,dstFmt) { } \ 00373 protected: virtual PColourConverter * Create(const PVideoFrameInfo & src, const PVideoFrameInfo & dst) const; \ 00374 } p_##cls##_registration_instance; \ 00375 PColourConverter * cls##_Registration::Create(const PVideoFrameInfo & src, const PVideoFrameInfo & dst) const \ 00376 { return new cls(src, dst); } \ 00377 PBoolean cls::Convert(const BYTE *srcFrameBuffer, BYTE *dstFrameBuffer, unsigned int p_srcFrameBytes, PINDEX * bytesReturned) \ 00378 { srcFrameBytes = p_srcFrameBytes;return Convert(srcFrameBuffer, dstFrameBuffer, bytesReturned); } \ 00379 PBoolean cls::Convert(const BYTE *srcFrameBuffer, BYTE *dstFrameBuffer, PINDEX * bytesReturned) 00380 00381 00387 #define PCOLOUR_CONVERTER(cls,src,dst) \ 00388 PCOLOUR_CONVERTER2(cls,PColourConverter,src,dst) 00389 00390 00391 00396 class PSynonymColour : public PColourConverter { 00397 public: 00398 PSynonymColour( 00399 const PVideoFrameInfo & src, 00400 const PVideoFrameInfo & dst 00401 ) : PColourConverter(src, dst) { } 00402 virtual PBoolean Convert(const BYTE *, BYTE *, PINDEX * = NULL); 00403 virtual PBoolean Convert(const BYTE *, BYTE *, unsigned int , PINDEX * = NULL); 00404 }; 00405 00406 00411 class PSynonymColourRegistration : public PColourConverterRegistration { 00412 public: 00413 PSynonymColourRegistration( 00414 const char * srcFmt, 00415 const char * dstFmt 00416 ); 00417 00418 protected: 00419 virtual PColourConverter * Create(const PVideoFrameInfo & src, const PVideoFrameInfo & dst) const; 00420 }; 00421 00422 00427 #define PSYNONYM_COLOUR_CONVERTER(from,to) \ 00428 static PSynonymColourRegistration p_##from##_##to##_registration_instance(#from,#to) 00429 00430 00431 #endif // P_VIDEO 00432 00433 #endif // PTLIB_CONVERT_H 00434 00435 00436 // End of file ///////////////////////////////////////////////////////////////