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

📄 cquanttables.cpp

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

//========================================== TquantTablesPageBase ==========================================
const char_t* TquantTablesPageBase::matrices[]=
{
 _l("8x8"),
 _l("4x4 luma"),
 _l("4x4 chroma"),
 NULL
};

const int TquantTablesPageBase::idIntra8[]=
{
 IDC_ED_QUANT_TABLE_INTRA1 ,IDC_ED_QUANT_TABLE_INTRA2 ,IDC_ED_QUANT_TABLE_INTRA3 ,IDC_ED_QUANT_TABLE_INTRA4 ,IDC_ED_QUANT_TABLE_INTRA5 ,IDC_ED_QUANT_TABLE_INTRA6 ,IDC_ED_QUANT_TABLE_INTRA7 ,IDC_ED_QUANT_TABLE_INTRA8 ,
 IDC_ED_QUANT_TABLE_INTRA9 ,IDC_ED_QUANT_TABLE_INTRA10,IDC_ED_QUANT_TABLE_INTRA11,IDC_ED_QUANT_TABLE_INTRA12,IDC_ED_QUANT_TABLE_INTRA13,IDC_ED_QUANT_TABLE_INTRA14,IDC_ED_QUANT_TABLE_INTRA15,IDC_ED_QUANT_TABLE_INTRA16,
 IDC_ED_QUANT_TABLE_INTRA17,IDC_ED_QUANT_TABLE_INTRA18,IDC_ED_QUANT_TABLE_INTRA19,IDC_ED_QUANT_TABLE_INTRA20,IDC_ED_QUANT_TABLE_INTRA21,IDC_ED_QUANT_TABLE_INTRA22,IDC_ED_QUANT_TABLE_INTRA23,IDC_ED_QUANT_TABLE_INTRA24,
 IDC_ED_QUANT_TABLE_INTRA25,IDC_ED_QUANT_TABLE_INTRA26,IDC_ED_QUANT_TABLE_INTRA27,IDC_ED_QUANT_TABLE_INTRA28,IDC_ED_QUANT_TABLE_INTRA29,IDC_ED_QUANT_TABLE_INTRA30,IDC_ED_QUANT_TABLE_INTRA31,IDC_ED_QUANT_TABLE_INTRA32,
 IDC_ED_QUANT_TABLE_INTRA33,IDC_ED_QUANT_TABLE_INTRA34,IDC_ED_QUANT_TABLE_INTRA35,IDC_ED_QUANT_TABLE_INTRA36,IDC_ED_QUANT_TABLE_INTRA37,IDC_ED_QUANT_TABLE_INTRA38,IDC_ED_QUANT_TABLE_INTRA39,IDC_ED_QUANT_TABLE_INTRA40,
 IDC_ED_QUANT_TABLE_INTRA41,IDC_ED_QUANT_TABLE_INTRA42,IDC_ED_QUANT_TABLE_INTRA43,IDC_ED_QUANT_TABLE_INTRA44,IDC_ED_QUANT_TABLE_INTRA45,IDC_ED_QUANT_TABLE_INTRA46,IDC_ED_QUANT_TABLE_INTRA47,IDC_ED_QUANT_TABLE_INTRA48,
 IDC_ED_QUANT_TABLE_INTRA49,IDC_ED_QUANT_TABLE_INTRA50,IDC_ED_QUANT_TABLE_INTRA51,IDC_ED_QUANT_TABLE_INTRA52,IDC_ED_QUANT_TABLE_INTRA53,IDC_ED_QUANT_TABLE_INTRA54,IDC_ED_QUANT_TABLE_INTRA55,IDC_ED_QUANT_TABLE_INTRA56,
 IDC_ED_QUANT_TABLE_INTRA57,IDC_ED_QUANT_TABLE_INTRA58,IDC_ED_QUANT_TABLE_INTRA59,IDC_ED_QUANT_TABLE_INTRA60,IDC_ED_QUANT_TABLE_INTRA61,IDC_ED_QUANT_TABLE_INTRA62,IDC_ED_QUANT_TABLE_INTRA63,IDC_ED_QUANT_TABLE_INTRA64,0
};
const int TquantTablesPageBase::idInter8[]=
{
 IDC_ED_QUANT_TABLE_INTER1 ,IDC_ED_QUANT_TABLE_INTER2 ,IDC_ED_QUANT_TABLE_INTER3 ,IDC_ED_QUANT_TABLE_INTER4 ,IDC_ED_QUANT_TABLE_INTER5 ,IDC_ED_QUANT_TABLE_INTER6 ,IDC_ED_QUANT_TABLE_INTER7 ,IDC_ED_QUANT_TABLE_INTER8 ,
 IDC_ED_QUANT_TABLE_INTER9 ,IDC_ED_QUANT_TABLE_INTER10,IDC_ED_QUANT_TABLE_INTER11,IDC_ED_QUANT_TABLE_INTER12,IDC_ED_QUANT_TABLE_INTER13,IDC_ED_QUANT_TABLE_INTER14,IDC_ED_QUANT_TABLE_INTER15,IDC_ED_QUANT_TABLE_INTER16,
 IDC_ED_QUANT_TABLE_INTER17,IDC_ED_QUANT_TABLE_INTER18,IDC_ED_QUANT_TABLE_INTER19,IDC_ED_QUANT_TABLE_INTER20,IDC_ED_QUANT_TABLE_INTER21,IDC_ED_QUANT_TABLE_INTER22,IDC_ED_QUANT_TABLE_INTER23,IDC_ED_QUANT_TABLE_INTER24,
 IDC_ED_QUANT_TABLE_INTER25,IDC_ED_QUANT_TABLE_INTER26,IDC_ED_QUANT_TABLE_INTER27,IDC_ED_QUANT_TABLE_INTER28,IDC_ED_QUANT_TABLE_INTER29,IDC_ED_QUANT_TABLE_INTER30,IDC_ED_QUANT_TABLE_INTER31,IDC_ED_QUANT_TABLE_INTER32,
 IDC_ED_QUANT_TABLE_INTER33,IDC_ED_QUANT_TABLE_INTER34,IDC_ED_QUANT_TABLE_INTER35,IDC_ED_QUANT_TABLE_INTER36,IDC_ED_QUANT_TABLE_INTER37,IDC_ED_QUANT_TABLE_INTER38,IDC_ED_QUANT_TABLE_INTER39,IDC_ED_QUANT_TABLE_INTER40,
 IDC_ED_QUANT_TABLE_INTER41,IDC_ED_QUANT_TABLE_INTER42,IDC_ED_QUANT_TABLE_INTER43,IDC_ED_QUANT_TABLE_INTER44,IDC_ED_QUANT_TABLE_INTER45,IDC_ED_QUANT_TABLE_INTER46,IDC_ED_QUANT_TABLE_INTER47,IDC_ED_QUANT_TABLE_INTER48,
 IDC_ED_QUANT_TABLE_INTER49,IDC_ED_QUANT_TABLE_INTER50,IDC_ED_QUANT_TABLE_INTER51,IDC_ED_QUANT_TABLE_INTER52,IDC_ED_QUANT_TABLE_INTER53,IDC_ED_QUANT_TABLE_INTER54,IDC_ED_QUANT_TABLE_INTER55,IDC_ED_QUANT_TABLE_INTER56,
 IDC_ED_QUANT_TABLE_INTER57,IDC_ED_QUANT_TABLE_INTER58,IDC_ED_QUANT_TABLE_INTER59,IDC_ED_QUANT_TABLE_INTER60,IDC_ED_QUANT_TABLE_INTER61,IDC_ED_QUANT_TABLE_INTER62,IDC_ED_QUANT_TABLE_INTER63,IDC_ED_QUANT_TABLE_INTER64,0
};

