toutputvideosettings.cpp

来自「ffshow源码」· C++ 代码 · 共 156 行

CPP
156
字号
/*
 * Copyright (c) 2002-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 "ToutputVideoSettings.h"

const TfilterIDFF ToutputVideoSettings::idffs=
{
 /*name*/      _l("Output"),
 /*id*/        IDFF_filterOutputVideo,
 /*is*/        0,
 /*order*/     0,
 /*show*/      0,
 /*full*/      0,
 /*half*/      0,
 /*dlgId*/     0,
};

const char_t* ToutputVideoSettings::dvNorms[]=
{
 _l("PAL"),
 _l("NTSF"),
 _l("closest"),
 NULL
};

ToutputVideoSettings::ToutputVideoSettings(TintStrColl *Icoll,TfilterIDFFs *filters):TfilterSettingsVideo(sizeof(*this),Icoll,filters,&idffs,false)
{
 half=0;full=1;
 static const TintOptionT<ToutputVideoSettings> iopts[]=
  {
   IDFF_flip               ,&ToutputVideoSettings::flip               ,0,0,_l(""),1,
     _l("flip"),0,
     
   IDFF_hwOverlay          ,&ToutputVideoSettings::hwOverlay          ,0,2,_l(""),1,
     _l("hwOverlay"),2,
   IDFF_hwOverlayAspect    ,&ToutputVideoSettings::hwOverlayAspect    ,1,1,_l(""),1,
     _l("hwOverlayAspect"),0,
   IDFF_hwDeinterlace      ,&ToutputVideoSettings::hwDeinterlace      ,0,0,_l(""),1,
     _l("hwDeinterlace"),0,
   
   IDFF_outI420            ,&ToutputVideoSettings::i420               ,0,0,_l(""),0,
     _l("outI420"),0, 
   IDFF_outYV12            ,&ToutputVideoSettings::yv12               ,0,0,_l(""),0,
     _l("outYV12"),1,
   IDFF_outYUY2            ,&ToutputVideoSettings::yuy2               ,0,0,_l(""),0,
     _l("outYUY2"),1,
   IDFF_outYVYU            ,&ToutputVideoSettings::yvyu               ,0,0,_l(""),0,
     _l("outYVYU"),1,
   IDFF_outUYVY            ,&ToutputVideoSettings::uyvy               ,0,0,_l(""),0,
     _l("outUYVY"),1,
   IDFF_outNV12            ,&ToutputVideoSettings::nv12               ,0,0,_l(""),0,
     _l("outNV12"),0,
   IDFF_outRGB32           ,&ToutputVideoSettings::rgb32              ,0,0,_l(""),0,
     _l("outRGB32"),1,
   IDFF_outRGB24           ,&ToutputVideoSettings::rgb24              ,0,0,_l(""),0,
     _l("outRGB24"),1,
   IDFF_outRGB555          ,&ToutputVideoSettings::rgb555             ,0,0,_l(""),0,
     _l("outRGB555"),1,
   IDFF_outRGB565          ,&ToutputVideoSettings::rgb565             ,0,0,_l(""),0,
     _l("outRGB565"),1,
   IDFF_outClosest         ,&ToutputVideoSettings::closest            ,0,0,_l(""),1,
     _l("outClosest"),1,
   IDFF_outDV              ,&ToutputVideoSettings::dv                 ,0,0,_l(""),0,
     _l("outDV"),0,
   IDFF_outDVnorm          ,&ToutputVideoSettings::dvNorm             ,0,2,_l(""),0,
     _l("outDVnorm"),2,
   IDFF_allowOutChange     ,&ToutputVideoSettings::allowOutChange3    ,0,2,_l(""),1,
     _l("allowOutChange"),2,
   IDFF_outChangeCompatOnly,&ToutputVideoSettings::outChangeCompatOnly,0,0,_l(""),1,
     _l("outChangeCompatOnly"),1,
   IDFF_avisynthYV12_RGB   ,&ToutputVideoSettings::avisynthYV12_RGB   ,0,0,_l(""),1,
     _l("avisynthYV12_RGB"),0,
   0
  };
 addOptions(iopts);
 static const TcreateParamList1 listDVnorm(dvNorms);setParamList(IDFF_outDVnorm,&listDVnorm);
}

void ToutputVideoSettings::reg_op_outcsps(TregOp &t)
{
 t._REG_OP_N(IDFF_outI420  ,_l("outI420")  ,i420  ,0); 
 t._REG_OP_N(IDFF_outYV12  ,_l("outYV12")  ,yv12  ,1);
 t._REG_OP_N(IDFF_outYUY2  ,_l("outYUY2")  ,yuy2  ,1);
 t._REG_OP_N(IDFF_outYVYU  ,_l("outYVYU")  ,yvyu  ,1);
 t._REG_OP_N(IDFF_outUYVY  ,_l("outUYVY")  ,uyvy  ,1);
 t._REG_OP_N(IDFF_outNV12  ,_l("outNV12")  ,nv12  ,0);
 t._REG_OP_N(IDFF_outRGB32 ,_l("outRGB32") ,rgb32 ,1);
 t._REG_OP_N(IDFF_outRGB24 ,_l("outRGB24") ,rgb24 ,1);
 t._REG_OP_N(IDFF_outRGB555,_l("outRGB555"),rgb555,1);
 t._REG_OP_N(IDFF_outRGB565,_l("outRGB565"),rgb565,1);
 t._REG_OP_N(IDFF_outClosest,_l("outClosest"),closest,1);
 t._REG_OP_N(IDFF_hwOverlay,_l("hwOverlay"),hwOverlay,0);
 t._REG_OP_N(IDFF_hwOverlayAspect,_l("hwOverlayAspect"),hwOverlayAspect,0);
}

const int* ToutputVideoSettings::getResets(unsigned int pageId)
{
 static const int idResets[]={IDFF_flip,IDFF_outI420,IDFF_outYV12,IDFF_outYUY2,IDFF_outYVYU,IDFF_outUYVY,IDFF_outNV12,IDFF_outRGB32,IDFF_outRGB24,IDFF_outRGB555,IDFF_outDV,IDFF_outRGB565,IDFF_outClosest,IDFF_hwOverlay,IDFF_hwDeinterlace,IDFF_avisynthYV12_RGB,IDFF_allowOutChange,IDFF_outChangeCompatOnly,0};
 return idResets;
}

void ToutputVideoSettings::getOutputColorspaces(ints &ocsps)
{
 ocsps.clear();
 if (i420  && !(hwOverlay && hwDeinterlace)) ocsps.push_back(FF_CSP_420P|FF_CSP_FLAGS_YUV_ORDER);
 if (yv12  && !(hwOverlay && hwDeinterlace)) ocsps.push_back(FF_CSP_420P);
 if (yuy2  ) ocsps.push_back(FF_CSP_YUY2);
 if (yvyu  ) ocsps.push_back(FF_CSP_YVYU);
 if (uyvy  ) ocsps.push_back(FF_CSP_UYVY);
 if (nv12  ) ocsps.push_back(FF_CSP_NV12);
 if (rgb32 ) ocsps.push_back(FF_CSP_RGB32);
 if (rgb24 ) ocsps.push_back(FF_CSP_RGB24);
 if (rgb555) ocsps.push_back(FF_CSP_RGB15);
 if (rgb565) ocsps.push_back(FF_CSP_RGB16);
}

void ToutputVideoSettings::getOutputColorspaces(TcspInfos &ocsps)
{
 ints ocspsi;
 getOutputColorspaces(ocspsi);
 ocsps.clear();
 for (ints::const_iterator o=ocspsi.begin();o!=ocspsi.end();o++)
  ocsps.push_back(csp_getInfo(*o));
}

void ToutputVideoSettings::getDVsize(unsigned int *dx,unsigned int *dy) const
{
 switch (dvNorm)
  {
   case 0:pal:*dx=720;*dy=576;break;
   case 1:ntsc:*dx=720;*dy=480;break;
   case 2:
    {
     int dif1=sqr(*dx-720)+sqr(*dy-576);
     int dif2=sqr(*dx-720)+sqr(*dy-480);
     if (dif2<dif1) goto ntsc; else goto pal;
    }
  }
}

⌨️ 快捷键说明

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