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

📄 umc_mpeg2_dec_blk.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      }

      i++;
      UNPACK_VLC2(tbl, run, val, len);

      i += run;
      i &= 63;
      j = scanMatrix[i];
      val = (val*(quant*pQuantMatrix[j])) >> 4;
      sign = SHBITS(code << len, 1);
      APPLY_SIGN(val, sign);
      SKIP_BITS(BS, (len + 1));
      pDstBlock[j] = val;
#ifdef MISMATCH_INTRA
      mask ^= val;
#endif
      SHOW_HI9BITS(BS, code);
    }
#ifdef MISMATCH_INTRA
    pDstBlock[63] ^= mask & 1;
#endif
    SKIP_BITS(BS, 2);
    COPY_BITSTREAM(*BitStream, BS)
  }

  IDCT_INTRA(pDstBlock, i, idct, pDst, dstStep);

  return ippStsOk;
}

/********************************************************************/

MP2_FUNC(IppStatus, ippiDecodeInter8x8IDCTAdd_MPEG1_1u8u, (
    Ipp8u**                            BitStream_curr_ptr,
    Ipp32s*                            BitStream_bit_offset,
    IppiDecodeInterSpec_MPEG2*         pQuantSpec,
    Ipp32s                             quant,
    Ipp8u*                             pSrcDst,
    Ipp32s                             srcDstStep))
{
  DEF_VARS();

  COPY_BITSTREAM(BS, *BitStream)

  if (!pQuantMatrix) pQuantMatrix = Qmatrix;

  SHOW_HI9BITS(BS, code);

  if (code & 0x80000000) { /* first 2-bit code */
    val = (3*quant*pQuantMatrix[0]) >> 4;
    val = (val - 1) | 1;
    sign = SHBITS(code + code, 1);
    APPLY_SIGN(val, sign);

    for (k = 0; k < 64; k++) {
      pDstBlock[k] = 0;
    }
    pDstBlock[0] = val;

    SKIP_BITS(BS, 2);
    SHOW_HI9BITS(BS, code);
    i = 0;
  } else {
    for (k = 0; k < 64; k++) {
      pDstBlock[k] = 0;
    }
    i = -1;
  }

  for (;;) {
    if ((code & 0xc0000000) == 0x80000000) {
      break;
    } else if (code >= 0x08000000) {
      tbl = MPEG2_VLC_TAB1[UHBITS(code - 0x08000000, 8)];
common:
      i++;
      UNPACK_VLC1(tbl, run, val, len)

      i += run;
      i &= 63;
      j = scanMatrix[i];
      val = (val * (quant*pQuantMatrix[j])) >> 4;
      val = (val - 1) | 1;
      sign = SHBITS(code << len, 1);
      APPLY_SIGN(val, sign);

      SKIP_BITS(BS, (len + 1));
      pDstBlock[j] = val;
      SHOW_HI9BITS(BS, code);
      continue;
    } else if (code >= 0x04000000) {
      EXPAND_17BITS(BS, code);
      i += 1 + UHBITS (code << 6, 6);
      i &= 63;
      j = scanMatrix[i];

      SKIP_BITS(BS, 12);
      GET_TO9BITS(BS, 8, val);
      val = (Ipp8s)val;
      if (!(val & 0x7f))
      {
        Ipp32s val2;
        GET_TO9BITS(BS, 8, val2);
        val = 2*val + val2;
      }
      sign = SHBITS(val, 1);
      val = 2*(val + sign) + 1;
      val = (val * (quant*pQuantMatrix[j])) / 16;
      val = (val + ~sign) | 1;

      SAT(val)
      pDstBlock[j] = val;

      SHOW_HI9BITS(BS, code);
      continue;
    } else {
      EXPAND_17BITS(BS, code);
      if (code >= 0x00800000) {
        tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_10BIT + UHBITS(code, 13)];
        goto common;
      } else if (code >= 0x00200000) {
        tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_15BIT + UHBITS(code, 15)];
        goto common;
      } else {
        tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_16BIT + UHBITS(code, 16)];
        if (code < 16)
          return ippStsVLCErr;
        code <<= 16;
        SKIP_BITS(BS, 16);
        goto common;
      }
    }
  }

  SKIP_BITS(BS, 2);
  COPY_BITSTREAM(*BitStream, BS)

  IDCT_INTER(pDstBlock, i, idct, pSrcDst, srcDstStep);

  return ippStsOk;
}

MP2_FUNC(IppStatus, ippiDecodeIntra8x8IDCT_MPEG1_1u8u, (
    Ipp8u**                            BitStream_curr_ptr,
    Ipp32s*                            BitStream_bit_offset,
    IppiDecodeIntraSpec_MPEG2*         pQuantSpec,
    Ipp32s                             quant,
    Ipp32s                             blockType,
    Ipp16s*                            dct_dc_past,
    Ipp8u*                             pDst,
    Ipp32s                             dstStep))
{
  DEF_VARS();
  Ipp32s chromaFlag = blockType & 1;

  for (k = 0; k < 64; k++) {
    pDstBlock[k] = 0;
  }

  COPY_BITSTREAM(BS, *BitStream)

  /* DC */
  DECODE_DC(val)
  val += *dct_dc_past;
  *dct_dc_past = val;
  pDstBlock[0] = val << 3;

  if (blockType & 4) { // D-type picture, DC coef only
    COPY_BITSTREAM(*BitStream, BS)
    IDCT_INTRA(pDstBlock, 0, idct, pDst, dstStep);
    return ippStsOk;
  }

  i = 0;
  SHOW_HI9BITS(BS, code);

  for (;;) {
    if ((code & 0xc0000000) == 0x80000000) {
      break;
    } else if (code >= 0x08000000) {
      tbl = MPEG2_VLC_TAB1[UHBITS(code - 0x08000000, 8)];
    } else if (code >= 0x04000000) {
      EXPAND_17BITS(BS, code);
      i += 1 + UHBITS(code << 6, 6);
      i &= 63;
      j = scanMatrix[i];

      SKIP_BITS(BS, 12);
      GET_TO9BITS(BS, 8, val);
      val = (Ipp8s)val;
      if (!(val & (Ipp8s)0x7f))
      {
        Ipp16s base = (val & 0x80) ? -256 : 0;
        GET_TO9BITS(BS, 8, val);
        val = (Ipp16s)(val+base);
      }
      sign = SHBITS(val, 1);
      val = (val * (quant*pQuantMatrix[j])) / 8;
      val = (val + ~sign) | 1;

      SAT(val)
      pDstBlock[j] = val;

      SHOW_HI9BITS(BS, code);
      continue;
    } else {

      EXPAND_17BITS(BS, code);
      if (code >= 0x00800000) {
        tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_10BIT + UHBITS(code, 13)];
      } else if (code >= 0x00200000) {
        tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_15BIT + UHBITS(code, 15)];
      } else {
        tbl = MPEG2_VLC_TAB1[TAB1_OFFSET_16BIT + UHBITS(code, 16)];
        if (code < 16)
          return ippStsVLCErr;
        code <<= 16;
        SKIP_BITS(BS, 16);
      }
    }
    i++;
    UNPACK_VLC2(tbl, run, val, len)
    i += run;
    i &= 63;
    j = scanMatrix[i];
    val = (val*(quant*pQuantMatrix[j])) >> 3;
    sign = SHBITS(code << len, 1);
    val = (val-1) | 1;
    APPLY_SIGN(val, sign);

    SKIP_BITS(BS, (len + 1));
    pDstBlock[j] = val;
    SHOW_HI9BITS(BS, code);
  }

  SKIP_BITS(BS, 2);
  COPY_BITSTREAM(*BitStream, BS)

  IDCT_INTRA(pDstBlock, i, idct, pDst, dstStep);

  return ippStsOk;
}

/*******************************************************/

/* ///////////////////////////////////////////////////////////////////////////
//  Name:
//    ippiDecodeIntraInit_MPEG2
//    ippiDecodeInterInit_MPEG2
//
//  Purpose:
//    Initialized IppiDecodeIntraSpec_16s(IppiDecodeInterSpec_MPEG2) structure.
//    If pQuantMatrix is NULL this means default quantization matrix.
//
//  Parameters:
//    pQuantMatrix   Pointer to the quantization matrix size of 64.
//    scan           Type of the scan, takes one of the following values:
//                       IPPVC_SCAN_ZIGZAG, indicating the classical zigzag scan,
//                       IPPVC_SCAN_VERTICAL - alternate-vertical scan
//    intraVLCFormat 0 or 1, defines one of two VLC tables for decoding intra blocks
//    intraShiftDC   Integer value for shifting intra DC coefficient after VLC decoding
//    pSpec          Pointer to the structure IppiDecodeIntraSpec_16s or
//                   IppiDecodeInterSpec_MPEG2 which will initialized.
//
//  Returns:
//    ippStsNoErr        No error.
//    ippStsNullPtrErr   Indicates an error when pointer pSpec is NULL.
*/

MP2_FUNC(IppStatus, ippiDecodeIntraInit_MPEG2, (
    const Ipp8u*                 pQuantMatrix,
    Ipp32s                       flag,
    Ipp32s                       intraVLCFormat,
    Ipp32s                       intraShiftDC,
    IppiDecodeIntraSpec_MPEG2*   pSpec))
{
  SCAN_MATRIX_TYPE *scan = scan_tbl[flag & 1]; // IPPVC_ALT_SCAN == 1
  pSpec->intraVLCFormat = intraVLCFormat;
  pSpec->intraShiftDC = intraShiftDC;
  if (!(flag & IPPVC_LEAVE_SCAN_UNCHANGED)) {
    pSpec->scanMatrix = scan;
  }
  if (!(flag & IPPVC_LEAVE_QUANT_UNCHANGED)) {
    Ipp32s i;
    if (!pQuantMatrix) pQuantMatrix = default_intra_quantizer_matrix;
    pSpec->quantMatrix = pSpec->_quantMatrix;
    for (i = 0; i < 64; i++) {
      pSpec->quantMatrix[scan[i]] = pQuantMatrix[i];
    }
  }
  return ippStsNoErr;
}

MP2_FUNC(IppStatus, ippiDecodeInterInit_MPEG2, (
    const Ipp8u*                 pQuantMatrix,
    Ipp32s                       flag,
    IppiDecodeInterSpec_MPEG2*   pSpec))
{
  SCAN_MATRIX_TYPE *scan = scan_tbl[flag & 1];
  if (!(flag & IPPVC_LEAVE_SCAN_UNCHANGED)) {
    pSpec->scanMatrix = scan;
  }
  if (!(flag & IPPVC_LEAVE_QUANT_UNCHANGED)) {
    if (pQuantMatrix) {
      Ipp32s i, mask = 0;
      pSpec->quantMatrix = pSpec->_quantMatrix;
      for (i = 0; i < 64; i++) {
        pSpec->quantMatrix[scan[i]] = pQuantMatrix[i];
        mask |= pQuantMatrix[i];
      }
      if (mask == 16) { // default matrix
        pSpec->quantMatrix = NULL;
      }
    } else {
      pSpec->quantMatrix = NULL;
    }
  }
  return ippStsNoErr;
}

/* /////////////////////////////////////////////////////////////////////////// */

/*static*/ void IDCTAdd_1x1to8x8(Ipp32s val, Ipp8u* y, Ipp32s step) {
  Ipp32s i, j;
  val = (val + 4) >> 3;
  for (j = 0; j < 8; j++) {
    for (i = 0; i < 8; i++) {
      Ipp32s r = y[i] + val;
      if (r < 0) r = 0;
      if (r > 255) r = 255;
      y[i] = r;
    }
    y += step;
  }
}

#endif // UMC_ENABLE_MPEG2_VIDEO_DECODER

⌨️ 快捷键说明

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