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

📄 ffimgfmt.h

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 H
📖 第 1 页 / 共 2 页
字号:
#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 + -