const int TquantTablesPageBase::idIntra4[]=
{
 IDC_ED_QUANT_TABLE_INTRA1 ,IDC_ED_QUANT_TABLE_INTRA2 ,IDC_ED_QUANT_TABLE_INTRA3 ,IDC_ED_QUANT_TABLE_INTRA4 ,
 IDC_ED_QUANT_TABLE_INTRA9 ,IDC_ED_QUANT_TABLE_INTRA10,IDC_ED_QUANT_TABLE_INTRA11,IDC_ED_QUANT_TABLE_INTRA12,
 IDC_ED_QUANT_TABLE_INTRA17,IDC_ED_QUANT_TABLE_INTRA18,IDC_ED_QUANT_TABLE_INTRA19,IDC_ED_QUANT_TABLE_INTRA20,
 IDC_ED_QUANT_TABLE_INTRA25,IDC_ED_QUANT_TABLE_INTRA26,IDC_ED_QUANT_TABLE_INTRA27,IDC_ED_QUANT_TABLE_INTRA28,0
};
const int TquantTablesPageBase::idInter4[]=
{
 IDC_ED_QUANT_TABLE_INTER1 ,IDC_ED_QUANT_TABLE_INTER2 ,IDC_ED_QUANT_TABLE_INTER3 ,IDC_ED_QUANT_TABLE_INTER4 ,
 IDC_ED_QUANT_TABLE_INTER9 ,IDC_ED_QUANT_TABLE_INTER10,IDC_ED_QUANT_TABLE_INTER11,IDC_ED_QUANT_TABLE_INTER12,
 IDC_ED_QUANT_TABLE_INTER17,IDC_ED_QUANT_TABLE_INTER18,IDC_ED_QUANT_TABLE_INTER19,IDC_ED_QUANT_TABLE_INTER20,
 IDC_ED_QUANT_TABLE_INTER25,IDC_ED_QUANT_TABLE_INTER26,IDC_ED_QUANT_TABLE_INTER27,IDC_ED_QUANT_TABLE_INTER28,0
};

TquantTablesPageBase::TquantTablesPageBase(IffdshowBase *Ideci):Twindow(Ideci)
{
 dialogId=IDD_QUANT_TABLES_BASE;
 static const TbindButton<TquantTablesPageBase> bt[]=
  {
   IDC_BT_QUANT_TABLE_LOAD,&TquantTablesPageBase::onLoad,
   IDC_BT_QUANT_TABLE_SAVE,&TquantTablesPageBase::onSave,
   0,NULL
  };
 bindButtons(bt);
 static const TbindCombobox<TquantTablesPageBase> cbx[]=
  {
   IDC_CBX_QUANT_TABLE,0,BINDCBX_NONE,&TquantTablesPageBase::table2dlg,
   0
  };
 bindComboboxes(cbx);
}

void TquantTablesPageBase::create(HWND parent)
{
 createDialog(dialogId,parent);SetParent(m_hwnd,parent);
 setPos(0,0);
 show(true);
 matrixflnm[0]='\0';
 _makepath(matrixdir,NULL,config->pth,_l("custom matrices"),NULL);
 firstdir=true;
}

void TquantTablesPageBase::cfg2dlg(void)
{
 codecId=getCodecId();
   if (codecId==CODEC_ID_X264 || codecId==CODEC_ID_H264)
    enable(1,IDC_CBX_QUANT_TABLE);
   else
    {
    enable(0,IDC_CBX_QUANT_TABLE);
    cbxSetCurSel(IDC_CBX_QUANT_TABLE,0);
    }
    table2dlg();
}

void TquantTablesPageBase::table2dlg(void)
{
 uint8_t *intra8,*inter8,*intra4Y,*inter4Y,*intra4C,*inter4C;getCustomQuantMatrixes(&intra8,&inter8,&intra4Y,&inter4Y,&intra4C,&inter4C);
 const int *idIntra,*idInter;uint8_t *intra,*inter;int cnt;
 switch (cbxGetCurSel(IDC_CBX_QUANT_TABLE))
  {
   case 1:idIntra=idIntra4;idInter=idInter4;intra=intra4Y;inter=inter4Y;cnt=16;break;
   case 2:idIntra=idIntra4;idInter=idInter4;intra=intra4C;inter=inter4C;cnt=16;break;
   default:idIntra=idIntra8;idInter=idInter8;intra=intra8;inter=inter8;cnt=64;break;
  }
 enable(0,idIntra8);
 enable(0,idInter8);
 for (int i=0;i<cnt;i++)
  {
   if (intra)
    {
     edLimitText(idIntra[i],3);
     SetDlgItemInt(m_hwnd,idIntra[i],intra[i],FALSE);
     ((TwidgetMatrix*)Twidget::getDlgItem(GetDlgItem(m_hwnd,idIntra[i])))->set(true ,i+1);
    }
   else
    edReadOnly(idIntra[i],true);
   if (inter)
    {
     edLimitText(idInter[i],3);
     SetDlgItemInt(m_hwnd,idInter[i],inter[i],FALSE);
     ((TwidgetMatrix*)Twidget::getDlgItem(GetDlgItem(m_hwnd,idInter[i])))->set(false,i+1);
    }
   else
    edReadOnly(idInter[i],true);
  }
 enable(1,cnt==64?idIntra8:idIntra4);
 enable(1,cnt==64?idInter8:idInter4);
 enable(codecId==CODEC_ID_X264 || codecId==CODEC_ID_H264,IDC_ED_QUANT_TABLE_INTRA1);
}


const char_t* TquantTablesPageBase::parse_jmlist(char_t *buf,const char_t *name,uint8_t *cqm,const uint8_t *jvt,int length)
{
 char_t *p=strstr(buf,name);
 if (!p)
  {
   memset(cqm,16,length);
   return NULL;
  }

 p+=strlen( name );
 if (*p=='U' || *p=='V')
  p++;

 char_t *nextvar=strstr(p,_l("INT"));
 int i;
 for(i=0;i<length && (p=strpbrk(p,_l(" \t\n,") ))!=NULL && (p=strpbrk(p,_l("0123456789")))!=NULL;i++)
  {
   int coef=-1;
   tsscanf(p,_l("%d"),&coef);
   if (i==0 && coef==0)
    {
     memcpy(cqm,jvt,length);
     return NULL;
    }
   if (coef<1 || coef>255)
    return _l("Bad coefficient in list.");
   cqm[i]=(uint8_t)coef;
  }
 if ((nextvar && p>nextvar) || i!=length)
  return _l("Not enough coefficients in list.");
 return NULL;
}

void TquantTablesPageBase::onLoad(void)
{
 bool x264=codecId==CODEC_ID_X264 || codecId==CODEC_ID_H264;
 if (dlgGetFile(false,m_hwnd,_(-IDD_QUANT_TABLES,_l("Load quantization matrices")),x264?_l("JM matrices file (*.cfg)\0*.cfg\0All files (*.*)\0*.*"):_l("All matrix files (*.xcm;*.qmatrix;*.cqm;*.txt)\0*.xcm;*.qmatrix;*.txt\0XviD quantization matrices file (*.xcm)\0*.xcm\0ffdshow quantization matrices file (*.qmatrix;*.txt)\0*.qmatrix;*.txt\0Custom quantization matrix (*.cqm)\0*.cqm\0All files (*.*)\0*.*\0"),x264?_l("*.cfg"):_l("*.xcm"),matrixflnm,firstdir?matrixdir:_l("."),0))
  {
   firstdir=false;
   const char_t *error=NULL;size_t readed=0;
 if (x264)
  {
  char_t *buf=readTextFile(matrixflnm);
  if (buf)
   {
    static const uint8_t jvt4i[16] =
    {
    6,13,20,28,
    13,20,28,32,
    20,28,32,37,
    28,32,37,42
    };
    static const uint8_t jvt4p[16] =
    {
    10,14,20,24,
    14,20,24,27,
    20,24,27,30,
    24,27,30,34
    };
    static const uint8_t jvt8i[64] =
    {
    6,10,13,16,18,23,25,27,
    10,11,16,18,23,25,27,29,
    13,16,18,23,25,27,29,31,
    16,18,23,25,27,29,31,33,
    18,23,25,27,29,31,33,36,
    23,25,27,29,31,33,36,38,
    25,27,29,31,33,36,38,40,
    27,29,31,33,36,38,40,42
    };
    static const uint8_t jvt8p[64] =
    {
    9,13,15,17,19,21,22,24,
    13,13,17,19,21,22,24,25,
    15,17,19,21,22,24,25,27,
    17,19,21,22,24,25,27,28,
    19,21,22,24,25,27,28,30,
    21,22,24,25,27,28,30,32,
    22,24,25,27,28,30,32,33,
    24,25,27,28,30,32,33,35
    };
    uint8_t *intra8,*inter8,*intra4Y,*inter4Y,*intra4C,*inter4C;getCustomQuantMatrixes(&intra8,&inter8,&intra4Y,&inter4Y,&intra4C,&inter4C);
    if ((error=parse_jmlist(buf,_l("INTRA4X4_LUMA")  ,intra4Y,jvt4i,16))==NULL)
    if ((error=parse_jmlist(buf,_l("INTRA4X4_CHROMA"),intra4C,jvt4i,16))==NULL)
    if ((error=parse_jmlist(buf,_l("INTER4X4_LUMA")  ,inter4Y,jvt4p,16))==NULL)
    if ((error=parse_jmlist(buf,_l("INTER4X4_CHROMA"),inter4C,jvt4p,16))==NULL)
    if ((error=parse_jmlist(buf,_l("INTRA8X8_LUMA")  ,intra8,jvt8i,64))==NULL)
    if ((error=parse_jmlist(buf,_l("INTER8X8_LUMA")  ,inter8,jvt8p,64))==NULL)
    readed=1;
    free(buf);
    }
   }
   else
   {
    FILE *f=fopen(matrixflnm,x264?_l("rt"):_l("rb"));
     if (f)
      {
       uint8_t *qmatrix_intra_custom,*qmatrix_inter_custom;getCustomQuantMatrixes(&qmatrix_intra_custom,&qmatrix_inter_custom,NULL,NULL,NULL,NULL);
       if (qmatrix_intra_custom)
        readed+=fread(qmatrix_intra_custom,1,64,f);
       else
        {
         fseek(f,64,SEEK_CUR);
         readed+=64;
        }
       if (qmatrix_inter_custom)
        readed+=fread(qmatrix_inter_custom,1,64,f);
       else
        {
         fseek(f,64,SEEK_CUR);
         readed+=64;
        }
       fclose(f);
       if (readed!=128)
        error=_l("Error while loading quantization matrices");
      }
    }
   if (error)
    err(_(-IDD_QUANT_TABLES,error));
   else
    {
     if (readed)
      setChange();
     cfg2dlg();
    }

⌨️ 快捷键说明

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