📄 ffimgfmt.h
字号:
#define IMGFMT_Y211 0x31313259
#define IMGFMT_Y41T 0x54313459
#define IMGFMT_Y42T 0x54323459
#define IMGFMT_V422 0x32323456
#define IMGFMT_V655 0x35353656
#define IMGFMT_CLJR 0x524A4C43
#define IMGFMT_YUVP 0x50565559
#define IMGFMT_UYVP 0x50565955
static __inline int csp_ffdshow2mplayer(int csp)
{
switch (csp&FF_CSPS_MASK)
{
case FF_CSP_420P :return IMGFMT_YV12;
case FF_CSP_422P :return IMGFMT_422P;
case FF_CSP_444P :return IMGFMT_444P;
case FF_CSP_411P :return IMGFMT_411P;
case FF_CSP_410P :return IMGFMT_YVU9;
/*
case FF_CSP_YUY2 :return IMGFMT_YVYU;
case FF_CSP_UYVY :return IMGFMT_VYUY;
case FF_CSP_YVYU :return IMGFMT_YUY2;
case FF_CSP_VYUY :return IMGFMT_UYVY;
*/
case FF_CSP_YUY2 :return IMGFMT_YUY2;
case FF_CSP_UYVY :return IMGFMT_UYVY;
case FF_CSP_YVYU :return IMGFMT_YVYU;
case FF_CSP_VYUY :return IMGFMT_VYUY;
case FF_CSP_ABGR :return IMGFMT_RGB32;
case FF_CSP_RGBA :return IMGFMT_RGB32;
case FF_CSP_RGB15:return IMGFMT_BGR15;
case FF_CSP_RGB16:return IMGFMT_BGR16;
case FF_CSP_RGB24:return IMGFMT_BGR24;
case FF_CSP_RGB32:return IMGFMT_BGR32;
case FF_CSP_BGR15:return IMGFMT_RGB15;
case FF_CSP_BGR16:return IMGFMT_RGB16;
case FF_CSP_BGR24:return IMGFMT_RGB24;
case FF_CSP_BGR32:return IMGFMT_RGB32;
case FF_CSP_Y800 :return IMGFMT_Y800;
case FF_CSP_NV12 :return csp&FF_CSP_FLAGS_YUV_ORDER?IMGFMT_NV12:IMGFMT_NV21;
default :return 0;
}
}
#define SWS_IN_CSPS \
( \
FF_CSP_420P| \
FF_CSP_444P| \
FF_CSP_422P| \
FF_CSP_411P| \
FF_CSP_410P| \
FF_CSP_YUY2| \
FF_CSP_UYVY| \
FF_CSP_YVYU| \
FF_CSP_VYUY| \
FF_CSP_BGR32| \
FF_CSP_BGR24| \
FF_CSP_BGR16| \
FF_CSP_BGR15| \
FF_CSP_RGB32| \
FF_CSP_RGB24| \
FF_CSP_RGB16| \
FF_CSP_RGB15| \
FF_CSP_NV12| \
FF_CSP_Y800 \
)
#define SWS_OUT_CSPS \
( \
FF_CSP_420P| \
FF_CSP_444P| \
FF_CSP_422P| \
FF_CSP_411P| \
FF_CSP_410P| \
FF_CSP_YUY2| \
FF_CSP_UYVY| \
FF_CSP_YVYU| \
FF_CSP_VYUY| \
FF_CSP_RGB32| \
FF_CSP_RGB24| \
FF_CSP_RGB16| \
FF_CSP_RGB15| \
FF_CSP_BGR32| \
FF_CSP_BGR24| \
FF_CSP_BGR16| \
FF_CSP_BGR15| \
FF_CSP_NV12| \
FF_CSP_Y800 \
)
static __inline int csp_supSWSin(int x)
{
return (x&FF_CSPS_MASK)&SWS_IN_CSPS;
}
static __inline int csp_supSWSout(int x)
{
return (x&FF_CSPS_MASK)&SWS_OUT_CSPS;
}
#endif
#if defined(__cplusplus) && !defined(FF_CSP_ONLY)
#ifndef _FFIMGFMTCPP_H_
#define _FFIMGFMTCPP_H_
#include "array_allocator.h"
#include "char_t.h"
struct TcspInfo
{
int id;
const char_t *name;
int Bpp,bpp;
unsigned int numPlanes;
unsigned int shiftX[4],shiftY[4];
unsigned int black[4];
FOURCC fcc,fcccsp;const GUID *subtype;
int packedLumaOffset,packedChromaOffset;
};
extern const TcspInfo cspInfos[];
struct TcspInfos :std::vector<const TcspInfo*,array_allocator<const TcspInfo*,FF_CSPS_NUM*2> >
{
private:
struct TsortFc
{
private:
int csp;
public:
TsortFc(int Icsp):csp(Icsp) {}
bool operator ()(const TcspInfo* csp1,const TcspInfo* csp2);
};
public:
void sort(int csp);
};
static __inline const TcspInfo* csp_getInfo(int csp)
{
switch (csp&(FF_CSPS_MASK|FF_CSP_FLAGS_YUV_ORDER))
{
case FF_CSP_420P|FF_CSP_FLAGS_YUV_ORDER:
{
extern TcspInfo cspInfoIYUV;
return &cspInfoIYUV;
}
case FF_CSP_NV12|FF_CSP_FLAGS_YUV_ORDER:
{
extern TcspInfo cspInfoNV21;
return &cspInfoNV21;
}
default:
csp&=FF_CSPS_MASK;
if (csp==0) return NULL;
int i=0;
while (csp>>=1)
i++;
if (i<=FF_CSPS_NUM)
return &cspInfos[i];
else
return NULL;
}
}
const TcspInfo* csp_getInfoFcc(FOURCC fcc);
static __inline int csp_isYUVplanar(int x)
{
return x&FF_CSPS_MASK&FF_CSPS_MASK_YUV_PLANAR;
}
static __inline int csp_isYUVpacked(int x)
{
return x&FF_CSPS_MASK&FF_CSPS_MASK_YUV_PACKED;
}
static __inline int csp_isYUV(int x)
{
return csp_isYUVpacked(x)|csp_isYUVplanar(x);
}
static __inline int csp_isRGB_RGB(int x)
{
return x&FF_CSPS_MASK&FF_CSPS_MASK_RGB;
}
static __inline int csp_isRGB_BGR(int x)
{
return x&FF_CSPS_MASK&FF_CSPS_MASK_BGR;
}
static __inline int csp_isRGB(int x)
{
return csp_isRGB_RGB(x)|csp_isRGB_BGR(x);
}
static __inline int csp_isPAL(int x)
{
return x&FF_CSPS_MASK&FF_CSP_PAL8;
}
static __inline int csp_supXvid(int x)
{
return (x&FF_CSPS_MASK)&(FF_CSP_RGB24|FF_CSP_420P|FF_CSP_YUY2|FF_CSP_UYVY|FF_CSP_YVYU|FF_CSP_VYUY|FF_CSP_RGB15|FF_CSP_RGB16|FF_CSP_RGB32|FF_CSP_ABGR|FF_CSP_RGBA);
}
bool csp_inFOURCCmask(int x,FOURCC fcc);
extern char_t* csp_getName(const TcspInfo *cspInfo,int csp,char_t *buf,size_t len);
extern char_t* csp_getName(int csp,char_t *buf,size_t len);
extern int csp_bestMatch(int inCSP,int wantedCSPS,int *rank=NULL);
static __inline void csp_yuv_adj_to_plane(int &csp,const TcspInfo *cspInfo,unsigned int dy,unsigned char *data[4],stride_t stride[4])
{
if (csp_isYUVplanar(csp) && (csp&FF_CSP_FLAGS_YUV_ADJ))
{
csp&=~FF_CSP_FLAGS_YUV_ADJ;
data[2]=data[0]+stride[0]*(dy>>cspInfo->shiftY[0]);stride[1]=stride[0]>>cspInfo->shiftX[1];
data[1]=data[2]+stride[1]*(dy>>cspInfo->shiftY[1]);stride[2]=stride[0]>>cspInfo->shiftX[2];
}
}
static __inline void csp_yuv_order(int &csp,unsigned char *data[4],stride_t stride[4])
{
if (csp_isYUVplanar(csp) && (csp&FF_CSP_FLAGS_YUV_ORDER))
{
csp&=~FF_CSP_FLAGS_YUV_ORDER;
std::swap(data[1],data[2]);
std::swap(stride[1],stride[2]);
}
}
static __inline void csp_vflip(int &csp,const TcspInfo *cspInfo,unsigned char *data[],stride_t stride[],unsigned int dy)
{
if (csp&FF_CSP_FLAGS_VFLIP)
{
csp&=~FF_CSP_FLAGS_VFLIP;
for (unsigned int i=0;i<cspInfo->numPlanes;i++)
{
data[i]+=stride[i]*((dy>>cspInfo->shiftY[i])-1);
stride[i]*=-1;
}
}
}
int getBMPcolorspace(const BITMAPINFOHEADER *hdr,const TcspInfos &forcedCsps);
struct TcspFcc
{
const char_t *name;
FOURCC fcc;int csp;bool flip;
bool supEnc;
};
extern const TcspFcc cspFccs[];
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -