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

📄 cquanttables.cpp

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  }
}

void TquantTablesPageBase::writeMatrix(FILE *f,const char *section,const uint8_t *matrix,unsigned int len)
{
 fprintf(f,"%s =\n",section);
 int cnt=ff_sqrt(len);
 for (int i=0;i<cnt;i++)
  {
   for (int j=0;j<cnt;j++)
    fprintf(f,"%i%s",int(*matrix++),--len>0?",":"");
   fprintf(f,"\n");
  }
 fprintf(f,"\n");
}

void TquantTablesPageBase::onSave(void)
{
 bool x264=codecId==CODEC_ID_X264 || codecId==CODEC_ID_H264;
 if (dlgGetFile(true,m_hwnd,_(-IDD_QUANT_TABLES,_l("Save quantization matrices")),x264?_l("JM matrices file (*.cfg)\0*.cfg\0All files (*.*)\0*.*"):_l("XviD quantization matrices file (*.xcm)\0*.xcm\0ffdshow quantization matrices file (*.qmatrix)\0*.qmatrix\0Custom quantization matrix (*.cqm)\0*.cqm\0All files (*.*)\0*.*\0"),x264?_l("*.cfg"):_l("*.xcm"),matrixflnm,firstdir?matrixdir:_l("."),0))
  {
   firstdir=false;
   FILE *f=fopen(matrixflnm,x264?_l("wt"):_l("wb"));
   if (f)
    {
      if (x264)
      {
       uint8_t *intra8,*inter8,*intra4Y,*inter4Y,*intra4C,*inter4C;getCustomQuantMatrixes(&intra8,&inter8,&intra4Y,&inter4Y,&intra4C,&inter4C);
      writeMatrix(f,"INTRA4X4_LUMA",intra4Y,16);
      writeMatrix(f,"INTRA4X4_CHROMAU",intra4C,16);
      writeMatrix(f,"INTRA4X4_CHROMAV",intra4C,16);
      writeMatrix(f,"INTER4X4_LUMA",inter4Y,16);
      writeMatrix(f,"INTER4X4_CHROMAU",inter4C,16);
      writeMatrix(f,"INTER4X4_CHROMAV",inter4C,16);
      writeMatrix(f,"INTRA8X8_LUMA",intra8,64);
      writeMatrix(f,"INTER8X8_LUMA",inter8,64);
      }
      else
      {
       uint8_t *qmatrix_intra_custom,*qmatrix_inter_custom;getCustomQuantMatrixes(&qmatrix_intra_custom,&qmatrix_inter_custom,NULL,NULL,NULL,NULL);
       if (qmatrix_intra_custom || qmatrix_inter_custom)
        {
         fwrite(qmatrix_intra_custom?qmatrix_intra_custom:qmatrix_inter_custom,1,64,f);
         fwrite(qmatrix_inter_custom?qmatrix_inter_custom:qmatrix_intra_custom,1,64,f);
        }
      }
     fclose(f);
    }
   else
    err(_(-IDD_QUANT_TABLES,_l("Error while saving quantization matrices")));
  }
}

INT_PTR TquantTablesPageBase::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 switch (uMsg)
  {
   case WM_COMMAND:
    if (HIWORD(wParam)==EN_CHANGE && !isSetWindowText)
     {
      HWND hed=GetDlgItem(m_hwnd,LOWORD(wParam));
      if (hed!=GetFocus()) return FALSE;
      repaint(hed);
      TwidgetMatrix *item=(TwidgetMatrix*)Twidget::getDlgItem(hed);
      if (item->id)
       {
        int valI;
        if (eval(hed,1,255,&valI))
         {
          uint8_t *intra8,*inter8,*intra4Y,*inter4Y,*intra4C,*inter4C;getCustomQuantMatrixes(&intra8,&inter8,&intra4Y,&inter4Y,&intra4C,&inter4C);
          uint8_t *intra,*inter;
          switch (cbxGetCurSel(IDC_CBX_QUANT_TABLE))
           {
            case 1:intra=intra4Y;inter=inter4Y;break;
            case 2:intra=intra4C;inter=inter4C;break;
            default:intra=intra8;inter=inter8;break;
           }
          (item->intra?intra:inter)[item->id-1]=(uint8_t)valI;
          setChange();
         }
       }
      return TRUE;
     }
    break;
   case WM_CTLCOLOREDIT:
    {
     HWND hwnd=HWND(lParam);
     if (hwnd==GetDlgItem(m_hwnd,IDC_CBX_QUANT_TABLE)) break;
     bool ok=eval(hwnd,1,255);
     if (!ok)
      {
       HDC dc=HDC(wParam);
       SetBkColor(dc,RGB(255,0,0));
       return INT_PTR(getRed());
      }
     else return FALSE;
    }
  }
 return Twindow::msgProc(uMsg,wParam,lParam);
}

Twidget* TquantTablesPageBase::createDlgItem(int id,HWND h)
{
 char_t cls[256]=_l("");
 GetClassName(h,cls,256);
 if (stricmp(cls,_l("EDIT"))==0)
  return new TwidgetMatrix(h,this);
 else
  return Twindow::createDlgItem(id,h);
}

void TquantTablesPageBase::translate(void)
{
 Twindow::translate();

 int sel=cbxGetCurSel(IDC_CBX_QUANT_TABLE);
 cbxClear(IDC_CBX_QUANT_TABLE);
 for (int i=0;matrices[i];i++)
  cbxAdd(IDC_CBX_QUANT_TABLE,_(IDC_CBX_QUANT_TABLE,matrices[i]));
 cbxSetCurSel(IDC_CBX_QUANT_TABLE,sel==CB_ERR?0:sel);
}

//============================================ TquantTablesPage ============================================
bool TquantTablesPage::enabled(void)
{
 return sup_customQuantTables(codecId) && cfgGet(IDFF_enc_quant_type)==QUANT::CUSTOM;
}

TquantTablesPage::TquantTablesPage(TffdshowPageEnc *Iparent):TconfPageEnc(Iparent),base(new TquantTables(Iparent->deci))
{
 dialogId=IDD_QUANT_TABLES;
 static const int props[]={IDFF_enc_qmatrix_intra_custom0,IDFF_enc_qmatrix_intra_custom1,IDFF_enc_qmatrix_intra_custom2,IDFF_enc_qmatrix_intra_custom3,IDFF_enc_qmatrix_intra_custom4,IDFF_enc_qmatrix_intra_custom5,IDFF_enc_qmatrix_intra_custom6,IDFF_enc_qmatrix_intra_custom7,IDFF_enc_qmatrix_intra_custom8,IDFF_enc_qmatrix_intra_custom9,IDFF_enc_qmatrix_intra_custom10,IDFF_enc_qmatrix_intra_custom11,IDFF_enc_qmatrix_intra_custom12,IDFF_enc_qmatrix_intra_custom13,IDFF_enc_qmatrix_intra_custom14,IDFF_enc_qmatrix_intra_custom15,IDFF_enc_qmatrix_inter_custom0,IDFF_enc_qmatrix_inter_custom1,IDFF_enc_qmatrix_inter_custom2,IDFF_enc_qmatrix_inter_custom3,IDFF_enc_qmatrix_inter_custom4,IDFF_enc_qmatrix_inter_custom5,IDFF_enc_qmatrix_inter_custom6,IDFF_enc_qmatrix_inter_custom7,IDFF_enc_qmatrix_inter_custom8,IDFF_enc_qmatrix_inter_custom9,IDFF_enc_qmatrix_inter_custom10,IDFF_enc_qmatrix_inter_custom11,IDFF_enc_qmatrix_inter_custom12,IDFF_enc_qmatrix_inter_custom13,IDFF_enc_qmatrix_inter_custom14,IDFF_enc_qmatrix_inter_custom15,IDFF_enc_qmatrix_intra4x4Y_custom0,IDFF_enc_qmatrix_intra4x4Y_custom1,IDFF_enc_qmatrix_intra4x4Y_custom2,IDFF_enc_qmatrix_intra4x4Y_custom3,IDFF_enc_qmatrix_inter4x4Y_custom0,IDFF_enc_qmatrix_inter4x4Y_custom1,IDFF_enc_qmatrix_inter4x4Y_custom2,IDFF_enc_qmatrix_inter4x4Y_custom3,IDFF_enc_qmatrix_intra4x4C_custom0,IDFF_enc_qmatrix_intra4x4C_custom1,IDFF_enc_qmatrix_intra4x4C_custom2,IDFF_enc_qmatrix_intra4x4C_custom3,IDFF_enc_qmatrix_inter4x4C_custom0,IDFF_enc_qmatrix_inter4x4C_custom1,IDFF_enc_qmatrix_inter4x4C_custom2,IDFF_enc_qmatrix_inter4x4C_custom3,0};
 propsIDs=props;
 base->deciE=deciE;base->parent=parent;
}
TquantTablesPage::~TquantTablesPage()
{
 delete base;
}

void TquantTablesPage::init(void)
{
 base->create(m_hwnd);
}
void TquantTablesPage::cfg2dlg(void)
{
 base->cfg2dlg();
}
void TquantTablesPage::translate(void)
{
 TconfPageEnc::translate();
 base->translate();
}

int TquantTablesPage::TquantTables::getCodecId(void)
{
 return cfgGet(IDFF_enc_codecId);
}
HRESULT TquantTablesPage::TquantTables::getCustomQuantMatrixes(uint8_t* *intra8,uint8_t* *inter8,uint8_t* *intra4Y,uint8_t* *inter4Y,uint8_t* *intra4C,uint8_t* *inter4C)
{
 return deciE->getCustomQuantMatrixes(intra8,inter8,intra4Y,inter4Y,intra4C,inter4C);
}
void TquantTablesPage::TquantTables::setChange(void)
{
 parent->setChange();
}

//============================================ TcurrentQuantDlg ============================================
TcurrentQuantDlg::TcurrentQuantDlg(HWND IhParent,IffdshowBase *Ideci,uint8_t *Iinter,uint8_t *Iintra,uint8_t *inter4luma,uint8_t *inter4chroma,uint8_t *intra4luma,uint8_t *intra4chroma,TquantTables *Ibase):
 TdlgWindow(IDD_QUANT_CURRENT,Ideci),
 base(Ibase?Ibase:new TquantTables(Ideci,Iinter,Iintra,inter4luma,inter4chroma,intra4luma,intra4chroma)),
 hParent(IhParent)
{
}
TcurrentQuantDlg::~TcurrentQuantDlg()
{
 delete base;
}
void TcurrentQuantDlg::show(void)
{
 dialogBox(dialogId,hParent);
}
void TcurrentQuantDlg::init(void)
{
 base->create(m_hwnd);
 translate();
 base->cfg2dlg();
}
void TcurrentQuantDlg::translate(void)
{
 TdlgWindow::translate();
 base->translate();
}

INT_PTR TcurrentQuantDlg::msgProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 switch (uMsg)
  {
   case WM_COMMAND:
    switch (LOWORD(wParam))
     {
      case IDCLOSE:
      case IDCANCEL:
       EndDialog(m_hwnd,LOWORD(wParam));
       return TRUE;
     }
    break;
  }
 return TdlgWindow::msgProc(uMsg,wParam,lParam);
}

TcurrentQuantDlg::TquantTables::TquantTables(IffdshowBase *Ideci,uint8_t *Iinter,uint8_t *Iintra,uint8_t *Iinter4luma,uint8_t *Iinter4chroma,uint8_t *Iintra4luma,uint8_t *Iintra4chroma):
 inter(Iinter),intra(Iintra),inter4luma(Iinter4luma),inter4chroma(Iinter4chroma),intra4luma(Iintra4luma),intra4chroma(Iintra4chroma),
 TquantTablesPageBase(Ideci)
{
}
int TcurrentQuantDlg::TquantTables::getCodecId(void)
{
 return deci->getCurrentCodecId2();
}
HRESULT TcurrentQuantDlg::TquantTables::getCustomQuantMatrixes(uint8_t* *intra8,uint8_t* *inter8,uint8_t* *intra4Y,uint8_t* *inter4Y,uint8_t* *intra4C,uint8_t* *inter4C)
{
 if (intra8) *intra8=intra;
 if (inter8) *inter8=inter;
 if (intra4C) *intra4C=intra4chroma;
 if (intra4Y) *intra4Y=intra4luma;
 if (inter4C) *inter4C=inter4chroma;
 if (inter4Y) *inter4Y=inter4luma;
 return S_OK;
}
void TcurrentQuantDlg::TquantTables::cfg2dlg(void)
{
 TquantTablesPageBase::cfg2dlg();
 enable(0,IDC_BT_QUANT_TABLE_LOAD);
 for (int i=0;idIntra8[i];i++)
  edReadOnly(idIntra8[i],true);
 for (int i=0;idInter8[i];i++)
  edReadOnly(idInter8[i],true);
}

//============================================== TdctQuantDlg ==============================================
const int TdctQuantDlg::idffs[16]={IDFF_dctMatrix0,IDFF_dctMatrix1,IDFF_dctMatrix2,IDFF_dctMatrix3,IDFF_dctMatrix4,IDFF_dctMatrix5,IDFF_dctMatrix6,IDFF_dctMatrix7,IDFF_dctMatrix8,IDFF_dctMatrix9,IDFF_dctMatrix10,IDFF_dctMatrix11,IDFF_dctMatrix12,IDFF_dctMatrix13,IDFF_dctMatrix14,IDFF_dctMatrix15};

TdctQuantDlg::TdctQuantDlg(HWND hParent,IffdshowBase *Ideci):TcurrentQuantDlg(hParent,Ideci,NULL,NULL,NULL,NULL,NULL,NULL,new TdctQuantTables(Ideci,inter,NULL))
{
 uint8_t *m=inter;
 for (int i=0;i<16;i++,m+=4)
  {
   int32_t val=cfgGet(idffs[i]);
   memcpy(m,&val,sizeof(val));
  }
}

TdctQuantDlg::TdctQuantTables::TdctQuantTables(IffdshowBase *Ideci,uint8_t *Iinter,uint8_t *Iintra):TquantTables(Ideci,Iinter,Iintra,NULL,NULL,NULL,NULL)
{
}
void TdctQuantDlg::TdctQuantTables::cfg2dlg(void)
{
 TquantTablesPageBase::cfg2dlg();
}
void TdctQuantDlg::TdctQuantTables::setChange(void)
{
 uint8_t *m=inter;
 for (int i=0;i<16;i++,m+=4)
  {
   int32_t val;
   memcpy(&val,m,sizeof(val));
   cfgSet(idffs[i],val);
  }
}

⌨️ 快捷键说明

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