📄 umc_mpeg2_dec_blk.cpp
字号:
/*////////////////////////////////////////////////////////////////////////////////// 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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -