📄 umc_mpeg2_enc_put.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) 2002-2007 Intel Corporation. All Rights Reserved.
//
*/
#include "umc_defs.h"
#if defined (UMC_ENABLE_MPEG2_VIDEO_ENCODER)
#include <math.h>
#include "ippi.h"
#include "umc_mpeg2_enc_defs.h"
using namespace UMC;
/* zigzag scan order ISO/IEC 13818-2, 7.3, fig. 7-2 */
static Ipp32s ZigZagScan[64] =
{
0, 1, 8,16, 9, 2, 3,10,17,24,32,25,18,11, 4, 5,12,19,26,33,40,48,41,34,27,20,13, 6, 7,14,21,28,
35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
};
/* alternate scan order ISO/IEC 13818-2, 7.3, fig. 7-3 */
static Ipp32s AlternateScan[64] =
{
0,
8,
16, 24, 1, 9, 2, 10, 17,
25, 32, 40, 48, 56,
57, 49, 41, 33, 26,
18, 3, 11, 4, 12,
19, 27, 34, 42, 50,
58, 35, 43, 51, 59,
20, 28, 5, 13, 6,
14, 21, 29, 36, 44, 52, 60,
37, 45, 53,
61, 22, 30,
7, 15, 23,
31, 38, 46,
54, 62, 39,
47, 55, 63
};
/* color index by block number */
const Ipp32s MPEG2VideoEncoderBase::color_index[12] = {
0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2
};
/* reset DC value ISO/IEC 13818-2, 7.2.1, Table 7-2. */
const Ipp32s MPEG2VideoEncoderBase::ResetTbl[4] =
{
128, 256, 512, 1024
};
/* VL codes for coded_block_pattern ISO/IEC 13818-2, B.3, Table B-9. */
const VLCode_8u MPEG2VideoEncoderBase::CBP_VLC_Tbl[64] =
{
{0x01,9}, {0x0b,5}, {0x09,5}, {0x0d,6}, {0x0d,4}, {0x17,7}, {0x13,7}, {0x1f,8},
{0x0c,4}, {0x16,7}, {0x12,7}, {0x1e,8}, {0x13,5}, {0x1b,8}, {0x17,8}, {0x13,8},
{0x0b,4}, {0x15,7}, {0x11,7}, {0x1d,8}, {0x11,5}, {0x19,8}, {0x15,8}, {0x11,8},
{0x0f,6}, {0x0f,8}, {0x0d,8}, {0x03,9}, {0x0f,5}, {0x0b,8}, {0x07,8}, {0x07,9},
{0x0a,4}, {0x14,7}, {0x10,7}, {0x1c,8}, {0x0e,6}, {0x0e,8}, {0x0c,8}, {0x02,9},
{0x10,5}, {0x18,8}, {0x14,8}, {0x10,8}, {0x0e,5}, {0x0a,8}, {0x06,8}, {0x06,9},
{0x12,5}, {0x1a,8}, {0x16,8}, {0x12,8}, {0x0d,5}, {0x09,8}, {0x05,8}, {0x05,9},
{0x0c,5}, {0x08,8}, {0x04,8}, {0x04,9}, {0x07,3}, {0x0a,5}, {0x08,5}, {0x0c,6}
};
/* VL codes for macroblock_address_increment ISO/IEC 13818-2, B.1, Table B-1. */
const VLCode_8u MPEG2VideoEncoderBase::AddrIncrementTbl[35]=
{
{0x00,0}, // forbidden value
{0x01,1},
{0x03,3}, {0x02,3},
{0x03,4}, {0x02,4},
{0x03,5}, {0x02,5},
{0x07,7}, {0x06,7},
{0x0b,8}, {0x0a,8}, {0x09,8}, {0x08,8}, {0x07,8}, {0x06,8},
{0x17,10}, {0x16,10}, {0x15,10}, {0x14,10}, {0x13,10}, {0x12,10},
{0x23,11}, {0x22,11}, {0x21,11}, {0x20,11}, {0x1f,11}, {0x1e,11},{0x1d,11}, {0x1c,11}, {0x1b,11}, {0x1a,11}, {0x19,11}, {0x18,11},
{0x08,11} // macroblock_escape
};
/* VL codes for macroblock_type ISO/IEC 13818-2, B.2, Tables B-2, B-3, B-4. */
const VLCode_8u MPEG2VideoEncoderBase::mbtypetab[3][32]=
{
/* I */
{
{0x00,0}, {0x01,1}, {0x00,0}, {0x00,0},{0x00,0}, {0x00,0}, {0x00,0}, {0x00,0},
{0x00,0}, {0x00,0}, {0x00,0}, {0x00,0},{0x00,0}, {0x00,0}, {0x00,0}, {0x00,0},
{0x00,0}, {0x01,2}, {0x00,0}, {0x00,0},{0x00,0}, {0x00,0}, {0x00,0}, {0x00,0},
{0x00,0}, {0x00,0}, {0x00,0}, {0x00,0},{0x00,0}, {0x00,0}, {0x00,0}, {0x00,0}
},
/* P */
{
{0x00,0}, {0x03,5}, {0x01,2}, {0x00,0},{0x00,0}, {0x00,0}, {0x00,0}, {0x00,0},
{0x01,3}, {0x00,0}, {0x01,1}, {0x00,0},{0x00,0}, {0x00,0}, {0x00,0}, {0x00,0},
{0x00,0}, {0x01,6}, {0x01,5}, {0x00,0},{0x00,0}, {0x00,0}, {0x00,0}, {0x00,0},
{0x00,0}, {0x00,0}, {0x02,5}, {0x00,0},{0x00,0}, {0x00,0}, {0x00,0}, {0x00,0}
},
/* B */
{
{0x00,0}, {0x03,5}, {0x00,0}, {0x00,0}, {0x02,3}, {0x00,0}, {0x03,3}, {0x00,0},
{0x02,4}, {0x00,0}, {0x03,4}, {0x00,0}, {0x02,2}, {0x00,0}, {0x03,2}, {0x00,0},
{0x00,0}, {0x01,6}, {0x00,0}, {0x00,0}, {0x00,0}, {0x00,0}, {0x02,6}, {0x00,0},
{0x00,0}, {0x00,0}, {0x03,6}, {0x00,0}, {0x00,0}, {0x00,0}, {0x02,5}, {0x00,0}
}
};
/* VL codes for motion_code+16 ISO/IEC 13818-2, B.4, Table B-10. */
const VLCode_8u MPEG2VideoEncoderBase::MV_VLC_Tbl[33]=
{
// negative motion_code
{0x19,11}, {0x1b,11}, {0x1d,11}, {0x1f,11}, {0x21,11}, {0x23,11},
{0x13,10}, {0x15,10}, {0x17,10},
{0x07,8}, {0x09,8}, {0x0b,8},
{0x07,7},
{0x03,5},
{0x03,4},
{0x03,3},
// zero motion_code
{0x01,1},
// positive motion_code
{0x02,3},
{0x02,4},
{0x02,5},
{0x06,7},
{0x0a,8}, {0x08,8}, {0x06,8},
{0x16,10}, {0x14,10}, {0x12,10},
{0x22,11}, {0x20,11}, {0x1e,11}, {0x1c,11}, {0x1a,11}, {0x18,11}
};
/* VL codes for dct_dc_size_luminance ISO/IEC 13818-2, B.5, Table B-12. */
const IppVCHuffmanSpec_32u MPEG2VideoEncoderBase::Y_DC_Tbl[12]=
{
{0x0004,3}, {0x0000,2}, {0x0001,2}, {0x0005,3}, {0x0006,3}, {0x000e,4},
{0x001e,5}, {0x003e,6}, {0x007e,7}, {0x00fe,8}, {0x01fe,9}, {0x01ff,9}
};
/* VL codes for dct_dc_size_chrominance ISO/IEC 13818-2, B.5, Table B-13. */
const IppVCHuffmanSpec_32u MPEG2VideoEncoderBase::Cr_DC_Tbl[12]=
{
{0x0000,2}, {0x0001,2}, {0x0002,2}, {0x0006,3}, {0x000e,4}, {0x001e,5},
{0x003e,6}, {0x007e,7}, {0x00fe,8}, {0x01fe,9}, {0x03fe,10},{0x03ff,10}
};
/* VL codes for DCT coefficients ISO/IEC 13818-2, B.5, Table B-14. */
const Ipp32s MPEG2VideoEncoderBase::dct_coeff_next_RL[] =
{
17, /* max bits */
3 , /* total subtables */
9 ,5, 3,/* subtable sizes */
0, /* 1-bit codes */
1, /* 2-bit codes */
0x00000002, IPPVC_ENDOFBLOCK, IPPVC_ENDOFBLOCK,
2 , /* 3-bit codes */
0x00000006, 0x00000000, 0x00000001, 0x00000007, 0x00000000, 0xffffffff,
2 , /* 4-bit codes */
0x00000006, 0x00000001, 0x00000001, 0x00000007, 0x00000001, 0xffffffff,
4 , /* 5-bit codes */
0x00000008, 0x00000000, 0x00000002, 0x00000009, 0x00000000, 0xfffffffe, 0x0000000a, 0x00000002, 0x00000001,
0x0000000b, 0x00000002, 0xffffffff,
7 , /* 6-bit codes */
0x00000001, IPPVC_ESCAPE, IPPVC_ESCAPE,
0x0000000a, 0x00000000, 0x00000003, 0x0000000b, 0x00000000, 0xfffffffd, 0x0000000e, 0x00000003, 0x00000001,
0x0000000f, 0x00000003, 0xffffffff, 0x0000000c, 0x00000004, 0x00000001, 0x0000000d, 0x00000004, 0xffffffff,
8 , /* 7-bit codes */
0x0000000c, 0x00000001, 0x00000002, 0x0000000d, 0x00000001, 0xfffffffe, 0x0000000e, 0x00000005, 0x00000001,
0x0000000f, 0x00000005, 0xffffffff, 0x0000000a, 0x00000006, 0x00000001, 0x0000000b, 0x00000006, 0xffffffff,
0x00000008, 0x00000007, 0x00000001, 0x00000009, 0x00000007, 0xffffffff,
8 , /* 8-bit codes */
0x0000000c, 0x00000000, 0x00000004, 0x0000000d, 0x00000000, 0xfffffffc, 0x00000008, 0x00000002, 0x00000002,
0x00000009, 0x00000002, 0xfffffffe, 0x0000000e, 0x00000008, 0x00000001, 0x0000000f, 0x00000008, 0xffffffff,
0x0000000a, 0x00000009, 0x00000001, 0x0000000b, 0x00000009, 0xffffffff,
16, /* 9-bit codes */
0x0000004c, 0x00000000, 0x00000005, 0x0000004d, 0x00000000, 0xfffffffb, 0x00000042, 0x00000000, 0x00000006,
0x00000043, 0x00000000, 0xfffffffa, 0x0000004a, 0x00000001, 0x00000003, 0x0000004b, 0x00000001, 0xfffffffd,
0x00000048, 0x00000003, 0x00000002, 0x00000049, 0x00000003, 0xfffffffe, 0x0000004e, 0x0000000a, 0x00000001,
0x0000004f, 0x0000000a, 0xffffffff, 0x00000046, 0x0000000b, 0x00000001, 0x00000047, 0x0000000b, 0xffffffff,
0x00000044, 0x0000000c, 0x00000001, 0x00000045, 0x0000000c, 0xffffffff, 0x00000040, 0x0000000d, 0x00000001,
0x00000041, 0x0000000d, 0xffffffff,
0, /* 10-bit codes */
16, /* 11-bit codes */
0x00000014, 0x00000000, 0x00000007, 0x00000015, 0x00000000, 0xfffffff9, 0x00000018, 0x00000001, 0x00000004,
0x00000019, 0x00000001, 0xfffffffc, 0x00000016, 0x00000002, 0x00000003, 0x00000017, 0x00000002, 0xfffffffd,
0x0000001e, 0x00000004, 0x00000002, 0x0000001f, 0x00000004, 0xfffffffe, 0x00000012, 0x00000005, 0x00000002,
0x00000013, 0x00000005, 0xfffffffe, 0x0000001c, 0x0000000e, 0x00000001, 0x0000001d, 0x0000000e, 0xffffffff,
0x0000001a, 0x0000000f, 0x00000001, 0x0000001b, 0x0000000f, 0xffffffff, 0x00000010, 0x00000010, 0x00000001,
0x00000011, 0x00000010, 0xffffffff,
0, /* 12-bit codes */
32, /* 13-bit codes */
0x0000003a, 0x00000000, 0x00000008, 0x0000003b, 0x00000000, 0xfffffff8, 0x00000030, 0x00000000, 0x00000009,
0x00000031, 0x00000000, 0xfffffff7, 0x00000026, 0x00000000, 0x0000000a, 0x00000027, 0x00000000, 0xfffffff6,
0x00000020, 0x00000000, 0x0000000b, 0x00000021, 0x00000000, 0xfffffff5, 0x00000036, 0x00000001, 0x00000005,
0x00000037, 0x00000001, 0xfffffffb, 0x00000028, 0x00000002, 0x00000004, 0x00000029, 0x00000002, 0xfffffffc,
0x00000038, 0x00000003, 0x00000003, 0x00000039, 0x00000003, 0xfffffffd, 0x00000024, 0x00000004, 0x00000003,
0x00000025, 0x00000004, 0xfffffffd, 0x0000003c, 0x00000006, 0x00000002, 0x0000003d, 0x00000006, 0xfffffffe,
0x0000002a, 0x00000007, 0x00000002, 0x0000002b, 0x00000007, 0xfffffffe, 0x00000022, 0x00000008, 0x00000002,
0x00000023, 0x00000008, 0xfffffffe, 0x0000003e, 0x00000011, 0x00000001, 0x0000003f, 0x00000011, 0xffffffff,
0x00000034, 0x00000012, 0x00000001, 0x00000035, 0x00000012, 0xffffffff, 0x00000032, 0x00000013, 0x00000001,
0x00000033, 0x00000013, 0xffffffff, 0x0000002e, 0x00000014, 0x00000001, 0x0000002f, 0x00000014, 0xffffffff,
0x0000002c, 0x00000015, 0x00000001, 0x0000002d, 0x00000015, 0xffffffff,
32, /* 14-bit codes */
0x00000034, 0x00000000, 0x0000000c, 0x00000035, 0x00000000, 0xfffffff4, 0x00000032, 0x00000000, 0x0000000d,
0x00000033, 0x00000000, 0xfffffff3, 0x00000030, 0x00000000, 0x0000000e, 0x00000031, 0x00000000, 0xfffffff2,
0x0000002e, 0x00000000, 0x0000000f, 0x0000002f, 0x00000000, 0xfffffff1, 0x0000002c, 0x00000001, 0x00000006,
0x0000002d, 0x00000001, 0xfffffffa, 0x0000002a, 0x00000001, 0x00000007, 0x0000002b, 0x00000001, 0xfffffff9,
0x00000028, 0x00000002, 0x00000005, 0x00000029, 0x00000002, 0xfffffffb, 0x00000026, 0x00000003, 0x00000004,
0x00000027, 0x00000003, 0xfffffffc, 0x00000024, 0x00000005, 0x00000003, 0x00000025, 0x00000005, 0xfffffffd,
0x00000022, 0x00000009, 0x00000002, 0x00000023, 0x00000009, 0xfffffffe, 0x00000020, 0x0000000a, 0x00000002,
0x00000021, 0x0000000a, 0xfffffffe, 0x0000003e, 0x00000016, 0x00000001, 0x0000003f, 0x00000016, 0xffffffff,
0x0000003c, 0x00000017, 0x00000001, 0x0000003d, 0x00000017, 0xffffffff, 0x0000003a, 0x00000018, 0x00000001,
0x0000003b, 0x00000018, 0xffffffff, 0x00000038, 0x00000019, 0x00000001, 0x00000039, 0x00000019, 0xffffffff,
0x00000036, 0x0000001a, 0x00000001, 0x00000037, 0x0000001a, 0xffffffff,
32, /* 15-bit codes */
0x0000003e, 0x00000000, 0x00000010, 0x0000003f, 0x00000000, 0xfffffff0, 0x0000003c, 0x00000000, 0x00000011,
0x0000003d, 0x00000000, 0xffffffef, 0x0000003a, 0x00000000, 0x00000012, 0x0000003b, 0x00000000, 0xffffffee,
0x00000038, 0x00000000, 0x00000013, 0x00000039, 0x00000000, 0xffffffed, 0x00000036, 0x00000000, 0x00000014,
0x00000037, 0x00000000, 0xffffffec, 0x00000034, 0x00000000, 0x00000015, 0x00000035, 0x00000000, 0xffffffeb,
0x00000032, 0x00000000, 0x00000016, 0x00000033, 0x00000000, 0xffffffea, 0x00000030, 0x00000000, 0x00000017,
0x00000031, 0x00000000, 0xffffffe9, 0x0000002e, 0x00000000, 0x00000018, 0x0000002f, 0x00000000, 0xffffffe8,
0x0000002c, 0x00000000, 0x00000019, 0x0000002d, 0x00000000, 0xffffffe7, 0x0000002a, 0x00000000, 0x0000001a,
0x0000002b, 0x00000000, 0xffffffe6, 0x00000028, 0x00000000, 0x0000001b, 0x00000029, 0x00000000, 0xffffffe5,
0x00000026, 0x00000000, 0x0000001c, 0x00000027, 0x00000000, 0xffffffe4, 0x00000024, 0x00000000, 0x0000001d,
0x00000025, 0x00000000, 0xffffffe3, 0x00000022, 0x00000000, 0x0000001e, 0x00000023, 0x00000000, 0xffffffe2,
0x00000020, 0x00000000, 0x0000001f, 0x00000021, 0x00000000, 0xffffffe1,
32, /* 16-bit codes */
0x00000030, 0x00000000, 0x00000020, 0x00000031, 0x00000000, 0xffffffe0, 0x0000002e, 0x00000000, 0x00000021,
0x0000002f, 0x00000000, 0xffffffdf, 0x0000002c, 0x00000000, 0x00000022, 0x0000002d, 0x00000000, 0xffffffde,
0x0000002a, 0x00000000, 0x00000023, 0x0000002b, 0x00000000, 0xffffffdd, 0x00000028, 0x00000000, 0x00000024,
0x00000029, 0x00000000, 0xffffffdc, 0x00000026, 0x00000000, 0x00000025, 0x00000027, 0x00000000, 0xffffffdb,
0x00000024, 0x00000000, 0x00000026, 0x00000025, 0x00000000, 0xffffffda, 0x00000022, 0x00000000, 0x00000027,
0x00000023, 0x00000000, 0xffffffd9, 0x00000020, 0x00000000, 0x00000028, 0x00000021, 0x00000000, 0xffffffd8,
0x0000003e, 0x00000001, 0x00000008, 0x0000003f, 0x00000001, 0xfffffff8, 0x0000003c, 0x00000001, 0x00000009,
0x0000003d, 0x00000001, 0xfffffff7, 0x0000003a, 0x00000001, 0x0000000a, 0x0000003b, 0x00000001, 0xfffffff6,
0x00000038, 0x00000001, 0x0000000b, 0x00000039, 0x00000001, 0xfffffff5, 0x00000036, 0x00000001, 0x0000000c,
0x00000037, 0x00000001, 0xfffffff4, 0x00000034, 0x00000001, 0x0000000d, 0x00000035, 0x00000001, 0xfffffff3,
0x00000032, 0x00000001, 0x0000000e, 0x00000033, 0x00000001, 0xfffffff2,
32, /* 17-bit codes */
0x00000026, 0x00000001, 0x0000000f, 0x00000027, 0x00000001, 0xfffffff1, 0x00000024, 0x00000001, 0x00000010,
0x00000025, 0x00000001, 0xfffffff0, 0x00000022, 0x00000001, 0x00000011, 0x00000023, 0x00000001, 0xffffffef,
0x00000020, 0x00000001, 0x00000012, 0x00000021, 0x00000001, 0xffffffee, 0x00000028, 0x00000006, 0x00000003,
0x00000029, 0x00000006, 0xfffffffd, 0x00000034, 0x0000000b, 0x00000002, 0x00000035, 0x0000000b, 0xfffffffe,
0x00000032, 0x0000000c, 0x00000002, 0x00000033, 0x0000000c, 0xfffffffe, 0x00000030, 0x0000000d, 0x00000002,
0x00000031, 0x0000000d, 0xfffffffe, 0x0000002e, 0x0000000e, 0x00000002, 0x0000002f, 0x0000000e, 0xfffffffe,
0x0000002c, 0x0000000f, 0x00000002, 0x0000002d, 0x0000000f, 0xfffffffe, 0x0000002a, 0x00000010, 0x00000002,
0x0000002b, 0x00000010, 0xfffffffe, 0x0000003e, 0x0000001b, 0x00000001, 0x0000003f, 0x0000001b, 0xffffffff,
0x0000003c, 0x0000001c, 0x00000001, 0x0000003d, 0x0000001c, 0xffffffff, 0x0000003a, 0x0000001d, 0x00000001,
0x0000003b, 0x0000001d, 0xffffffff, 0x00000038, 0x0000001e, 0x00000001, 0x00000039, 0x0000001e, 0xffffffff,
0x00000036, 0x0000001f, 0x00000001, 0x00000037, 0x0000001f, 0xffffffff,
-1 /* end of table */
};
/* VL codes for DCT coefficients ISO/IEC 13818-2, B.5, Table B-15. */
const Ipp32s MPEG2VideoEncoderBase::Table15[] =
{
17, /* max bits */
3 , /* total subtables */
9 ,5, 3,/* subtable sizes */
0, /* 1-bit codes */
0, /* 2-bit codes */
2 , /* 3-bit codes */
0x00000004, 0x00000000, 0x00000001, 0x00000005, 0x00000000, 0xffffffff,
5 , /* 4-bit codes */
0x00000004, 0x00000001, 0x00000001, 0x00000005, 0x00000001, 0xffffffff, 0x00000006, IPPVC_ENDOFBLOCK, IPPVC_ENDOFBLOCK,
0x0000000c, 0x00000000, 0x00000002, 0x0000000d, 0x00000000, 0xfffffffe,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -