umc_mpeg2_dec_blk.cpp

来自「这是在PCA下的基于IPP库示例代码例子,在网上下了IPP的库之后,设置相关参数」· C++ 代码 · 共 1,037 行 · 第 1/3 页

CPP
1,037
字号
/*//////////////////////////////////////////////////////////////////////////////////                  INTEL CORPORATION PROPRIETARY INFORMATION//     This software is supplied under the terms of a license agreement or//     nondisclosure agreement with Intel Corporation and may not be copied//     or disclosed except in accordance with the terms of that agreement.//          Copyright(c) 2003-2005 Intel Corporation. All Rights Reserved.//*/#include <ippi.h>#include <ippvc.h>#include "ippvc_bs.h"#define _DEF_BLOCK \  Ipp16s *pDstBlock = pQuantSpec->dq;#define DEF_BLOCK \  Ipp16s pDstBlock[64];#define MP2_FUNC(type, name, arg)  type name argstatic Ipp16s Qmatrix[64] ={    16,16,16,16,16,16,16,16, // It    16,16,16,16,16,16,16,16, // Is    16,16,16,16,16,16,16,16, // The    16,16,16,16,16,16,16,16, // Default    16,16,16,16,16,16,16,16, // Non    16,16,16,16,16,16,16,16, // Intra    16,16,16,16,16,16,16,16, // Quantizer    16,16,16,16,16,16,16,16, // Matrix};#define UHBITS(code, nbits) (((Ipp32u)(code)) >> (32 - (nbits)))#define SHBITS(code, nbits) (((Ipp32s)(code)) >> (32 - (nbits)))#define TAB1_OFFSET_10BIT 248#define TAB1_OFFSET_15BIT 360#define TAB1_OFFSET_16BIT 408#define TAB1_OFFSET_8BIT_INTRA 432#define TAB1_OFFSET_10BIT_INTRA 680static const Ipp16u MPEG2_VLC_TAB1[] ={  0xae2, 0xae2,  0x6e9, 0x6e9,  0x12e0, 0x12e0,  0x6e8, 0x6e8,  0x6c7, 0x6c7, 0x6c7, 0x6c7,  0x6c6, 0x6c6, 0x6c6, 0x6c6,  0xac1, 0xac1, 0xac1, 0xac1,  0x6c5, 0x6c5, 0x6c5, 0x6c5,  0x70d,  0x1b00,  0x70c,  0x70b,  0xb03,  0xf01,  0x1700,  0x70a,  0xea0, 0xea0, 0xea0, 0xea0, 0xea0, 0xea0, 0xea0, 0xea0, // 0010 10xx  0x6a4, 0x6a4, 0x6a4, 0x6a4, 0x6a4, 0x6a4, 0x6a4, 0x6a4, // 0011 00xx  0x6a3, 0x6a3, 0x6a3, 0x6a3, 0x6a3, 0x6a3, 0x6a3, 0x6a3, // 0011 10xx  0xa80, 0xa80, 0xa80, 0xa80, 0xa80, 0xa80, 0xa80, 0xa80,  0xa80, 0xa80, 0xa80, 0xa80, 0xa80, 0xa80, 0xa80, 0xa80, // 0100 0xxx  0x682, 0x682, 0x682, 0x682, 0x682, 0x682, 0x682, 0x682,  0x682, 0x682, 0x682, 0x682, 0x682, 0x682, 0x682, 0x682, // 0101 0xxx  0x661, 0x661, 0x661, 0x661, 0x661, 0x661, 0x661, 0x661,  0x661, 0x661, 0x661, 0x661, 0x661, 0x661, 0x661, 0x661,  0x661, 0x661, 0x661, 0x661, 0x661, 0x661, 0x661, 0x661,  0x661, 0x661, 0x661, 0x661, 0x661, 0x661, 0x661, 0x661, // 0110 xxxx  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, 0x640, // 264  /* 13-bit code */  0xbaa, 0xba9, 0xfa5, 0x13a3,  0x17a2, 0x1fa1, 0x1ba1, 0x3fa0,  0x3ba0, 0x37a0, 0x33a0, 0x7ba,  0x7b9, 0x7b8, 0x7b7, 0x7b6,  0x2f80, 0x2f80, 0xb88, 0xb88,  0xf84, 0xf84, 0x2b80, 0x2b80,  0x1382, 0x1382, 0xb87, 0xb87,  0x795, 0x795, 0x794, 0x794,  0x2780, 0x2780, 0x793, 0x793,  0x792, 0x792, 0x1781, 0x1781,  0xf83, 0xf83, 0x2380, 0x2380,  0xb86, 0xb86, 0x791, 0x791, // 312  /* 10-bit code  */  0x750, 0x750, 0x750, 0x750, 0x750, 0x750, 0x750, 0x750,  0xb45, 0xb45, 0xb45, 0xb45, 0xb45, 0xb45, 0xb45, 0xb45,  0x1f40, 0x1f40, 0x1f40, 0x1f40, 0x1f40, 0x1f40, 0x1f40, 0x1f40,  0xf42, 0xf42, 0xf42, 0xf42, 0xf42, 0xf42, 0xf42, 0xf42,  0x1341, 0x1341, 0x1341, 0x1341, 0x1341, 0x1341, 0x1341, 0x1341,  0x74f, 0x74f, 0x74f, 0x74f, 0x74f, 0x74f, 0x74f, 0x74f,  0x74e, 0x74e, 0x74e, 0x74e, 0x74e, 0x74e, 0x74e, 0x74e,  0xb44, 0xb44, 0xb44, 0xb44, 0xb44, 0xb44, 0xb44, 0xb44, // 376  /* 15-bit code */  0xa3e0, 0x9fe0, 0x9be0, 0x97e0,  0x93e0, 0x8fe0, 0x8be0, 0x87e0,  0x83e0, 0x3be1, 0x37e1, 0x33e1,  0x2fe1, 0x2be1, 0x27e1, 0x23e1,  0x7fc0, 0x7fc0, 0x7bc0, 0x7bc0,  0x77c0, 0x77c0, 0x73c0, 0x73c0,  0x6fc0, 0x6fc0, 0x6bc0, 0x6bc0,  0x67c0, 0x67c0, 0x63c0, 0x63c0,  0x5fc0, 0x5fc0, 0x5bc0, 0x5bc0,  0x57c0, 0x57c0, 0x53c0, 0x53c0,  0x4fc0, 0x4fc0, 0x4bc0, 0x4bc0,  0x47c0, 0x47c0, 0x43c0, 0x43c0, // 424  /* 16-bit code */  0x4a01, 0x4601, 0x4201, 0x3e01,  0xe06, 0xa10, 0xa0f, 0xa0e,  0xa0d, 0xa0c, 0xa0b, 0x61f,  0x61e, 0x61d, 0x61c, 0x61b, // 440  /* 8-bit code for B15 */  0x6e7, 0x6e7, 0x6e8, 0x6e8,  0x6e6, 0x6e6, 0xae2, 0xae2,  0x1ec0, 0x1ec0, 0x1ec0, 0x1ec0,  0x1ac0, 0x1ac0, 0x1ac0, 0x1ac0,  0x6c4, 0x6c4, 0x6c4, 0x6c4,  0x6c5, 0x6c5, 0x6c5, 0x6c5,  0x1701, 0x70b, 0x2f00, 0x2b00,  0x70d, 0x70c, 0xb03, 0x1301,  0x6a2, 0x6a2, 0x6a2, 0x6a2,  0x6a2, 0x6a2, 0x6a2, 0x6a2,  0xaa1, 0xaa1, 0xaa1, 0xaa1,  0xaa1, 0xaa1, 0xaa1, 0xaa1,  0x6a3, 0x6a3, 0x6a3, 0x6a3,  0x6a3, 0x6a3, 0x6a3, 0x6a3,  0x661, 0x661, 0x661, 0x661,  0x661, 0x661, 0x661, 0x661,  0x661, 0x661, 0x661, 0x661,  0x661, 0x661, 0x661, 0x661,  0x661, 0x661, 0x661, 0x661,  0x661, 0x661, 0x661, 0x661,  0x661, 0x661, 0x661, 0x661,  0x661, 0x661, 0x661, 0x661,  0xffff, 0xffff, 0xffff, 0xffff, // illegal  0xffff, 0xffff, 0xffff, 0xffff, // bit combination  0xffff, 0xffff, 0xffff, 0xffff, // proceed with  0xffff, 0xffff, 0xffff, 0xffff, // previous branch  0xe80, 0xe80, 0xe80, 0xe80,  0xe80, 0xe80, 0xe80, 0xe80,  0xe80, 0xe80, 0xe80, 0xe80,  0xe80, 0xe80, 0xe80, 0xe80,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0x640, 0x640, 0x640, 0x640,  0xa60, 0xa60, 0xa60, 0xa60,  0xa60, 0xa60, 0xa60, 0xa60,  0xa60, 0xa60, 0xa60, 0xa60,  0xa60, 0xa60, 0xa60, 0xa60,  0xa60, 0xa60, 0xa60, 0xa60,  0xa60, 0xa60, 0xa60, 0xa60,  0xa60, 0xa60, 0xa60, 0xa60,  0xa60, 0xa60, 0xa60, 0xa60,  0x12a0, 0x12a0, 0x12a0, 0x12a0,  0x12a0, 0x12a0, 0x12a0, 0x12a0,  0x16a0, 0x16a0, 0x16a0, 0x16a0,  0x16a0, 0x16a0, 0x16a0, 0x16a0,  0x6e9, 0x6e9, 0xee1, 0xee1,  0x6ea, 0x6ea, 0x22e0, 0x22e0,  0x26e0, 0x26e0, 0x3300, 0x3700,  0xf02, 0xb04, 0x3b00, 0x3f00, // 688  /* 10-bit code for B15 */  0xb25, 0xb25, 0x72e, 0x72e,  0x1342, 0x750, 0x72f, 0x72f,};#define UNPACK_VLC1(tab_val, run, val, len) \{ \  Ipp32u _tab_val = tab_val; \  run = _tab_val & 0x1f; \  len = (_tab_val >> 5) & 0xf; \  val = (_tab_val >> 9); \}#define UNPACK_VLC2(tab_val, run, val, len) \{ \  Ipp32u _tab_val = tab_val; \  run = _tab_val & 0x1f; \  len = (_tab_val >> 5) & 0xf; \  val = (_tab_val >> 10); \}const Ipp8u MPEG2_DCSIZE_TAB[128] = {  0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21,  0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,  0x30, 0x30, 0x30, 0x30, 0x33, 0x33, 0x33, 0x33,  0x34, 0x34, 0x34, 0x34, 0x45, 0x45, 0x56, 0x00,  0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,  0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67,  0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78,  0x89, 0x89, 0x89, 0x89, 0x9a, 0x9a, 0x9b, 0x9b,  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,  0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21,  0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,  0x33, 0x33, 0x33, 0x33, 0x44, 0x44, 0x55, 0x00,  0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,  0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,  0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77,  0x88, 0x88, 0x88, 0x88, 0x99, 0x99, 0xaa, 0xbb};#ifdef __ICL#define DECLALIGN(x) __declspec(align(x))#else#define DECLALIGN(x)#endifDECLALIGN(16)static int scan_tbl[4][64] ={    {        0,  8,  1,  2,  9,  16, 24, 17, // It        10, 3,  4,  11, 18, 25, 32, 40, // is        33, 26, 19, 12, 5,  6,  13, 20, // transposed        27, 34, 41, 48, 56, 49, 42, 35, // zigzag        28, 21, 14, 7,  15, 22, 29, 36, // reverse        43, 50, 57, 58, 51, 44, 37, 30, // scan        23, 31, 38, 45, 52, 59, 60, 53, // matrix        46, 39, 47, 54, 61, 62, 55, 63  // for mpeg2    },    {        0,  1,  2,  3,  8,  9,  16, 17, // It        10, 11, 4,  5,  6,  7,  15, 14, // is        13, 12, 19, 18, 24, 25, 32, 33, // transposed        26, 27, 20, 21, 22, 23, 28, 29, // alternate        30, 31, 34, 35, 40 ,41, 48, 49, // reverse        42, 43, 36, 37, 38, 39, 44, 45, // scan        46, 47, 50, 51, 56, 57, 58, 59, // matrix        52, 53, 54, 55, 60, 61, 62, 63  // for mpeg2    },    {        0,  1,  8,  16, 9,  2,  3,  10, // It        17, 24, 32, 25, 18, 11, 4,  5,  // is        12, 19, 26, 33, 40, 48, 41, 34, // not transposed        27, 20, 13,  6,  7, 14, 21, 28, // zigzag        35, 42, 49, 56, 57, 50, 43, 36, // reverse        29, 22, 15, 23, 30, 37, 44, 51, // scan        58, 59, 52, 45, 38, 31, 39, 46, // matrix        53, 60, 61, 54, 47, 55, 62, 63  // for mpeg1    },    {        0,  8,  16, 24, 1,  9,  2,  10, // It        17, 25, 32, 40, 48, 56, 57, 49, // is        41, 33, 26, 18,  3, 11, 4,  12, // not transposed        19, 27, 34, 42, 50, 58, 35, 43, // zigzag        51, 59, 20, 28, 5 , 13, 6 , 14, // reverse        21, 29, 36, 44, 52, 60, 37, 45, // scan        53, 61, 22, 30, 7 , 15, 23, 31, // matrix        38, 46, 54, 62, 39, 47, 55, 63  // for mpeg1 (not used)    }};Ipp8u default_intra_quantizer_matrix[64] ={   8, 16, 16, 19, 16, 19, 22, 22,  // It  22, 22, 22, 22, 26, 24, 26, 27,  // Is  27, 27, 26, 26, 26, 26, 27, 27,  // The  27, 29, 29, 29, 34, 34, 34, 29,  // Default  29, 29, 27, 27, 29, 29, 32, 32,  // mpeg  34, 34, 37, 38, 37, 35, 35, 34,  // Intra  35, 38, 38, 40, 40, 40, 48, 48,  // Quantizer  46, 46, 56, 56, 58, 69, 69, 83   // Matrix};/***************************************************************/#define DECODE_DC(val)                                    \{                                                         \  const Ipp8u *pTab;                                      \  int dct_dc_size;                                        \  SHOW_HI9BITS(BS, code);                                 \  pTab = MPEG2_DCSIZE_TAB + (chromaFlag << 6);            \  if (code < 0xf8000000) {                                \    tbl = pTab[UHBITS(code, 5)];                          \    dct_dc_size = tbl & 0xF;                              \    len = tbl >> 4;                                       \    if (dct_dc_size) {                                    \      EXPAND_17BITS(BS, code);                            \      code <<= len;                                       \      val = UHBITS(code, dct_dc_size) - UHBITS(SHBITS(~code, 1), dct_dc_size); \      SKIP_BITS(BS, len + dct_dc_size);                   \    } else {                                              \      val = 0;                                            \      SKIP_BITS(BS, len);                                 \    }                                                     \  } else {                                                \    tbl = pTab[32 + (UHBITS(code, 10) & 0x1f)];           \    dct_dc_size = tbl & 0xF;                              \    len = tbl >> 4;                                       \    EXPAND_17BITS(BS, code);                              \    EXPAND_25BITS(BS, code);                              \    code <<= len;                                         \    val = UHBITS(code, dct_dc_size) - UHBITS(SHBITS(~code, 1), dct_dc_size); \    SKIP_BITS(BS, len + dct_dc_size);                     \  }                                                       \}/* /////////////////////////////////////////////////////////////////////////////  Name://    ippiDecodeInter8x8IDCTAdd_MPEG2_1u8u////  Purpose://    Performs VLC decoding of DCT coefficients for one inter 8x8 block,//    dequantization of coefficients, inverse DCT and addition of resulted//    8x8 block to destination.////  Parameters://    ppBitStream      Pointer to the pointer to the current byte in//                     the bitstream, it is updated after block decoding.//    pBitOffset       Pointer to the bit position in the byte pointed by//                     *ppBitStream, it is updated after block decoding.

⌨️ 快捷键说明

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