151 lines
4.5 KiB
C++
151 lines
4.5 KiB
C++
// $Header: G:/SwDev/WDM/Video/bt848/rcs/Colspace.cpp 1.7 1998/04/29 22:43:30 tomz Exp $
|
|
|
|
#define INITGUID
|
|
#include "colspace.h"
|
|
#include "fourcc.h"
|
|
#include "defaults.h"
|
|
#include "uuids.h"
|
|
|
|
|
|
BYTE const ColorSpace::BitCount_ [] =
|
|
{
|
|
// RGB32 RGB24 RGB16 RGB15 YUY2 BTYUV Y8 RGB8 PL_422 PL_411 YUV9 YUV12 VBI UYVY RAW I420
|
|
32, 24, 16, 16, 16, 12, 8, 8, 16, 12, 9, 12, 8, 16, 8, 12
|
|
};
|
|
|
|
BYTE const ColorSpace::YPlaneBitCount_ [] =
|
|
{
|
|
// RGB32 RGB24 RGB16 RGB15 YUY2 BTYUV Y8 RGB8 PL_422 PL_411 YUV9 YUV12 VBI UYVY RAW I420
|
|
32, 24, 16, 16, 16, 12, 8, 8, 8, 8, 8, 8, 8, 16, 8, 8
|
|
};
|
|
|
|
BYTE const ColorSpace::XRestriction_ [] =
|
|
{
|
|
1, 1, 1, 1, 2, 4, 1, 1, 8, 16, 16, 8, 2, 4, 1, 8
|
|
};
|
|
|
|
BYTE const ColorSpace::YRestriction_ [] =
|
|
{
|
|
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2
|
|
};
|
|
|
|
FOURCC const ColorSpace::FourccArr_ [] =
|
|
{
|
|
// 32 24 16 15
|
|
BI_RGB, BI_RGB, BI_RGB, BI_RGB, FCC_YUY2, FCC_Y41P, FCC_Y8, BI_RGB,
|
|
FCC_422, FCC_411, FCC_YVU9, FCC_YV12, FCC_VBI, FCC_UYVY, FCC_RAW, FCC_I420
|
|
};
|
|
|
|
const GUID *ColorSpace::VideoGUIDs [] =
|
|
{
|
|
&MEDIASUBTYPE_RGB32, &MEDIASUBTYPE_RGB24, &MEDIASUBTYPE_RGB565, &MEDIASUBTYPE_RGB555,
|
|
&MEDIASUBTYPE_YUY2, &MEDIASUBTYPE_Y41P, NULL, NULL,
|
|
NULL, &MEDIASUBTYPE_Y411, &MEDIASUBTYPE_YVU9, NULL,
|
|
NULL, &MEDIASUBTYPE_UYVY, NULL, NULL
|
|
};
|
|
|
|
void DumpGUID(const GUID guid)
|
|
{
|
|
DebugOut(( 1, "Guid = %08x-%04x-%04x-%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n",
|
|
guid.Data1, guid.Data2, guid.Data3,
|
|
guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
|
|
guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]
|
|
));
|
|
}
|
|
|
|
/* Constructor: ColorSpace::ColorSpace
|
|
* Input: fcc: FOURCC
|
|
*/
|
|
ColorSpace::ColorSpace( FOURCC fcc, int bitCount ) : CurColor_( CF_BelowRange )
|
|
{
|
|
DebugOut((1, "ColorSpace(%x, %d, ('%c%c%c%c'))\n",
|
|
fcc,
|
|
bitCount,
|
|
fcc & 0xff,
|
|
(fcc >> 8) & 0xff,
|
|
(fcc >> 16) & 0xff,
|
|
(fcc >> 24) & 0xff
|
|
));
|
|
|
|
switch( fcc ) {
|
|
case BI_RGB:
|
|
switch ( bitCount ) {
|
|
default:
|
|
case 8: CurColor_ = CF_RGB8; break;
|
|
case 16: CurColor_ = CF_RGB15; break;
|
|
case 24: CurColor_ = CF_RGB24; break;
|
|
case 32: CurColor_ = CF_RGB32; break;
|
|
}
|
|
break;
|
|
case BI_RLE8:
|
|
case BI_RLE4:
|
|
case BI_BITFIELDS:
|
|
case 0xe436eb7b:// ???
|
|
case FCC_YUY2:
|
|
case FCC_Y41P:
|
|
case FCC_Y8:
|
|
case FCC_422:
|
|
case FCC_411:
|
|
case FCC_YVU9:
|
|
case FCC_YV12:
|
|
case FCC_VBI:
|
|
case FCC_UYVY:
|
|
case FCC_RAW:
|
|
case FCC_I420:
|
|
default:
|
|
for ( int fccArrIdx = CF_RGB32; fccArrIdx < CF_AboveRange; fccArrIdx++ )
|
|
if ( fcc == FourccArr_ [fccArrIdx] ) {
|
|
CurColor_ = (ColFmt)fccArrIdx;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
DebugOut((1, "*** CurColor_ set to %d\n", CurColor_));
|
|
}
|
|
|
|
/* Constructor: ColorSpace::ColorSpace
|
|
* Input: guid: const GUID &
|
|
*/
|
|
ColorSpace::ColorSpace( const GUID &guid ) : CurColor_( CF_BelowRange )
|
|
{
|
|
DebugOut((1, "**************************************\n"));
|
|
DebugOut((1, "Looking for the following guid\n"));
|
|
DumpGUID(guid);
|
|
DebugOut((1, "---\n"));
|
|
|
|
for ( int idx = CF_RGB32; idx < CF_AboveRange; idx++ ) {
|
|
DumpGUID(*VideoGUIDs [idx]);
|
|
if ( VideoGUIDs [idx] && IsEqualGUID( guid, *VideoGUIDs [idx] ) ) {
|
|
CurColor_ = (ColFmt)idx;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Method: ColorSpace::CheckDimentions
|
|
* Purpose: This functions checks that the size of a buffer corresponds to the
|
|
* restrictions imposed by a color format
|
|
* Input: size: reference to SIZE structure
|
|
* Output: bool: True or False
|
|
*/
|
|
bool ColorSpace::CheckDimentions( const SIZE &size ) const
|
|
{
|
|
return bool( CurColor_ > CF_BelowRange && CurColor_ < CF_AboveRange &&
|
|
IsDivisible( size.cx, XRestriction_ [CurColor_] ) &&
|
|
IsDivisible( size.cy, YRestriction_ [CurColor_] ) );//&&
|
|
// size.cx >= MinOutWidth && size.cx <= MaxOutWidth &&
|
|
// size.cy >= MinOutHeight && size.cy <= MaxOutHeight );
|
|
}
|
|
|
|
/* Method: ColorSpace::CheckLeftTop
|
|
* Purpose: This functions checks that the left top corner of a buffer
|
|
* corresponds to the restrictions imposed by a color format
|
|
* Input: lt: const reference to MPoint structure
|
|
* Output: bool: true or false
|
|
*/
|
|
bool ColorSpace::CheckLeftTop( const MPoint < ) const
|
|
{
|
|
return bool( !( lt.x & 3 ) && !( lt.y & 1 ) );
|
|
}
|
|
|