ffimgfmt.cpp

来自「从FFMPEG转换而来的H264解码程序,VC下编译..」· C++ 代码 · 共 1,046 行 · 第 1/2 页

CPP
1,046
字号
/*
 * Copyright (c) 2003-2006 Milan Cutka
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include "stdafx.h"
#include "ffdshow_mediaguids.h"
#include "ffImgfmt.h"
#include <uuids.h>
#include "char_t.h"

const TcspInfo cspInfos[]=
{
 {
  FF_CSP_420P,_l("YV12"),
  1,12, //Bpp
  3, //numplanes
  {0,1,1,0}, //shiftX
  {0,1,1,0}, //shiftY
  {0,128,128,0},  //black,
  FOURCC_YV12, FOURCC_YV12, &MEDIASUBTYPE_YV12
 },
 {
  FF_CSP_422P,_l("422P"),
  1,18, //Bpp
  3, //numplanes
  {0,1,1,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,128,128,0},  //black
  FOURCC_422P, FOURCC_422P, &MEDIASUBTYPE_422P
 },
 {
  FF_CSP_444P,_l("444P"),
  1,24, //Bpp
  3, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,128,128,0},  //black
  FOURCC_444P, FOURCC_444P, &MEDIASUBTYPE_444P
 },
 {
  FF_CSP_411P,_l("411P"),
  1,17, //Bpp
  3, //numplanes
  {0,2,2,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,128,128,0},  //black
  FOURCC_411P, FOURCC_411P, &MEDIASUBTYPE_411P
 },
 {
  FF_CSP_410P,_l("410P"),
  1,10, //Bpp
  3, //numplanes
  {0,2,2,0}, //shiftX
  {0,2,2,0}, //shiftY
  {0,128,128,0}, //black
  FOURCC_410P, FOURCC_410P, &MEDIASUBTYPE_410P
 },

 {
  FF_CSP_YUY2,_l("YUY2"),
  2,16, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0x8000,0,0,0},  //black
  FOURCC_YUY2, FOURCC_YUY2, &MEDIASUBTYPE_YUY2,
  0,1 //packedLumaOffset,packedChromaOffset
 },
 {
  FF_CSP_UYVY,_l("UYVY"),
  2,16, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0x0080,0,0,0},  //black
  FOURCC_UYVY, FOURCC_UYVY, &MEDIASUBTYPE_UYVY,
  1,0 //packedLumaOffset,packedChromaOffset
 },
 {
  FF_CSP_YVYU,_l("YVYU"),
  2,16, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0},  //shiftY
  {0x8000,0,0,0},  //black
  FOURCC_YVYU, FOURCC_YVYU, &MEDIASUBTYPE_YVYU,
  0,1 //packedLumaOffset,packedChromaOffset
 },
 {
  FF_CSP_VYUY,_l("VYUY"),
  2,16, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0},  //shiftY
  {0x0080,0,0,0},  //black
  FOURCC_VYUY, FOURCC_VYUY, &MEDIASUBTYPE_VYUY,
  1,0 //packedLumaOffset,packedChromaOffset
 },

 {
  FF_CSP_ABGR,_l("ABGR"),
  4,32, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, 0, &MEDIASUBTYPE_RGB32
 },
 {
  FF_CSP_RGBA,_l("RGBA"),
  4,32, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, 0, &MEDIASUBTYPE_RGB32
 },
 {
  FF_CSP_BGR32,_l("BGR32"),
  4,32, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, 0, &MEDIASUBTYPE_RGB32
 },
 {
  FF_CSP_BGR24,_l("BGR24"),
  3,24, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, 0, &MEDIASUBTYPE_RGB24
 },
 {
  FF_CSP_BGR15,_l("BGR15"),
  2,16, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, 0, &MEDIASUBTYPE_RGB555
 },
 {
  FF_CSP_BGR16,_l("BGR16"),
  2,16, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, 0, &MEDIASUBTYPE_RGB565
 },
 {
  FF_CSP_RGB32,_l("RGB32"),
  4,32, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, FOURCC_RGB3, &MEDIASUBTYPE_RGB32
 },
 {
  FF_CSP_RGB24,_l("RGB24"),
  3,24, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, FOURCC_RGB2, &MEDIASUBTYPE_RGB24
 },
 {
  FF_CSP_RGB15,_l("RGB15"),
  2,16, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, FOURCC_RGB5, &MEDIASUBTYPE_RGB555
 },
 {
  FF_CSP_RGB16,_l("RGB16"),
  2,16, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, FOURCC_RGB6, &MEDIASUBTYPE_RGB565
 },

 {
  FF_CSP_PAL8,_l("pal8"),
  1,8, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  BI_RGB, 0, &MEDIASUBTYPE_RGB8
 },
 {
  FF_CSP_CLJR,_l("cljr"),
  1,16, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  FOURCC_CLJR, FOURCC_CLJR, &MEDIASUBTYPE_CLJR
 },
 {
  FF_CSP_Y800,_l("gray"),
  1,8, //Bpp
  1, //numplanes
  {0,0,0,0}, //shiftX
  {0,0,0,0}, //shiftY
  {0,0,0,0}, //black
  FOURCC_Y800, FOURCC_Y800, &MEDIASUBTYPE_Y800
 },
 {
  FF_CSP_NV12,_l("NV12"),
  1,12, //Bpp
  2, //numplanes
  {0,0,0,0}, //shiftX
  {0,1,1,0}, //shiftY
  {0,128,128,0}, //black
  FOURCC_NV12, FOURCC_NV12, &MEDIASUBTYPE_NV12
 },
 0
};

TcspInfo cspInfoIYUV=
{
 FF_CSP_420P,_l("YV12"),
 1,12, //Bpp
 3, //numplanes
 {0,1,1,0}, //shiftX
 {0,1,1,0}, //shiftY
 {0,128,128,0},  //black,
 FOURCC_IYUV, FOURCC_IYUV, &MEDIASUBTYPE_IYUV
};

TcspInfo cspInfoNV21=
{
 FF_CSP_NV12,_l("NV21"),
 1,12, //Bpp
 2, //numplanes
 {0,0,0,0}, //shiftX
 {0,1,1,0}, //shiftY
 {0,128,128,0}, //black
 FOURCC_NV21, FOURCC_NV21, &MEDIASUBTYPE_NV21
};

const TcspFcc cspFccs[]=
{
 _l("YV12")     ,FOURCC_YV12,FF_CSP_420P|FF_CSP_FLAGS_YUV_ADJ,false,true,
 _l("I420/IYUV"),FOURCC_I420,FF_CSP_420P|FF_CSP_FLAGS_YUV_ADJ|FF_CSP_FLAGS_YUV_ORDER,false,true,
 _l("YUY2")     ,FOURCC_YUY2,FF_CSP_YUY2,false,true,
 _l("YVYU")     ,FOURCC_YVYU,FF_CSP_YVYU,false,true,
 _l("UYVY")     ,FOURCC_UYVY,FF_CSP_UYVY,false,true,
 _l("VYUY")     ,FOURCC_VYUY,FF_CSP_VYUY,false,true,
 _l("RGB32")    ,FOURCC_RGB3,FF_CSP_RGB32,true,true,
 _l("RGB24")    ,FOURCC_RGB2,FF_CSP_RGB24,true,true,
 _l("RGB555")   ,FOURCC_RGB5,FF_CSP_RGB15,true,true,
 _l("RGB565")   ,FOURCC_RGB6,FF_CSP_RGB16,true,true,
 _l("CLJR")     ,FOURCC_CLJR,FF_CSP_CLJR,false,false,
 _l("Y800")     ,FOURCC_Y800,FF_CSP_Y800,false,true,
 _l("NV12")     ,FOURCC_NV12,FF_CSP_NV12,false,false,
 _l("NV21")     ,FOURCC_NV21,FF_CSP_NV12|FF_CSP_FLAGS_YUV_ORDER,false,false,
 NULL,0
};

char_t* csp_getName(int csp,char_t *buf,size_t len)
{
 return csp_getName(csp_getInfo(csp),csp,buf,len);
}
char_t* csp_getName(const TcspInfo *cspInfo,int csp,char_t *buf,size_t len)
{
 const char_t *colorspaceName=cspInfo?cspInfo->name:_l("unknown");
 tsnprintf(buf,len,_l("%s%s%s%s%s%s"),colorspaceName,csp&FF_CSP_FLAGS_VFLIP?_l(",flipped"):_l(""),csp&FF_CSP_FLAGS_INTERLACED?_l(",interlaced"):_l(""),csp&FF_CSP_FLAGS_YUV_ADJ?_l(",adj"):_l(""),csp&FF_CSP_FLAGS_YUV_ORDER?_l(",VU"):_l(""),csp&FF_CSP_FLAGS_YUV_JPEG?_l(",JPEG"):_l(""));
 return buf;
}

const TcspInfo* csp_getInfoFcc(FOURCC fcccsp)
{
 if (fcccsp==FOURCC_IYUV || fcccsp==FOURCC_I420)
  return &cspInfoIYUV;
 else
  {
   for (int i=0;i<FF_CSPS_NUM;i++)
    if (cspInfos[i].fcccsp==fcccsp)
     return cspInfos+i;
   return NULL;
  }
}

int csp_bestMatch(int inCSP,int wantedCSPS,int *rank)
{
 int outCSP=inCSP&wantedCSPS&FF_CSPS_MASK;
 if (outCSP)
  {
   if (rank) *rank=100;
   return outCSP|(inCSP&~FF_CSPS_MASK);
  }

 const int *bestcsps=NULL;
 switch (inCSP&FF_CSPS_MASK)
  {
   case FF_CSP_420P:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_422P ,
       FF_CSP_444P ,
       FF_CSP_411P ,
       FF_CSP_410P ,
       FF_CSP_YUY2 ,
       FF_CSP_UYVY ,
       FF_CSP_YVYU ,
       FF_CSP_VYUY ,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_RGB32,
       FF_CSP_BGR24,
       FF_CSP_RGB24,
       FF_CSP_BGR16,
       FF_CSP_RGB16,
       FF_CSP_BGR15,
       FF_CSP_RGB15,
       FF_CSP_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_422P:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_420P ,
       FF_CSP_444P ,
       FF_CSP_411P ,
       FF_CSP_410P ,
       FF_CSP_YUY2 ,
       FF_CSP_UYVY ,
       FF_CSP_YVYU ,
       FF_CSP_VYUY ,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_RGB32,
       FF_CSP_BGR24,
       FF_CSP_RGB24,
       FF_CSP_BGR16,
       FF_CSP_RGB16,
       FF_CSP_BGR15,
       FF_CSP_RGB15,
       FF_CSP_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_444P:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_420P ,
       FF_CSP_422P ,
       FF_CSP_411P ,
       FF_CSP_410P ,
       FF_CSP_YUY2 ,
       FF_CSP_UYVY ,
       FF_CSP_YVYU ,
       FF_CSP_VYUY ,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_RGB32,
       FF_CSP_BGR24,
       FF_CSP_RGB24,
       FF_CSP_BGR16,
       FF_CSP_RGB16,
       FF_CSP_BGR15,
       FF_CSP_RGB15,
       FF_CSP_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_411P:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_420P ,
       FF_CSP_422P ,
       FF_CSP_444P ,
       FF_CSP_410P ,
       FF_CSP_YUY2 ,
       FF_CSP_UYVY ,
       FF_CSP_YVYU ,
       FF_CSP_VYUY ,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_RGB32,
       FF_CSP_BGR24,
       FF_CSP_RGB24,
       FF_CSP_BGR16,
       FF_CSP_RGB16,
       FF_CSP_BGR15,
       FF_CSP_RGB15,
       FF_CSP_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_410P:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_420P ,
       FF_CSP_422P ,
       FF_CSP_444P ,
       FF_CSP_411P ,
       FF_CSP_YUY2 ,
       FF_CSP_UYVY ,
       FF_CSP_YVYU ,
       FF_CSP_VYUY ,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_RGB32,
       FF_CSP_BGR24,
       FF_CSP_RGB24,
       FF_CSP_BGR16,
       FF_CSP_RGB16,
       FF_CSP_BGR15,
       FF_CSP_RGB15,
       FF_CSP_NULL
      };
     bestcsps=best;
     break;
    }

   case FF_CSP_YUY2:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_UYVY ,
       FF_CSP_YVYU ,
       FF_CSP_VYUY ,
       FF_CSP_420P ,
       FF_CSP_422P ,
       FF_CSP_444P ,
       FF_CSP_411P ,
       FF_CSP_410P ,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_RGB32,
       FF_CSP_BGR24,
       FF_CSP_RGB24,
       FF_CSP_BGR16,
       FF_CSP_RGB16,
       FF_CSP_BGR15,
       FF_CSP_RGB15,
       FF_CSP_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_UYVY:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_YUY2 ,
       FF_CSP_YVYU ,
       FF_CSP_VYUY ,
       FF_CSP_420P ,
       FF_CSP_422P ,
       FF_CSP_444P ,
       FF_CSP_411P ,
       FF_CSP_410P ,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_RGB32,
       FF_CSP_BGR24,
       FF_CSP_RGB24,
       FF_CSP_BGR16,
       FF_CSP_RGB16,
       FF_CSP_BGR15,
       FF_CSP_RGB15,
       FF_CSP_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_YVYU:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_YUY2 ,
       FF_CSP_UYVY ,
       FF_CSP_VYUY ,
       FF_CSP_420P ,
       FF_CSP_422P ,
       FF_CSP_444P ,
       FF_CSP_411P ,
       FF_CSP_410P ,
       FF_CSP_ABGR ,

⌨️ 快捷键说明

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