⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ffimgfmt.h

📁 mpeg4 video codec mpeg4 video codec
💻 H
字号:
#ifndef _FFIMGFMT_H_#define _FFIMGFMT_H_//================================ ffdshow ==================================enum{ FF_CSP_NULL       =     0, FF_CSP_420P       =1U<< 0, FF_CSP_422P       =1U<< 1, FF_CSP_444P       =1U<< 2, FF_CSP_411P       =1U<< 3, FF_CSP_410P       =1U<< 4, FF_CSP_YUY2       =1U<< 5, FF_CSP_UYVY       =1U<< 6, FF_CSP_YVYU       =1U<< 7, FF_CSP_VYUY       =1U<< 8, FF_CSP_ABGR       =1U<< 9,  // [a|b|g|r] FF_CSP_RGBA       =1U<<10,  // [r|g|b|a] FF_CSP_BGR32      =1U<<11, FF_CSP_BGR24      =1U<<12, FF_CSP_BGR15      =1U<<13, FF_CSP_BGR16      =1U<<14, FF_CSP_RGB32      =1U<<15, FF_CSP_RGB24      =1U<<16, FF_CSP_RGB15      =1U<<17, FF_CSP_RGB16      =1U<<18, FF_CSP_PAL8       =1U<<19, FF_CSP_CLJR       =1U<<20, FF_CSP_Y800       =1U<<21, FF_CSP_NV12       =1U<<22};#define FF_CSPS_NUM 23#define FF_CSPS_MASK            ((2<<FF_CSPS_NUM)-1)#define FF_CSPS_MASK_YUV_PLANAR (FF_CSP_420P|FF_CSP_422P|FF_CSP_444P|FF_CSP_411P|FF_CSP_410P)#define FF_CSPS_MASK_YUV_PACKED (FF_CSP_YUY2|FF_CSP_UYVY|FF_CSP_YVYU|FF_CSP_VYUY)#define FF_CSPS_MASK_RGB        (FF_CSP_RGBA|FF_CSP_RGB32|FF_CSP_RGB24|FF_CSP_RGB15|FF_CSP_RGB16)#define FF_CSPS_MASK_BGR        (FF_CSP_ABGR|FF_CSP_BGR32|FF_CSP_BGR24|FF_CSP_BGR15|FF_CSP_BGR16)#define FF_CSP_FLAGS_VFLIP      (1U<<31)   // flip mask#define FF_CSP_FLAGS_INTERLACED (1U<<30)#define FF_CSP_FLAGS_YUV_ADJ    (1U<<29)   // YUV planes are stored consecutively in one memory block#define FF_CSP_FLAGS_YUV_ORDER  (1U<<28)   // UV ordered chroma planes (not VU as default)#define FF_CSP_FLAGS_YUV_JPEG   (1U<<27)#if defined(__cplusplus) && !defined(FF_CSP_ONLY)#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,unsigned int len);extern char_t* csp_getName(int csp,char_t *buf,unsigned int 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],int 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],int 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[],int 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//==================================== xvid4 =====================================#define XVID4_CSP_PLANAR   (1<< 0) /* 4:2:0 planar */#define XVID4_CSP_I420     (1<< 1) /* 4:2:0 packed(planar win32) */#define XVID4_CSP_YV12     (1<< 2) /* 4:2:0 packed(planar win32) */#define XVID4_CSP_YUY2     (1<< 3) /* 4:2:2 packed */#define XVID4_CSP_UYVY     (1<< 4) /* 4:2:2 packed */#define XVID4_CSP_YVYU     (1<< 5) /* 4:2:2 packed */#define XVID4_CSP_BGRA     (1<< 6) /* 32-bit bgra packed */#define XVID4_CSP_ABGR     (1<< 7) /* 32-bit abgr packed */#define XVID4_CSP_RGBA     (1<< 8) /* 32-bit rgba packed */#define XVID4_CSP_BGR      (1<< 9) /* 24-bit bgr packed */#define XVID4_CSP_RGB555   (1<<10) /* 16-bit rgb555 packed */#define XVID4_CSP_RGB565   (1<<11) /* 16-bit rgb565 packed */#define XVID4_CSP_SLICE    (1<<12) /* decoder only: 4:2:0 planar, per slice rendering */#define XVID4_CSP_INTERNAL (1<<13) /* decoder only: 4:2:0 planar, returns ptrs to internal buffers */#define XVID4_CSP_NULL     (1<<14) /* decoder only: dont output anything */#define XVID4_CSP_VFLIP    (1<<31) /* vertical flip mask */static __inline int csp_xvid4_2ffdshow(int csp){ switch (csp)  {   case XVID4_CSP_BGR   :return FF_CSP_RGB24;   case XVID4_CSP_YV12  :return FF_CSP_420P|FF_CSP_FLAGS_YUV_ADJ;   case XVID4_CSP_YUY2  :return FF_CSP_YUY2;   case XVID4_CSP_UYVY  :return FF_CSP_UYVY;   case XVID4_CSP_I420  :return FF_CSP_420P|FF_CSP_FLAGS_YUV_ADJ|FF_CSP_FLAGS_YUV_ORDER;   case XVID4_CSP_RGB555:return FF_CSP_RGB15;    case XVID4_CSP_RGB565:return FF_CSP_RGB16;   case XVID4_CSP_PLANAR:return FF_CSP_420P;   case XVID4_CSP_YVYU  :return FF_CSP_YVYU;   case XVID4_CSP_BGRA  :return FF_CSP_RGB32;   case XVID4_CSP_ABGR  :return FF_CSP_ABGR;   case XVID4_CSP_RGBA  :return FF_CSP_RGBA;   default              :return FF_CSP_NULL;  }}//================================= libavcodec ===================================enum PixelFormat {    PIX_FMT_NONE=-1,    PIX_FMT_YUV420P,    PIX_FMT_YUV422,    PIX_FMT_RGB24,     // 3 bytes, R is first    PIX_FMT_BGR24,     // 3 bytes, B is first    PIX_FMT_YUV422P,    PIX_FMT_YUV444P,    PIX_FMT_RGBA32,    // always stored in cpu endianness    PIX_FMT_YUV410P,    PIX_FMT_YUV411P,    PIX_FMT_RGB565,    // always stored in cpu endianness    PIX_FMT_RGB555,    // always stored in cpu endianness, most significant bit to 1    PIX_FMT_GRAY8,    PIX_FMT_MONOWHITE, // 0 is white    PIX_FMT_MONOBLACK, // 0 is black    PIX_FMT_PAL8,      // 8 bit with RGBA palette    PIX_FMT_YUVJ420P,  ///< YUV full scale (jpeg)        PIX_FMT_YUVJ422P,  ///< YUV full scale (jpeg)        PIX_FMT_YUVJ444P,  ///< YUV full scale (jpeg)    PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing(xvmc_render.h)    PIX_FMT_XVMC_MPEG2_IDCT,    PIX_FMT_UYVY422,    PIX_FMT_UYVY411,    PIX_FMT_NB};static __inline int csp_lavc2ffdshow(enum PixelFormat pix_fmt){ switch (pix_fmt)  {   case PIX_FMT_YUV420P :return FF_CSP_420P;   case PIX_FMT_YUVJ420P:return FF_CSP_420P|FF_CSP_FLAGS_YUV_JPEG;   case PIX_FMT_YUV422P :return FF_CSP_422P;   case PIX_FMT_YUVJ422P:return FF_CSP_422P|FF_CSP_FLAGS_YUV_JPEG;   case PIX_FMT_YUV444P :return FF_CSP_444P;   case PIX_FMT_YUVJ444P:return FF_CSP_444P|FF_CSP_FLAGS_YUV_JPEG;   case PIX_FMT_YUV411P :return FF_CSP_411P;   case PIX_FMT_YUV410P :return FF_CSP_410P;   case PIX_FMT_YUV422  :return FF_CSP_YUY2;   case PIX_FMT_UYVY422 :return FF_CSP_UYVY;   case PIX_FMT_RGB24   :return FF_CSP_RGB24;   case PIX_FMT_BGR24   :return FF_CSP_BGR24;   case PIX_FMT_RGBA32  :return FF_CSP_RGB32;   case PIX_FMT_RGB555  :return FF_CSP_RGB15;   case PIX_FMT_RGB565  :return FF_CSP_RGB16;   case PIX_FMT_PAL8    :return FF_CSP_PAL8;   case PIX_FMT_GRAY8   :return FF_CSP_Y800;   default              :return FF_CSP_NULL;  }}static __inline enum PixelFormat csp_ffdshow2lavc(int pix_fmt){ switch (pix_fmt&FF_CSPS_MASK)  {   case FF_CSP_420P:return pix_fmt&FF_CSP_FLAGS_YUV_JPEG?PIX_FMT_YUVJ420P:PIX_FMT_YUV420P;   case FF_CSP_422P:return pix_fmt&FF_CSP_FLAGS_YUV_JPEG?PIX_FMT_YUVJ422P:PIX_FMT_YUV422P;   case FF_CSP_444P:return pix_fmt&FF_CSP_FLAGS_YUV_JPEG?PIX_FMT_YUVJ444P:PIX_FMT_YUV444P;   case FF_CSP_411P:return PIX_FMT_YUV411P;   case FF_CSP_410P:return PIX_FMT_YUV410P;   case FF_CSP_YUY2:return PIX_FMT_YUV422;   case FF_CSP_UYVY:return PIX_FMT_UYVY422;   case FF_CSP_RGB24:return PIX_FMT_RGB24;   case FF_CSP_BGR24:return PIX_FMT_BGR24;   case FF_CSP_RGB32:return PIX_FMT_RGBA32;   case FF_CSP_RGB15:return PIX_FMT_RGB555;   case FF_CSP_RGB16:return PIX_FMT_RGB565;   case FF_CSP_PAL8:return PIX_FMT_PAL8;   case FF_CSP_Y800:return PIX_FMT_GRAY8;   default         :return PIX_FMT_NB;  }}//=================================== mplayer ===================================// RGB/BGR Formats #define IMGFMT_RGB_MASK 0xFFFFFF00#define IMGFMT_RGB (('R'<<24)|('G'<<16)|('B'<<8))#define IMGFMT_RGB1  (IMGFMT_RGB|1)#define IMGFMT_RGB4  (IMGFMT_RGB|4)#define IMGFMT_RG4B  (IMGFMT_RGB|4|128) // RGB4 with 1 pixel per byte#define IMGFMT_RGB8  (IMGFMT_RGB|8)#define IMGFMT_RGB15 (IMGFMT_RGB|15)#define IMGFMT_RGB16 (IMGFMT_RGB|16)#define IMGFMT_RGB24 (IMGFMT_RGB|24)#define IMGFMT_RGB32 (IMGFMT_RGB|32)#define IMGFMT_BGR_MASK 0xFFFFFF00#define IMGFMT_BGR (('B'<<24)|('G'<<16)|('R'<<8))#define IMGFMT_BGR1 (IMGFMT_BGR|1)#define IMGFMT_BGR4 (IMGFMT_BGR|4)#define IMGFMT_BG4B (IMGFMT_BGR|4|128) // BGR4 with 1 pixel per byte#define IMGFMT_BGR8 (IMGFMT_BGR|8)#define IMGFMT_BGR15 (IMGFMT_BGR|15)#define IMGFMT_BGR16 (IMGFMT_BGR|16)#define IMGFMT_BGR24 (IMGFMT_BGR|24)#define IMGFMT_BGR32 (IMGFMT_BGR|32)#define IMGFMT_IS_RGB(fmt) (((fmt)&IMGFMT_RGB_MASK)==IMGFMT_RGB)#define IMGFMT_IS_BGR(fmt) (((fmt)&IMGFMT_BGR_MASK)==IMGFMT_BGR)#define IMGFMT_RGB_DEPTH(fmt) ((fmt)&0x3F)#define IMGFMT_BGR_DEPTH(fmt) ((fmt)&0x3F)                     // Planar YUV Formats#define IMGFMT_YVU9 0x39555659#define IMGFMT_IF09 0x39304649#define IMGFMT_YV12 0x32315659#define IMGFMT_I420 0x30323449#define IMGFMT_IYUV 0x56555949#define IMGFMT_CLPL 0x4C504C43#define IMGFMT_Y800 0x30303859#define IMGFMT_Y8   0x20203859#define IMGFMT_NV12 0x3231564E#define IMGFMT_NV21 0x3132564E// unofficial Planar Formats, FIXME if official 4CC exists #define IMGFMT_444P 0x50343434#define IMGFMT_422P 0x50323234#define IMGFMT_411P 0x50313134// Packed YUV Formats#define IMGFMT_IUYV 0x56595549#define IMGFMT_IY41 0x31435949#define IMGFMT_IYU1 0x31555949#define IMGFMT_IYU2 0x32555949#define IMGFMT_UYVY 0x59565955#define IMGFMT_VYUY 0x59555956#define IMGFMT_UYNV 0x564E5955#define IMGFMT_cyuv 0x76757963#define IMGFMT_Y422 0x32323459#define IMGFMT_YUY2 0x32595559#define IMGFMT_YUNV 0x564E5559#define IMGFMT_YVYU 0x55595659#define IMGFMT_Y41P 0x50313459#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 0x50565955static __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_ABGR :return IMGFMT_RGB32;   case FF_CSP_RGBA :return IMGFMT_RGB32;   case FF_CSP_RGB15:return IMGFMT_RGB15;   case FF_CSP_RGB16:return IMGFMT_RGB16;   case FF_CSP_RGB24:return IMGFMT_RGB24;   case FF_CSP_RGB32:return IMGFMT_RGB32;   case FF_CSP_BGR15:return IMGFMT_BGR15;   case FF_CSP_BGR16:return IMGFMT_BGR16;   case FF_CSP_BGR24:return IMGFMT_BGR24;   case FF_CSP_BGR32:return IMGFMT_BGR32;   case FF_CSP_Y800 :return IMGFMT_Y800;   case FF_CSP_NV12 :return csp&FF_CSP_FLAGS_YUV_ORDER?IMGFMT_NV21:IMGFMT_NV12;   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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -