ffimgfmt.cpp

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

CPP
1,046
字号
       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_VYUY:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_YUY2 ,
       FF_CSP_UYVY ,
       FF_CSP_YVYU ,
       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_ABGR:
    {
     static const int best[FF_CSPS_NUM]=
      {
       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_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_RGBA:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_ABGR ,
       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_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_BGR32:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_RGB32,
       FF_CSP_BGR24,
       FF_CSP_RGB24,
       FF_CSP_BGR16,
       FF_CSP_RGB16,
       FF_CSP_BGR15,
       FF_CSP_RGB15,
       FF_CSP_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_BGR24:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_RGB24,
       FF_CSP_BGR32,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_RGB32,
       FF_CSP_BGR16,
       FF_CSP_RGB16,
       FF_CSP_BGR15,
       FF_CSP_RGB15,
       FF_CSP_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_BGR15:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_BGR32,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR24,
       FF_CSP_BGR16,
       FF_CSP_RGB32,
       FF_CSP_RGB24,
       FF_CSP_RGB15,
       FF_CSP_RGB16,
       FF_CSP_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_BGR16:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_BGR32,
       FF_CSP_BGR24,
       FF_CSP_BGR15,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_RGB32,
       FF_CSP_RGB24,
       FF_CSP_RGB15,
       FF_CSP_RGB16,
       FF_CSP_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_RGB32:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_BGR24,
       FF_CSP_RGB24,
       FF_CSP_BGR15,
       FF_CSP_BGR16,
       FF_CSP_RGB15,
       FF_CSP_RGB16,
       FF_CSP_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_RGB24:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_BGR24,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_RGB32,
       FF_CSP_BGR15,
       FF_CSP_BGR16,
       FF_CSP_RGB15,
       FF_CSP_RGB16,
       FF_CSP_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_RGB15:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_BGR15,
       FF_CSP_RGB32,
       FF_CSP_RGB24,
       FF_CSP_RGB16,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_BGR24,
       FF_CSP_BGR16,
       FF_CSP_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_RGB16:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_RGB15,
       FF_CSP_RGB32,
       FF_CSP_RGB24,
       FF_CSP_ABGR ,
       FF_CSP_RGBA ,
       FF_CSP_BGR32,
       FF_CSP_BGR24,
       FF_CSP_BGR15,
       FF_CSP_BGR16,
       FF_CSP_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_PAL8:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_RGB32,
       FF_CSP_BGR32,
       FF_CSP_RGB24,
       FF_CSP_BGR24,
       FF_CSP_RGB15,
       FF_CSP_BGR15,
       FF_CSP_RGB16,
       FF_CSP_BGR16,
       FF_CSP_420P ,
       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_NULL
      };
     bestcsps=best;
     break;
    }
   case FF_CSP_CLJR:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_420P ,
       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_Y800:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_420P ,
       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_NV12:
    {
     static const int best[FF_CSPS_NUM]=
      {
       FF_CSP_420P ,
       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;
    }
   default:return FF_CSP_NULL;
  }
 if (rank) *rank=99;
 while (*bestcsps)
  {
   if (*bestcsps&wantedCSPS)
    return *bestcsps|(inCSP&~FF_CSPS_MASK);
   bestcsps++;
   if (rank) (*rank)--;
  }
 return FF_CSP_NULL;
}

bool csp_inFOURCCmask(int x,FOURCC fcc)
{
 switch (fcc)
  {
   case FOURCC_MASK_YUV:return !!csp_isYUV(x);
   case FOURCC_MASK_RGB:return !!csp_isRGB(x);
   case FOURCC_MASK_PAL:return !!csp_isPAL(x);
   default:return false;
  }
}

bool TcspInfos::TsortFc::operator ()(const TcspInfo* csp1,const TcspInfo* csp2)
{
 int rank1;csp_bestMatch(csp,csp1->id,&rank1);
 int rank2;csp_bestMatch(csp,csp2->id,&rank2);
 return rank1>rank2;
}
void TcspInfos::sort(int csp)
{
 std::sort(begin(),end(),TsortFc(csp&FF_CSPS_MASK));
}

int getBMPcolorspace(const BITMAPINFOHEADER *hdr,const TcspInfos &forcedCsps)
{
 int csp;
 switch(hdr->biCompression)
  {
   case BI_RGB:
    switch (hdr->biBitCount)
     {
      case  8:csp=FF_CSP_PAL8|FF_CSP_FLAGS_VFLIP;break;
      case 15:csp=FF_CSP_RGB15|FF_CSP_FLAGS_VFLIP;break;
      case 16:csp=FF_CSP_RGB16|FF_CSP_FLAGS_VFLIP;break;
      case 24:csp=FF_CSP_RGB24|FF_CSP_FLAGS_VFLIP;break;
      case 32:csp=FF_CSP_RGB32|FF_CSP_FLAGS_VFLIP;break;
      default:return FF_CSP_NULL;
     }
    break;
   case FOURCC_I420:
   case FOURCC_IYUV:
    csp=FF_CSP_420P|FF_CSP_FLAGS_YUV_ADJ|FF_CSP_FLAGS_YUV_ORDER;
    break;
   case FOURCC_YV12:
    csp=FF_CSP_420P|FF_CSP_FLAGS_YUV_ADJ;
    break;
   case FOURCC_YUYV:
   case FOURCC_YUY2:
   case FOURCC_V422:
    csp=FF_CSP_YUY2;
    break;
   case FOURCC_YVYU:
    csp=FF_CSP_YVYU;
    break;
   case FOURCC_UYVY:
    csp=FF_CSP_UYVY;
    break;
   case FOURCC_VYUY:
    csp=FF_CSP_VYUY;
    break;
   case FOURCC_Y800:
    csp=FF_CSP_Y800;
    break;
   case FOURCC_444P:
   case FOURCC_YV24:
    csp=FF_CSP_444P;
    break;
   case FOURCC_422P:
   case FOURCC_YV16:
    csp=FF_CSP_422P;
    break;
   case FOURCC_411P:
   case FOURCC_Y41B:
    csp=FF_CSP_411P;
    break;
   case FOURCC_410P:
    csp=FF_CSP_410P;
    break;
   default:
    return FF_CSP_NULL;
  }
 bool ok;
 if (!forcedCsps.empty())
  ok=std::find(forcedCsps.begin(),forcedCsps.end(),csp_getInfo(csp))!=forcedCsps.end();
 else
  ok=true;
 return ok?csp:FF_CSP_NULL;
}

⌨️ 快捷键说明

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