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

📄 umc_mpeg2_dec_defs.h

📁 audio-video-codecs.rar语音编解码器
💻 H
📖 第 1 页 / 共 3 页
字号:
      &BITSTREAM##_bit_offset,                                           \
      intraSpec,                                                         \
      video->cur_q_scale,                                                \
      chromaFlag,                                                        \
      &video->dct_dc_past[cc],                                           \
      yuv[cc] + offsets[blk],                                            \
      pitch[chromaFlag]);                                                \
    if(sts != ippStsOk)                                                  \
      return sts;                                                        \
  }                                                                      \
}

#define RECONSTRUCT_INTRA_MB_420(BITSTREAM, DCT_TYPE) \
  RECONSTRUCT_INTRA_MB(BITSTREAM, 6, DCT_TYPE)

#define RECONSTRUCT_INTRA_MB_422(BITSTREAM, DCT_TYPE) \
  RECONSTRUCT_INTRA_MB(BITSTREAM, 8, DCT_TYPE)


#define DECODE_MBPATTERN_6(code, BITSTREAM, vlcMBPattern)                \
  DECODE_VLC(code, BITSTREAM, vlcMBPattern)

#define DECODE_MBPATTERN_8(code, BITSTREAM, vlcMBPattern)                \
{                                                                        \
  Ipp32s cbp_1;                                                          \
  DECODE_VLC(code, BITSTREAM, vlcMBPattern);                             \
  GET_TO9BITS(video->bs, 2, cbp_1);                                      \
  code = (code << 2) | cbp_1;                                            \
}

#define RECONSTRUCT_INTER_MB(BITSTREAM, NUM_BLK, DCT_TYPE)               \
{                                                                        \
  IppiDecodeInterSpec_MPEG2 *interSpec = &video->decodeInterSpec;        \
  Ipp32s cur_q_scale = video->cur_q_scale;                               \
  Ipp32s *pitch = blkPitches[DCT_TYPE];                                  \
  Ipp32s *offsets = blkOffsets[DCT_TYPE];                                \
  Ipp32s mask = 1 << (NUM_BLK - 1);                                      \
  Ipp32s code;                                                           \
  Ipp32s blk;                                                            \
                                                                         \
  DECODE_MBPATTERN_##NUM_BLK(code, BITSTREAM, vlcMBPattern);             \
                                                                         \
  for (blk = 0; blk < NUM_BLK; blk++) {                                  \
    if (code & mask) {                                                   \
      IppStatus sts;                                                     \
      Ipp32s chromaFlag = blk >> 2;                                      \
      Ipp32s cc = chromaFlag + (blk & chromaFlag);                       \
      if (NUM_BLK > 6)                                                   \
        interSpec = chromaFlag ? &video->decodeInterSpecChroma : &video->decodeInterSpec; \
                                                                         \
      sts = ippiDecodeInter8x8IDCTAdd_MPEG2_1u8u(                        \
        &BITSTREAM##_curr_ptr,                                           \
        &BITSTREAM##_bit_offset,                                         \
        interSpec,                                                       \
        cur_q_scale,                                                     \
        video->blkCurrYUV[cc] + offsets[blk],                            \
        pitch[chromaFlag]);                                              \
      if(sts != ippStsOk)                                                \
        return sts;                                                      \
    }                                                                    \
    code += code;                                                        \
  }                                                                      \
}

#define RECONSTRUCT_INTER_MB_420(BITSTREAM, DCT_TYPE) \
  RECONSTRUCT_INTER_MB(BITSTREAM, 6, DCT_TYPE)

#define RECONSTRUCT_INTER_MB_422(BITSTREAM, DCT_TYPE) \
  RECONSTRUCT_INTER_MB(BITSTREAM, 8, DCT_TYPE)

#define UPDATE_MV(val, mcode, S) \
  if(PictureHeader.r_size[S]) { \
    GET_TO9BITS(video->bs,PictureHeader.r_size[S], residual); \
    if(mcode < 0) { \
        val += ((mcode + 1) << PictureHeader.r_size[S]) - (residual + 1); \
        if(val < PictureHeader.low_in_range[S]) \
          val += PictureHeader.range[S]; \
    } else { \
        val += ((mcode - 1) << PictureHeader.r_size[S]) + (residual + 1); \
        if(val > PictureHeader.high_in_range[S]) \
          val -= PictureHeader.range[S]; \
    } \
  } else { \
    val += mcode; \
    if(val < PictureHeader.low_in_range[S]) \
      val += PictureHeader.range[S]; \
    else if(val > PictureHeader.high_in_range[S]) \
      val -= PictureHeader.range[S]; \
  }

#define DECODE_MV(BS, R, S, vectorX, vectorY)           \
  /* R = 2*(2*r + s); S = 2*s */                        \
  /* Decode x vector */                                 \
  if (IS_NEXTBIT1(BS)) {                                \
    SKIP_BITS(BS, 1)                                    \
  } else {                                              \
    update_mv(&video->PMV[R], S, video);                \
  }                                                     \
  vectorX = video->PMV[R];                              \
                                                        \
  /* Decode y vector */                                 \
  if (IS_NEXTBIT1(BS)) {                                \
    SKIP_BITS(BS, 1)                                    \
  } else {                                              \
    update_mv(&video->PMV[R + 1], S + 1, video);        \
  }                                                     \
  vectorY = video->PMV[R + 1]

#define DECODE_MV_FIELD(BS, R, S, vectorX, vectorY)     \
  /* R = 2*(2*r + s); S = 2*s */                        \
  /* Decode x vector */                                 \
  if (IS_NEXTBIT1(BS)) {                                \
    SKIP_BITS(BS, 1)                                    \
  } else {                                              \
    update_mv(&video->PMV[R], S, video);                \
  }                                                     \
  vectorX = video->PMV[R];                              \
                                                        \
  /* Decode y vector */                                 \
  vectorY = video->PMV[R + 1] >> 1;                     \
  if (IS_NEXTBIT1(BS)) {                                \
    SKIP_BITS(BS, 1)                                    \
  } else {                                              \
    update_mv(&vectorY, S + 1, video);                  \
  }                                                     \
  video->PMV[R + 1] = vectorY << 1

#define DECODE_MV_FULLPEL(BS, R, S, vectorX, vectorY)   \
  /* R = 2*(2*r + s); S = 2*s */                        \
  /* Decode x vector */                                 \
  vectorX = video->PMV[R] >> 1;                         \
  if (IS_NEXTBIT1(BS)) {                                \
    SKIP_BITS(BS, 1)                                    \
  } else {                                              \
    update_mv(&vectorX, S, video);                      \
  }                                                     \
  video->PMV[R] = vectorX << 1;                         \
                                                        \
  /* Decode y vector */                                 \
  vectorY = video->PMV[R + 1] >> 1;                     \
  if (IS_NEXTBIT1(BS)) {                                \
    SKIP_BITS(BS, 1)                                    \
  } else {                                              \
    update_mv(&vectorY, S + 1, video);                  \
  }                                                     \
  video->PMV[R + 1] = vectorY << 1

#define DECODE_QUANTIZER_SCALE(BS, Q_SCALE) \
{                                           \
  Ipp32s _q_scale;                             \
  GET_TO9BITS(video->bs, 5, _q_scale)       \
  if (_q_scale < 1) {                       \
    return UMC_ERR_INVALID_STREAM;                  \
  }                                         \
  Q_SCALE = q_scale[PictureHeader.q_scale_type][_q_scale]; \
}

#define DECODE_MB_INCREMENT(BS, macroblock_address_increment)         \
{                                                                     \
  Ipp32s code;                                                        \
  SHOW_BITS(BS, 11, code)                                             \
                                                                      \
  if(code == 0) {                                                     \
    return UMC_OK; /* end of slice or bad code. Anyway, stop slice */ \
  }                                                                   \
                                                                      \
  macroblock_address_increment = 0;                                   \
  while(code == 8)                                                    \
  {                                                                   \
    macroblock_address_increment += 33; /* macroblock_escape */       \
    GET_BITS(BS, 11, code);                                           \
    SHOW_BITS(BS, 11, code)                                           \
  }                                                                   \
  DECODE_VLC(code, BS, vlcMBAdressing);                               \
  macroblock_address_increment += code;                               \
  macroblock_address_increment--;                                     \
  if (macroblock_address_increment > (sequenceHeader.mb_width - video->mb_col)) { \
    macroblock_address_increment = sequenceHeader.mb_width - video->mb_col;       \
  }                                                                               \
}

////////////////////////////////////////////////////////////////////

#define APPLY_SIGN(val, sign)  \
  val += sign;                 \
  if (val > 2047) val = 2047; /* with saturation */ \
  val ^= sign

#define SAT(val) \
  if (val > 2047) val = 2047;   \
  if (val < -2048) val = -2048;

#ifdef LOCAL_BUFFERS
#define DEF_BLOCK(NAME) \
  Ipp16s NAME[64];
#else
#define DEF_BLOCK(NAME) \
  Ipp16s *NAME = pQuantSpec->NAME;
#endif

#define MP2_FUNC(type, name, arg)  type name arg

#define FUNC_DCT8x8      ippiDCT8x8Inv_16s_C1
#define FUNC_DCT4x4      ippiDCT8x8Inv_4x4_16s_C1
#define FUNC_DCT2x2      ippiDCT8x8Inv_2x2_16s_C1
#define FUNC_DCT8x8Intra ippiDCT8x8Inv_16s8u_C1R
#define FUNC_ADD8x8      ippiAdd8x8_16s8u_C1IRS

void IDCTAdd_1x1to8x8(Ipp32s val, Ipp8u* y, Ipp32s step);
void IDCTAdd_1x4to8x8(const Ipp16s* x, Ipp8u* y, Ipp32s step);
void Pack8x8(Ipp16s* x, Ipp8u* y, Ipp32s step);


#define IDCT_INTER_1x4(SRC, NUM, DST, STEP)

#define IDCT_INTER(SRC, NUM, BUFF, DST, STEP)      \
  if (NUM < 10) {                                  \
    if (!NUM) {                                    \
      IDCTAdd_1x1to8x8(SRC[0], DST, STEP);         \
    } else                                         \
    IDCT_INTER_1x4(SRC, NUM, DST, STEP)            \
    /*if (NUM < 2) {                                 \
      FUNC_DCT2x2(SRC, BUFF);                      \
      FUNC_ADD8x8(BUFF, 16, DST, STEP);            \
    } else*/ {                                       \
      FUNC_DCT4x4(SRC, BUFF);                      \
      FUNC_ADD8x8(BUFF, 16, DST, STEP);            \
    }                                              \
  } else {                                         \
    FUNC_DCT8x8(SRC, BUFF);                        \
    FUNC_ADD8x8(BUFF, 16, DST, STEP);              \
  }

#define IDCT_INTER1(val, idct, pSrcDst, srcDstStep) \
  ippiAddC8x8_16s8u_C1IR((val + 4) >> 3, pSrcDst, srcDstStep)

#define IDCT_INTRA(SRC, NUM, BUFF, DST, STEP)                   \
  if (!NUM) {                                                   \
    ippiDCT8x8Inv_AANTransposed_16s8u_C1R(SRC, DST, STEP, 0);   \
  } else {                                                      \
    FUNC_DCT8x8Intra(SRC, DST, STEP);                           \
  }


#define IDCT_INTRA1(val, idct, pSrcDst, srcDstStep) \
  pDstBlock[0] = val; \
  ippiDCT8x8Inv_AANTransposed_16s8u_C1R(pDstBlock, pSrcDst, srcDstStep, 0)

#endif // __UMC_MPEG2_DEC_DEFS_H

#endif // UMC_ENABLE_MPEG2_VIDEO_DECODER

⌨️ 快捷键说明

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