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

📄 quant.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 3 页
字号:
      quantized_list[ZigZagPtr[0]] = ( val > 511 ) ? 511 : val;    } else if ( DCT_blockPtr[0] <= -FquantZBinSizePtr[0] ) {      temp = FquantCoeffsPtr[0] *        ( DCT_blockPtr[0] - FquantRoundPtr[0] ) + MIN16;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[0]] = ( val < -511 ) ? -511 : val;    }    /* Column 1 */    if ( DCT_blockPtr[1] >= FquantZBinSizePtr[1] ) {      temp = FquantCoeffsPtr[1] *        ( DCT_blockPtr[1] + FquantRoundPtr[1] ) ;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[1]] = ( val > 511 ) ? 511 : val;    } else if ( DCT_blockPtr[1] <= -FquantZBinSizePtr[1] ) {      temp = FquantCoeffsPtr[1] *        ( DCT_blockPtr[1] - FquantRoundPtr[1] ) + MIN16;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[1]] = ( val < -511 ) ? -511 : val;    }    /* Column 2 */    if ( DCT_blockPtr[2] >= FquantZBinSizePtr[2] ) {      temp = FquantCoeffsPtr[2] *        ( DCT_blockPtr[2] + FquantRoundPtr[2] ) ;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[2]] = ( val > 511 ) ? 511 : val;    } else if ( DCT_blockPtr[2] <= -FquantZBinSizePtr[2] ) {      temp = FquantCoeffsPtr[2] *        ( DCT_blockPtr[2] - FquantRoundPtr[2] ) + MIN16;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[2]] = ( val < -511 ) ? -511 : val;    }    /* Column 3 */    if ( DCT_blockPtr[3] >= FquantZBinSizePtr[3] ) {      temp = FquantCoeffsPtr[3] *        ( DCT_blockPtr[3] + FquantRoundPtr[3] ) ;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[3]] = ( val > 511 ) ? 511 : val;    } else if ( DCT_blockPtr[3] <= -FquantZBinSizePtr[3] ) {      temp = FquantCoeffsPtr[3] *        ( DCT_blockPtr[3] - FquantRoundPtr[3] ) + MIN16;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[3]] = ( val < -511 ) ? -511 : val;    }    /* Column 4 */    if ( DCT_blockPtr[4] >= FquantZBinSizePtr[4] ) {      temp = FquantCoeffsPtr[4] *        ( DCT_blockPtr[4] + FquantRoundPtr[4] ) ;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[4]] = ( val > 511 ) ? 511 : val;    } else if ( DCT_blockPtr[4] <= -FquantZBinSizePtr[4] ) {      temp = FquantCoeffsPtr[4] *        ( DCT_blockPtr[4] - FquantRoundPtr[4] ) + MIN16;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[4]] = ( val < -511 ) ? -511 : val;    }    /* Column 5 */    if ( DCT_blockPtr[5] >= FquantZBinSizePtr[5] ) {      temp = FquantCoeffsPtr[5] *        ( DCT_blockPtr[5] + FquantRoundPtr[5] ) ;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[5]] = ( val > 511 ) ? 511 : val;    } else if ( DCT_blockPtr[5] <= -FquantZBinSizePtr[5] ) {      temp = FquantCoeffsPtr[5] *        ( DCT_blockPtr[5] - FquantRoundPtr[5] ) + MIN16;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[5]] = ( val < -511 ) ? -511 : val;    }    /* Column 6 */    if ( DCT_blockPtr[6] >= FquantZBinSizePtr[6] ) {      temp = FquantCoeffsPtr[6] *        ( DCT_blockPtr[6] + FquantRoundPtr[6] ) ;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[6]] = ( val > 511 ) ? 511 : val;    } else if ( DCT_blockPtr[6] <= -FquantZBinSizePtr[6] ) {      temp = FquantCoeffsPtr[6] *        ( DCT_blockPtr[6] - FquantRoundPtr[6] ) + MIN16;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[6]] = ( val < -511 ) ? -511 : val;    }    /* Column 7 */    if ( DCT_blockPtr[7] >= FquantZBinSizePtr[7] ) {      temp = FquantCoeffsPtr[7] *        ( DCT_blockPtr[7] + FquantRoundPtr[7] ) ;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[7]] = ( val > 511 ) ? 511 : val;    } else if ( DCT_blockPtr[7] <= -FquantZBinSizePtr[7] ) {      temp = FquantCoeffsPtr[7] *        ( DCT_blockPtr[7] - FquantRoundPtr[7] ) + MIN16;      val = (Q_LIST_ENTRY) (temp>>16);      quantized_list[ZigZagPtr[7]] = ( val < -511 ) ? -511 : val;    }    FquantRoundPtr += 8;    FquantCoeffsPtr += 8;    FquantZBinSizePtr += 8;    DCT_blockPtr += 8;    ZigZagPtr += 8;  }}static void init_dequantizer ( PB_INSTANCE *pbi,                        ogg_uint32_t scale_factor,                        unsigned char  QIndex ){  int i, j;  Q_LIST_ENTRY * InterY_coeffs;  Q_LIST_ENTRY * InterU_coeffs;  Q_LIST_ENTRY * InterV_coeffs;  Q_LIST_ENTRY * Y_coeffs;  Q_LIST_ENTRY * U_coeffs;  Q_LIST_ENTRY * V_coeffs;  Q_LIST_ENTRY * DcScaleFactorTable;  InterY_coeffs = pbi->InterY_coeffs;  InterU_coeffs = pbi->InterU_coeffs;  InterV_coeffs = pbi->InterV_coeffs;  Y_coeffs = pbi->Y_coeffs;  U_coeffs = pbi->U_coeffs;  V_coeffs = pbi->V_coeffs;  DcScaleFactorTable = pbi->DcScaleFactorTable;  /* invert the dequant index into the quant index     the dxer has a different order than the cxer. */  BuildZigZagIndex(pbi);  /* Reorder dequantisation coefficients into dct zigzag order. */  for ( i = 0; i < BLOCK_SIZE; i++ ) {    j = pbi->zigzag_index[i];    pbi->dequant_Y_coeffs[j] = Y_coeffs[i];  }  for ( i = 0; i < BLOCK_SIZE; i++ ) {    j = pbi->zigzag_index[i];    pbi->dequant_U_coeffs[j] = U_coeffs[i];  }  for ( i = 0; i < BLOCK_SIZE; i++ ) {    j = pbi->zigzag_index[i];    pbi->dequant_V_coeffs[j] = V_coeffs[i];  }  for ( i = 0; i < BLOCK_SIZE; i++ ){    j = pbi->zigzag_index[i];    pbi->dequant_InterY_coeffs[j] = InterY_coeffs[i];  }  for ( i = 0; i < BLOCK_SIZE; i++ ){    j = pbi->zigzag_index[i];    pbi->dequant_InterU_coeffs[j] = InterU_coeffs[i];  }  for ( i = 0; i < BLOCK_SIZE; i++ ){    j = pbi->zigzag_index[i];    pbi->dequant_InterV_coeffs[j] = InterV_coeffs[i];  }  /* Intra Y DC coeff */  pbi->dequant_Y_coeffs[0] =    ((DcScaleFactorTable[QIndex] * pbi->dequant_Y_coeffs[0])/100);  if ( pbi->dequant_Y_coeffs[0] < MIN_DEQUANT_VAL * 2 )    pbi->dequant_Y_coeffs[0] = MIN_DEQUANT_VAL * 2;  pbi->dequant_Y_coeffs[0] =    pbi->dequant_Y_coeffs[0] << IDCT_SCALE_FACTOR;  /* Intra UV */  pbi->dequant_U_coeffs[0] =    ((DcScaleFactorTable[QIndex] * pbi->dequant_U_coeffs[0])/100);  if ( pbi->dequant_U_coeffs[0] < MIN_DEQUANT_VAL * 2 )    pbi->dequant_U_coeffs[0] = MIN_DEQUANT_VAL * 2;  pbi->dequant_U_coeffs[0] =    pbi->dequant_U_coeffs[0] << IDCT_SCALE_FACTOR;  pbi->dequant_V_coeffs[0] =    ((DcScaleFactorTable[QIndex] * pbi->dequant_V_coeffs[0])/100);  if ( pbi->dequant_V_coeffs[0] < MIN_DEQUANT_VAL * 2 )    pbi->dequant_V_coeffs[0] = MIN_DEQUANT_VAL * 2;  pbi->dequant_V_coeffs[0] =    pbi->dequant_V_coeffs[0] << IDCT_SCALE_FACTOR;  /* Inter Y DC coeff */  pbi->dequant_InterY_coeffs[0] =    ((DcScaleFactorTable[QIndex] * pbi->dequant_InterY_coeffs[0])/100);  if ( pbi->dequant_InterY_coeffs[0] < MIN_DEQUANT_VAL * 4 )    pbi->dequant_InterY_coeffs[0] = MIN_DEQUANT_VAL * 4;  pbi->dequant_InterY_coeffs[0] =    pbi->dequant_InterY_coeffs[0] << IDCT_SCALE_FACTOR;  /* Inter UV */  pbi->dequant_InterU_coeffs[0] =    ((DcScaleFactorTable[QIndex] * pbi->dequant_InterU_coeffs[0])/100);  if ( pbi->dequant_InterU_coeffs[0] < MIN_DEQUANT_VAL * 4 )    pbi->dequant_InterU_coeffs[0] = MIN_DEQUANT_VAL * 4;  pbi->dequant_InterU_coeffs[0] =    pbi->dequant_InterU_coeffs[0] << IDCT_SCALE_FACTOR;  pbi->dequant_InterV_coeffs[0] =    ((DcScaleFactorTable[QIndex] * pbi->dequant_InterV_coeffs[0])/100);  if ( pbi->dequant_InterV_coeffs[0] < MIN_DEQUANT_VAL * 4 )    pbi->dequant_InterV_coeffs[0] = MIN_DEQUANT_VAL * 4;  pbi->dequant_InterV_coeffs[0] =    pbi->dequant_InterV_coeffs[0] << IDCT_SCALE_FACTOR;  for ( i = 1; i < BLOCK_SIZE; i++ ){    /* now scale coefficients by required compression factor */    pbi->dequant_Y_coeffs[i] =      (( scale_factor * pbi->dequant_Y_coeffs[i] ) / 100);    if ( pbi->dequant_Y_coeffs[i] < MIN_DEQUANT_VAL )      pbi->dequant_Y_coeffs[i] = MIN_DEQUANT_VAL;    pbi->dequant_Y_coeffs[i] =      pbi->dequant_Y_coeffs[i] << IDCT_SCALE_FACTOR;    pbi->dequant_U_coeffs[i] =      (( scale_factor * pbi->dequant_U_coeffs[i] ) / 100);    if ( pbi->dequant_U_coeffs[i] < MIN_DEQUANT_VAL )      pbi->dequant_U_coeffs[i] = MIN_DEQUANT_VAL;    pbi->dequant_U_coeffs[i] =      pbi->dequant_U_coeffs[i] << IDCT_SCALE_FACTOR;    pbi->dequant_V_coeffs[i] =      (( scale_factor * pbi->dequant_V_coeffs[i] ) / 100);    if ( pbi->dequant_V_coeffs[i] < MIN_DEQUANT_VAL )      pbi->dequant_V_coeffs[i] = MIN_DEQUANT_VAL;    pbi->dequant_V_coeffs[i] =      pbi->dequant_V_coeffs[i] << IDCT_SCALE_FACTOR;    pbi->dequant_InterY_coeffs[i] =      (( scale_factor * pbi->dequant_InterY_coeffs[i] ) / 100);    if ( pbi->dequant_InterY_coeffs[i] < (MIN_DEQUANT_VAL * 2) )      pbi->dequant_InterY_coeffs[i] = MIN_DEQUANT_VAL * 2;    pbi->dequant_InterY_coeffs[i] =      pbi->dequant_InterY_coeffs[i] << IDCT_SCALE_FACTOR;    pbi->dequant_InterU_coeffs[i] =      (( scale_factor * pbi->dequant_InterU_coeffs[i] ) / 100);    if ( pbi->dequant_InterU_coeffs[i] < (MIN_DEQUANT_VAL * 2) )      pbi->dequant_InterU_coeffs[i] = MIN_DEQUANT_VAL * 2;    pbi->dequant_InterU_coeffs[i] =      pbi->dequant_InterU_coeffs[i] << IDCT_SCALE_FACTOR;    pbi->dequant_InterV_coeffs[i] =      (( scale_factor * pbi->dequant_InterV_coeffs[i] ) / 100);    if ( pbi->dequant_InterV_coeffs[i] < (MIN_DEQUANT_VAL * 2) )      pbi->dequant_InterV_coeffs[i] = MIN_DEQUANT_VAL * 2;    pbi->dequant_InterV_coeffs[i] =      pbi->dequant_InterV_coeffs[i] << IDCT_SCALE_FACTOR;  }  pbi->dequant_coeffs = pbi->dequant_Y_coeffs;}void UpdateQ( PB_INSTANCE *pbi, int NewQIndex ){  ogg_uint32_t qscale;  /* clamp to legal bounds */  if (NewQIndex >= Q_TABLE_SIZE) NewQIndex = Q_TABLE_SIZE - 1;  else if (NewQIndex < 0) NewQIndex = 0;  pbi->FrameQIndex = NewQIndex;  qscale = pbi->QThreshTable[NewQIndex];  pbi->ThisFrameQualityValue = qscale;  /* Re-initialise the Q tables for forward and reverse transforms. */  init_dequantizer ( pbi, qscale, (unsigned char) pbi->FrameQIndex );}void UpdateQC( CP_INSTANCE *cpi, ogg_uint32_t NewQ ){  ogg_uint32_t qscale;  PB_INSTANCE *pbi = &cpi->pb;  /* Do bounds checking and convert to a float.  */  qscale = NewQ;  if ( qscale < pbi->QThreshTable[Q_TABLE_SIZE-1] )    qscale = pbi->QThreshTable[Q_TABLE_SIZE-1];  else if ( qscale > pbi->QThreshTable[0] )    qscale = pbi->QThreshTable[0];  /* Set the inter/intra descision control variables. */  pbi->FrameQIndex = Q_TABLE_SIZE - 1;  while ((ogg_int32_t) pbi->FrameQIndex >= 0 ) {    if ( (pbi->FrameQIndex == 0) ||         ( pbi->QThreshTable[pbi->FrameQIndex] >= NewQ) )      break;    pbi->FrameQIndex --;  }  /* Re-initialise the Q tables for forward and reverse transforms. */  init_quantizer ( cpi, qscale, (unsigned char) pbi->FrameQIndex );  init_dequantizer ( pbi, qscale, (unsigned char) pbi->FrameQIndex );}

⌨️ 快捷键说明

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