www.pudn.com > wm2.5.zip > vlc.c
/* *********************************************************************** * COPYRIGHT AND WARRANTY INFORMATION * * Copyright 2003, Advanced Audio Video Coding Standard, Part II * * DISCLAIMER OF WARRANTY * * These software programs are available to the users without any * license fee or royalty on an "as is" basis. The AVS disclaims * any and all warranties, whether express, implied, or statutory, * including any implied warranties of merchantability or of fitness * for a particular purpose. In no event shall the contributors or * the AVS be liable for any incidental, punitive, or consequential * damages of any kind whatsoever arising from the use of this program. * * This disclaimer of warranty extends to the user of this program * and user's customers, employees, agents, transferees, successors, * and assigns. * * The AVS does not represent or warrant that the program furnished * hereunder are free of infringement of any third-party patents. * Commercial implementations of AVS, including shareware, may be * subject to royalty fees to patent holders. Information regarding * the AVS patent policy is available from the AVS Web site at * http://www.avs.org.cn * * THIS IS NOT A GRANT OF PATENT RIGHTS - SEE THE AVS PATENT POLICY. ************************************************************************ */ /* ************************************************************************************* * File name: vlc.c * Function: VLC support functions * ************************************************************************************* */ #include#include #include #include #include #include "global.h" #include "vlc.h" #include "elements.h" #include "header.h" #include "global.h" // A little trick to avoid those horrible #if TRACE all over the source code #if TRACE #define SYMTRACESTRING(s) strncpy(sym->tracestring,s,TRACESTRING_SIZE) #else #define SYMTRACESTRING(s) // do nothing #endif extern void tracebits(const char *trace_str, int len, int info,int value1); extern void tracebits3(const char *trace_str, int len, int info,int value1); extern int readSyntaxElement_GOLOMB(SyntaxElement *se); int UsedBits; // for internal statistics, is adjusted by se_v, ue_v, u_1 const byte NTAB_INTER[15][2] = //qwang 2004-3-16 { {1,0}, {1,1}, {1,2}, {2,0}, {1,3}, {1,4}, {1,5}, {3,0}, {2,1}, {2,2}, {1,6}, {1,7}, {1,8}, {1,9}, {4,0}, }; const byte NTAB_INTRA[15][2] = //qwang 2004-3-16 { {1,0}, {1,1}, {2,0}, {1,2}, {3,0}, {4,0}, {5,0}, {1,3}, {1,4}, {2,1}, {3,1}, {6,0}, {7,0}, {8,0}, {9,0}, }; const int SCAN[16][2] = // [scan_pos][x/y] ATTENTION: the ScanPositions are (pix,lin)! //qwang 2004-3-9 { {0,0},{1,0},{0,1},{0,2}, {1,1},{2,0},{3,0},{2,1}, {1,2},{0,3},{1,3},{2,2}, {3,1},{3,2},{2,3},{3,3} }; const byte QP_RANGE[64] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; const byte VLC_TABLE_INTRA[4] = { 0, 1, 2, 3 }; const byte VLC_TABLE_INTER[4][7] = { { 2, 2, 2, 3, 3, 3, 0}, { 6, 6, 6, 7, 8, 8, 1}, { 6, 6, 6, 7, 8, 8, 4}, { 6, 6, 6, 7, 8, 8, 5} }; char AVS_2DVLC_INTER_dec[7][64][2]={{{-1,-1}}}; const char AVS_2DVLC_INTER[7][26][27] = { { { 0, 26, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 2, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, { 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {12, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {14, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {24, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {30, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {32, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {34, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {36, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {38, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {42, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {50, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, { { 2, 0, 13, 29, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 3, 23, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 5, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 7, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 9, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 11, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 15, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 17, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 27, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, { { 2, 0, 5, 11, 23, 35, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 3, 13, 27, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 7, 21, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 9, 29, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 15, 37, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 17, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 19, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 33, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, { { 2, 0, 3, 7, 13, 17, 27, 35, 43, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 5, 11, 21, 33, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 9, 23, 37, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 15, 29, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 19, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 25, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, { { 2, 0, 3, 5, 9, 11, 17, 21, 25, 33, 41, 45, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 7, 13, 19, 29, 35, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 15, 27, 43, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 23, 37, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 31, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, { { 0, 1, 3, 5, 7, 9, 13, 15, 17, 21, 25, 29, 33, 39, 43, 49, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 11, 19, 27, 31, 41, 45, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 23, 37, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 35, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, }, { { 0, 1, 3, 5, 7, 9, 11, 13, 17, 19, 21, 23, 25, 29, 33, 35, 39, 41, 43, 47, 49, 57, -1, -1, -1, -1, -1}, {-1, 15, 27, 37, 45, 55, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 31, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, } }; const char VLC_Golomb_Order[2][3][7][2] = //[interlace/frame][intra/inter/chroma][tablenum][grad/maxlevel] { { //interlace coding { {2,9}, {2,9}, {1,9}, {2,9}, {2,9}, {3,9}, {-1,-1}, }, { {3,9}, {2,9}, {1,9}, {2,9}, {2,9}, {2,9}, {3,9}, }, { {2,9}, {2,9}, {1,9}, {1,9}, {2,9}, {-1,-1}, {-1,-1}, }, }, { //frame coding { {2,9}, {2,9}, {2,9}, {2,9}, {2,9}, {2,9}, {2,9}, }, { {3,9}, {2,9}, {2,9}, {2,9}, {2,9}, {2,9}, {2,9}, }, { {2,9}, {0,9}, {1,9}, {1,9}, {0,9}, {-1,-1}, {-1,-1}, }, } }; const char MaxRun[3][7] = { {22,14,9,6,4,2,1}, {25,18,13,9,6,4,3}, {24,19,10,7,4,-1,-1} }; const char RefAbsLevel[19][26] = { { 4, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-1,-1,-1}, { 7, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {10, 6, 4, 4, 3, 3, 3, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {13, 7, 5, 4, 3, 2, 2,-1,-1,-1 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {18, 8, 4, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {22, 7, 3,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {27, 4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, { 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2}, { 5, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1}, { 7, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {10, 6, 5, 4, 3, 3, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {13, 7, 5, 4, 3, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {17, 8, 4, 3, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {22, 6, 3, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, { 5, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-1}, { 6, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1}, {10, 6, 4, 4, 3, 3, 2, 2, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {14, 7, 4, 3, 3, 2, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, {20, 7, 3, 2, 2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1} }; const int B8SCAN[2][64][2] = // [scan_pos][x/y] ATTENTION: the ScanPositions are (pix,lin)! { { {0,0},{0,1},{0,2},{1,0},{0,3},{0,4},{1,1},{1,2}, {0,5},{0,6},{1,3},{2,0},{2,1},{0,7},{1,4},{2,2}, {3,0},{1,5},{1,6},{2,3},{3,1},{3,2},{4,0},{1,7}, {2,4},{4,1},{2,5},{3,3},{4,2},{2,6},{3,4},{4,3}, {5,0},{5,1},{2,7},{3,5},{4,4},{5,2},{6,0},{5,3}, {3,6},{4,5},{6,1},{6,2},{5,4},{3,7},{4,6},{6,3}, {5,5},{4,7},{6,4},{5,6},{6,5},{5,7},{6,6},{7,0}, {6,7},{7,1},{7,2},{7,3},{7,4},{7,5},{7,6},{7,7} }, { { 0, 0}, { 1, 0}, { 0, 1}, { 0, 2}, { 1, 1}, { 2, 0}, { 3, 0}, { 2, 1}, { 1, 2}, { 0, 3}, { 0, 4}, { 1, 3}, { 2, 2}, { 3, 1}, { 4, 0}, { 5, 0}, { 4, 1}, { 3, 2}, { 2, 3}, { 1, 4}, { 0, 5}, { 0, 6}, { 1, 5}, { 2, 4}, { 3, 3}, { 4, 2}, { 5, 1}, { 6, 0}, { 7, 0}, { 6, 1}, { 5, 2}, { 4, 3}, { 3, 4}, { 2, 5}, { 1, 6}, { 0, 7}, { 1, 7}, { 2, 6}, { 3, 5}, { 4, 4}, { 5, 3}, { 6, 2}, { 7, 1}, { 7, 2}, { 6, 3}, { 5, 4}, { 4, 5}, { 3, 6}, { 2, 7}, { 3, 7}, { 4, 6}, { 5, 5}, { 6, 4}, { 7, 3}, { 7, 4}, { 6, 5}, { 5, 6}, { 4, 7}, { 5, 7}, { 6, 6}, { 7, 5}, { 7, 6}, { 6, 7}, { 7, 7} } }; extern int readSyntaxElement_HybridGOLOMB(SyntaxElement *se); /* ************************************************************************* * Function:ue_v, reads an ue(v) syntax element, the length in bits is stored in the global UsedBits variable * Input: tracestring the string for the trace file bitstream the stream to be read from * Output: * Return: the value of the coded syntax element * Attention: ************************************************************************* */ int ue_v (char *tracestring) { SyntaxElement symbol, *sym=&symbol; assert (currStream->streamBuffer != NULL); sym->type = SE_HEADER; sym->mapping = mapping_ue; // Mapping rule SYMTRACESTRING(tracestring); read_VLC (sym); return sym->value1; } /* ************************************************************************* * Function:ue_v, reads an se(v) syntax element, the length in bits is stored in the global UsedBits variable * Input: tracestring the string for the trace file bitstream the stream to be read from * Output: * Return: the value of the coded syntax element * Attention: ************************************************************************* */ int se_v (char *tracestring) { SyntaxElement symbol, *sym=&symbol; assert (currStream->streamBuffer != NULL); sym->type = SE_HEADER; sym->mapping = mapping_se; // Mapping rule: signed integer SYMTRACESTRING(tracestring); read_VLC (sym); return sym->value1; } /* ************************************************************************* * Function:ue_v, reads an u(v) syntax element, the length in bits is stored in the global UsedBits variable * Input: tracestring the string for the trace file bitstream the stream to be read from * Output: * Return: the value of the coded syntax element * Attention: ************************************************************************* */ int u_v (int LenInBits, char*tracestring) { SyntaxElement symbol, *sym=&symbol; assert (currStream->streamBuffer != NULL); sym->type = SE_HEADER; sym->mapping = mapping_ue; // Mapping rule sym->len = LenInBits; SYMTRACESTRING(tracestring); read_FLC (sym); return sym->inf; } /* ************************************************************************* * Function:ue_v, reads an u(1) syntax element, the length in bits is stored in the global UsedBits variable * Input: tracestring the string for the trace file bitstream the stream to be read from * Output: * Return: the value of the coded syntax element * Attention: ************************************************************************* */ int u_1 (char *tracestring) { return u_v (1, tracestring); } /* ************************************************************************* * Function:mapping rule for ue(v) syntax elements * Input:lenght and info * Output:number in the code table * Return: * Attention: ************************************************************************* */ void mapping_ue(int len, int info, int *value1) { *value1 = (int)pow(2,(len/2))+info-1; // *value1 = (int)(2<<(len>>1))+info-1; } /* ************************************************************************* * Function:mapping rule for se(v) syntax elements * Input:lenght and info * Output:signed mvd * Return: * Attention: ************************************************************************* */ void mapping_se(int len, int info, int *value1) { int n; n = (int)pow(2,(len/2))+info-1; *value1 = (n+1)/2; if((n & 0x01)==0) // lsb is signed bit *value1 = -*value1; } /* ************************************************************************* * Function:lenght and info * Input: * Output:cbp (intra) * Return: * Attention: ************************************************************************* */ void read_cbp_intra(int len,int info,int *cbp) { extern const byte NCBP[48][2]; int cbp_idx; mapping_ue(len,info,&cbp_idx); *cbp=NCBP[cbp_idx][0]; } /* ************************************************************************* * Function: * Input:lenght and info * Output:cbp (inter) * Return: * Attention: ************************************************************************* */ void read_cbp_inter(int len,int info,int *cbp) { extern const byte NCBP[48][2]; int cbp_idx; mapping_ue(len,info,&cbp_idx); *cbp=NCBP[cbp_idx][1]; } /* ************************************************************************* * Function: * Input: * Output: * Return: * Attention: ************************************************************************* */ void symbol2D_levrun_intra(int *level, int *run, int symbol2D) //qwang 2004-3-16 { const byte LEVRUN[8]= { 9,3,1,1,1,0,0,0 }; int sign; if(symbol2D==0) *level = 0; else if(symbol2D <= 30) //lookup table { if(symbol2D&1) //+level sign = 0; else //-level { sign = 1; symbol2D--; } symbol2D = (symbol2D/2); *level = NTAB_INTRA[symbol2D][0]; *run = NTAB_INTRA[symbol2D][1]; if(sign == 1) *level = -(*level); } else { if(symbol2D&1) //+level { sign = 0; symbol2D++; } else //-level sign = 1; *run = (symbol2D%16)/2; *level = (((symbol2D - (symbol2D%16) - 16))/16 + LEVRUN[*run]); if(sign == 1) *level = -(*level); } } /* ************************************************************************* * Function: * Input: * Output: * Return: * Attention: ************************************************************************* */ void symbol2D_levrun_inter(int *level, int *run, int symbol2D) //qwang 2004-3-16 { const byte LEVRUN[16]= {4,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0}; int sign; if(symbol2D==0) *level = 0; else if(symbol2D <= 30) //lookup table { if(symbol2D&1) //+level sign = 0; else //-level { sign = 1; symbol2D--; } symbol2D = (symbol2D/2); *level = NTAB_INTER[symbol2D][0]; *run = NTAB_INTER[symbol2D][1]; if(sign == 1) *level = -(*level); } else { if(symbol2D&1) //+level { sign = 0; symbol2D++; } else //-level sign = 1; *run = (symbol2D%32)/2; *level = ((symbol2D/32)+LEVRUN[*run]); if(sign == 1) *level = -(*level); } } /* ************************************************************************* * Function: * Input: * Output: * Return: * Attention: ************************************************************************* */ void symbol2D_levrun(int *level, int *run, int intra, int tableindex, int symbol2D) { const byte LEVRUN_INTRA[7][16]= // dongjie { { 4, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, { 6, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 6, 4, 4, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 8, 5, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {10, 5, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {12, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {15, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; const byte LEVRUN_INTER[7][16]= // dongjie { { 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, { 5, 3, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, { 5, 3, 3, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, { 6, 4, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 7, 4, 3, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 9, 5, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {13, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; int sign; if(symbol2D&1) //+level { sign = 0; symbol2D++; } else //-level sign = 1; *run = ((symbol2D-8)%32)/2; if(intra) *level = (((symbol2D-8)/32)+LEVRUN_INTRA[tableindex][*run]); else *level = (((symbol2D-8)/32)+LEVRUN_INTER[tableindex][*run]); if(sign == 1) *level = -(*level); } /* ************************************************************************* * Function: * Input: * Output: * Return: * Attention: ************************************************************************* */ void symbol2D_levrun_chroma(int *level, int *run, int symbol2D, int tableindex) { const byte LEVRUN_CHROMA[4][16]= // dongjie { { 6, 2, 2, 2, 1, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, { 7, 3, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, { 9, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {12, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; int sign; if(symbol2D&1) //+level { sign = 0; symbol2D++; } else //-level sign = 1; //*run = (symbol2D%32)/2; *run = ((symbol2D-8)%32)/2; *level = ((symbol2D-8)/32+LEVRUN_CHROMA[tableindex/*dongjie*/][*run]); if(sign == 1) *level = -(*level); } // added by PSL 20041228 void find_level(int sign, int *level, int run, int intra, int tableindex, int abs_level_diff) { const byte LEVRUN_INTRA[7][16]= // dongjie { { 4, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, { 6, 4, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 6, 4, 4, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 8, 5, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {10, 5, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {12, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {15, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; const byte LEVRUN_INTER[7][16]= // dongjie { { 4, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, { 5, 3, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, { 5, 3, 3, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, { 6, 4, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 7, 4, 3, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, { 9, 5, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {13, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; if(intra) *level = (abs_level_diff+LEVRUN_INTRA[tableindex][run]); else *level = (abs_level_diff+LEVRUN_INTER[tableindex][run]); if(sign == 1) *level = -(*level); } // added by PSL 20041228 void find_level_chroma(int sign, int *level, int run, int tableindex, int abs_level_diff) { const byte LEVRUN_CHROMA[4][16]= // dongjie { { 6, 2, 2, 2, 1, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, { 7, 3, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}, { 9, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {12, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; *level = abs_level_diff + LEVRUN_CHROMA[tableindex/*dongjie*/][run]; if(sign == 1) *level = -(*level); } /* ************************************************************************* * Function:read next UVLC codeword from UVLC-partition and map it to the corresponding syntax element * Input: * Output: * Return: * Attention: ************************************************************************* */ int read_VLC(SyntaxElement *sym) { int frame_bitoffset = currStream->frame_bitoffset; byte *buf = currStream->streamBuffer; int BitstreamLengthInBytes = currStream->bitstream_length; sym->len = GetVLCSymbol (&(sym->inf)); if (sym->len == -1) return -1; sym->mapping(sym->len,sym->inf,&(sym->value1)); #if TRACE tracebits(sym->tracestring, sym->len, sym->inf, sym->value1); #endif return 1; } /* ************************************************************************* * Function:read next UVLC codeword from UVLC-partition and map it to the corresponding syntax element * Input: * Output: * Return: * Attention: ************************************************************************* */ int read_UVLC(SyntaxElement *sym) { int frame_bitoffset = currStream->frame_bitoffset; byte *buf = currStream->streamBuffer; int BitstreamLengthInBytes = currStream->bitstream_length; if(sym->type == SE_REFFRAME) { sym->len = 1; if ((GetVLCSymbol_refidx(&(sym->inf))) < 0) return -1; sym->value1 = sym->inf; currStream->frame_bitoffset += sym->len; #if TRACE tracebits3(sym->tracestring, sym->len, sym->inf, sym->value1);//sym->inf, sym->value1); #endif } else { sym->len = GetVLCSymbol (&(sym->inf)); if (sym->len == -1) return -1; sym->mapping(sym->len,sym->inf,&(sym->value1)); #if TRACE tracebits(sym->tracestring, sym->len, sym->inf, sym->value1); #endif } return 1; } /* ************************************************************************* * Function:read next VLC codeword for 4x4 Intra Prediction Mode and map it to the corresponding Intra Prediction Direction * Input: * Output: * Return: * Attention: ************************************************************************* */ int read_Intra4x4PredictionMode(SyntaxElement *sym) //qwang 2004-3-9 { int frame_bitoffset = currStream->frame_bitoffset; byte *buf = currStream->streamBuffer; int BitstreamLengthInBytes = currStream->bitstream_length; int value1; //temporal varibale sym->len = GetIntraMode (buf, frame_bitoffset, &(sym->inf), BitstreamLengthInBytes); if (sym->len == -1) return -1; currStream->frame_bitoffset += sym->len; sym->value1 = sym->len == 1 ? -1 : sym->inf; //add ctrl bits if(sym->len == 1) value1 = 0; else value1 = sym->value1 + 8; // add #if TRACE //tracebits2(sym->tracestring, sym->len, sym->value1); tracebits3(sym->tracestring, sym->len, value1,sym->value1); #endif return 1; } /* ************************************************************************* * Function: * Input: * Output: * Return: * Attention: ************************************************************************* */ int GetIntraMode (byte buffer[],int totbitoffset,int *info, int bytecount) { register int inf; long byteoffset; // byte from start of buffer int bitoffset; // bit from start of byte int ctr_bit=0; // control bit for current bit posision int bitcounter=1; int len; int info_bit; byteoffset = totbitoffset/8; bitoffset = 7-(totbitoffset%8); ctr_bit = (buffer[byteoffset] & (0x01< bytecount) { return -1; } inf=(inf<<1); if(buffer[byteoffset] & (0x01<<(bitoffset))) inf |=1; } *info = inf; return bitcounter; // return absolute offset in bit from start of frame } /* ************************************************************************* * Function: Moves the read pointer of the partition forward by one symbol * Input: byte buffer[] containing VLC-coded data bits int totbitoffset bit offset from start of partition int type expected data type (Partiotion ID) * Output: * Return: Length and Value of the next symbol * Attention:As in both nal_bits.c and nal_part.c all data of one partition, slice, picture was already read into a buffer, there is no need to read any data here again. \par This function could (and should) be optimized considerably \par If it is ever decided to have different VLC tables for different symbol types, then this would be the place for the implementation \par An alternate VLC table is implemented based on exponential Golomb codes. The encoder must have a matching define selected. \par GetVLCInfo was extracted because there should be only one place in the source code that has knowledge about symbol extraction, regardless of the number of different NALs. ************************************************************************* */ int GetVLCSymbol (int *info) { register int inf; long byteoffset; // byte from start of buffer int bitoffset; // bit from start of byte int ctr_bit=0; // control bit for current bit posision int bitcounter=1; int len; int info_bit; byte *buffer = currStream->streamBuffer; int bytecount = currStream->bitstream_length; int totbitoffset = currStream->frame_bitoffset; byteoffset= totbitoffset/8; bitoffset= 7-(totbitoffset%8); ctr_bit = (buffer[byteoffset] & (0x01< bytecount) { error("parse error", -1); return -1; } inf=(inf<<1); if(buffer[byteoffset] & (0x01<<(bitoffset))) inf |=1; } *info = inf; currStream->frame_bitoffset += bitcounter; return bitcounter; // return absolute offset in bit from start of frame } /* ************************************************************************* * Function: get one symbol but not moves the read pointer of the partition forward by one symbol * Input: byte buffer[] containing VLC-coded data bits int totbitoffset bit offset from start of partition * Output: * Return: Value of the next symbol * Author: Wang Jianpeng ************************************************************************* */ //WJP FOR SLICE_HEADER 050320 int search_ue_code (int totbitoffset) { register int inf; long byteoffset; // byte from start of buffer int bitoffset; // bit from start of byte int ctr_bit=0; // control bit for current bit posision int bitcounter=1; int len; int info_bit; byte *buffer = currStream->streamBuffer; int bytecount = currStream->bitstream_length; int symbal; byteoffset= totbitoffset/8; bitoffset= 7-(totbitoffset%8); ctr_bit = (buffer[byteoffset] & (0x01< bytecount) { error("parse error", -1); return -1; } inf=(inf<<1); if(buffer[byteoffset] & (0x01<<(bitoffset))) inf |=1; } mapping_ue(bitcounter,inf,&symbal); return symbal; } /* ************************************************************************* * Function: * Input: * Output: * Return: * Attention: ************************************************************************* */ int GetVLCSymbol_refidx (int *info) { register int inf; long byteoffset; // byte from start of buffer int bitoffset; // bit from start of byte int bitcounter=1; int len; int info_bit; byte *buffer=currStream->streamBuffer; int bytecount = currStream->bitstream_length; int totbitoffset = currStream->frame_bitoffset; byteoffset= totbitoffset/8; bitoffset= 7-(totbitoffset%8); len=1; inf=0; for(info_bit=0;(info_bit bytecount) { return -1; } if(buffer[byteoffset] & (0x01<<(bitoffset))) inf = 1; bitcounter++; bitoffset-=1; } *info = inf; return bitcounter; // return absolute offset in bit from start of frame } extern void tracebits2(const char *trace_str, int len, int info) ; /* ************************************************************************* * Function:read FLC codeword from UVLC-partition * Input: * Output: * Return: * Attention: ************************************************************************* */ int read_FLC(SyntaxElement *sym) { int frame_bitoffset = currStream->frame_bitoffset; byte *buf = currStream->streamBuffer; int BitstreamLengthInBytes = currStream->bitstream_length; if ((GetBits(buf, frame_bitoffset, &(sym->inf), BitstreamLengthInBytes, sym->len)) < 0) return -1; currStream->frame_bitoffset += sym->len; // move bitstream pointer sym->value1 = sym->inf; #if TRACE tracebits2(sym->tracestring, sym->len, sym->inf); #endif return 1; } /* ************************************************************************* * Function:Reads bits from the bitstream buffer * Input: byte buffer[] containing VLC-coded data bits int totbitoffset bit offset from start of partition int bytecount total bytes in bitstream int numbits number of bits to read * Output: * Return: * Attention: ************************************************************************* */ int GetBits (byte buffer[],int totbitoffset,int *info, int bytecount, int numbits) { register int inf; long byteoffset; // byte from start of buffer int bitoffset; // bit from start of byte int bitcounter=numbits; byteoffset= totbitoffset/8; bitoffset= 7-(totbitoffset%8); inf=0; while (numbits) { inf <<=1; inf |= (buffer[byteoffset] & (0x01< >bitoffset; numbits--; bitoffset--; if (bitoffset < 0) { byteoffset++; bitoffset += 8; if (byteoffset > bytecount) { return -1; } } } *info = inf; return bitcounter; // return absolute offset in bit from start of frame } /* ************************************************************************* * Function:Reads bits from the bitstream buffer * Input: byte buffer[] containing VLC-coded data bits int totbitoffset bit offset from start of partition int bytecount total bytes in bitstream int numbits number of bits to read * Output: * Return: * Attention: ************************************************************************* */ int ShowBits (byte buffer[],int totbitoffset,int bytecount, int numbits) { register int inf; long byteoffset; // byte from start of buffer int bitoffset; // bit from start of byte byteoffset= totbitoffset/8; bitoffset= 7-(totbitoffset%8); inf=0; while (numbits) { inf <<=1; inf |= (buffer[byteoffset] & (0x01< >bitoffset; numbits--; bitoffset--; if (bitoffset < 0) { byteoffset++; bitoffset += 8; if (byteoffset > bytecount) { return -1; } } } return inf; // return absolute offset in bit from start of frame } /* ************************************************************************* * Function:Read coefficients of one 8x8 block * Input: * Output: * Return: * Attention: ************************************************************************* */ void readLumaCoeff_4x4_UVLC(int b8, int b4) { int mb_nr = pgImage->current_mb_nr; SyntaxElement currSE; int ipos; int run, level; int ii,jj,k,i; int boff_x, boff_y; int symbol2D,Golomb_se_type; int intra,vlc_numcoef,buffer_level[17],buffer_run[17],abslevel; int tableindex; // dongjie const char (*table2D)[16],(*table2D_inter)[14]; const char eob_intra[7]={-1,0,0,0,0,0,0}; //MA.Zhan //const char eob_intra[7]={-1,0,2,0,0,0,0}; int incLevel_intra[7]={0,1,2,3,4,6,3000},incRun_intra[7]={-1,3,17,17,17,17,17}; int incLevel_inter[7]={0,1,1,2,3,5,3000},incRun_inter[7]={-1,3,6,17,17,17,17}; int level1_inter[16]={1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}; int level1_intra[16]={1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2}; // end intra = IS_INTRA(pgcurrMB); Golomb_se_type = SE_LUM_AC_INTER; boff_x = (((b8 &1)<<3) + ((b4 &1)<<2)); boff_y = (((b8>>1)<<3) + ((b4>>1)<<2)); tableindex = 0; //make decoder table for VLC_INTRA code if(VLC_INTRA_dec[0][0][1]<0) // Don't need to set this every time. rewrite later. { memset(VLC_INTRA_dec,-1,sizeof(VLC_INTRA_dec)); for(i=0;i<7;i++) { table2D=VLC_INTRA[i]; for(run=0;run<16;run++) for(level=0;level<16;level++) { ipos=table2D[run][level]; assert(ipos<40); if(ipos>=0) { if(i==0) { VLC_INTRA_dec[i][ipos][0]=level+1; VLC_INTRA_dec[i][ipos][1]=run; VLC_INTRA_dec[i][ipos+1][0]=-(level+1); VLC_INTRA_dec[i][ipos+1][1]=run; } else { VLC_INTRA_dec[i][ipos][0]=level; VLC_INTRA_dec[i][ipos][1]=run; if(level) { VLC_INTRA_dec[i][ipos+1][0]=-(level); VLC_INTRA_dec[i][ipos+1][1]=run; } } } } } assert(VLC_INTRA_dec[0][0][1]>=0); //otherwise, tables are bad. } //make decoder table for VLC_INTER code if(VLC_INTER_dec[0][0][1]<0) // Don't need to set this every time. rewrite later. { memset(VLC_INTER_dec,-1,sizeof(VLC_INTER_dec)); for(i=0;i<7;i++) { table2D_inter=VLC_INTER[i]; for(run=0;run<16;run++) for(level=0;level<14;level++) { ipos=table2D_inter[run][level]; assert(ipos<40); if(ipos>=0) { if(i==0) { VLC_INTER_dec[i][ipos][0]=level+1; VLC_INTER_dec[i][ipos][1]=run; VLC_INTER_dec[i][ipos+1][0]=-(level+1); VLC_INTER_dec[i][ipos+1][1]=run; } else { VLC_INTER_dec[i][ipos][0]=level; VLC_INTER_dec[i][ipos][1]=run; if(level) { VLC_INTER_dec[i][ipos+1][0]=-(level); VLC_INTER_dec[i][ipos+1][1]=run; } } } } } assert(VLC_INTER_dec[0][0][1]>=0); //otherwise, tables are bad. } ipos = -1; level = 1; // get inside loop if(intra) { int previousRunCnt = 0; // added by PSL 20041228 for(k=0; k<17; k++) { currSE.type = Golomb_se_type; currSE.golomb_grad = VLC_GC_Order_INTRA[tableindex][0]; currSE.golomb_maxlevels = VLC_GC_Order_INTRA[tableindex][1]; read_GOLOMB(&currSE); symbol2D = currSE.value1; if(symbol2D==eob_intra[tableindex]) { vlc_numcoef = k; break; } if(symbol2D < CODE2D_ESCAPE_SYMBOL) { level = VLC_INTRA_dec[tableindex][symbol2D][0]; run = VLC_INTRA_dec[tableindex][symbol2D][1]; } else { // commented by PSL 20041228 //symbol2D_levrun(&level, &run, intra, tableindex, symbol2D); // added by PSL 20041228 int abs_lev_diff; int sign; if(symbol2D<71) { sign = symbol2D&0x1;//MAZHAN for "sign" run = ((symbol2D-39)%32)/2; abs_lev_diff = 1; } else { abs_lev_diff = (symbol2D -39-32)/2+2; sign = symbol2D&0x1;//MAZHAN for "sign" currSE.type = Golomb_se_type; currSE.golomb_grad = 0; currSE.golomb_maxlevels = VLC_GC_Order_INTRA[tableindex][1]; read_GOLOMB(&currSE); symbol2D = currSE.value1; run = symbol2D; } find_level(sign, &level, run, intra, tableindex, abs_lev_diff); } // added by PSL 20041228 previousRunCnt += run+1; buffer_level[k] = level; buffer_run[k] = run; abslevel = abs(level); if(abslevel>=incLevel_intra[tableindex]) { if(abslevel == 1) tableindex = (run>incRun_intra[tableindex])?level1_intra[run]:tableindex; else if(abslevel < 4) tableindex = (abslevel+1); else if(abslevel < 6) tableindex = 5; else tableindex = 6; } // added by PSL 20041228 if (previousRunCnt==16) { vlc_numcoef = k+1; break; } #if TRACE snprintf(currSE.tracestring, TRACESTRING_SIZE, "%s (run, level) (%d,%3d) k=%d vlc=%d ", "LUMA4x4_INTRA" ,run, level, VLC_GC_Order_INTRA[tableindex][0], tableindex); tracebits(currSE.tracestring,currSE.len,currSE.inf,currSE.value1); fflush(p_trace); #endif }//loop for k ipos = -1; for(i=(vlc_numcoef-1); i>=0; i--) { ipos += (buffer_run[i]+1); ii = SCAN[ipos][0]; jj = SCAN[ipos][1]; pgImage->m7[boff_x + ii][boff_y + jj] = buffer_level[i]; } } else { int previousRunCnt = 0; // added by PSL 20041228 for(k=0; k<17; k++) { currSE.type = Golomb_se_type; currSE.golomb_grad = VLC_GC_Order_INTER[tableindex][0]; currSE.golomb_maxlevels = VLC_GC_Order_INTER[tableindex][1]; read_GOLOMB(&currSE); symbol2D = currSE.value1; if((symbol2D==0)&&(tableindex!=0)) { vlc_numcoef = k; break; } if(symbol2D < CODE2D_ESCAPE_SYMBOL) { level = VLC_INTER_dec[tableindex][symbol2D][0]; run = VLC_INTER_dec[tableindex][symbol2D][1]; } else { // commented by PSL 20041228 //symbol2D_levrun(&level, &run, intra, tableindex, symbol2D); // added by PSL 20041228 int abs_lev_diff; int sign; if(symbol2D<71) { sign = symbol2D&0x1;//MAZHAN for "sign" run = ((symbol2D-39)%32)/2; abs_lev_diff = 1; } else { abs_lev_diff = (symbol2D -71)/2+2; sign = symbol2D&0x1;//MAZHAN for "sign" currSE.type = Golomb_se_type; currSE.golomb_grad = 0; currSE.golomb_maxlevels = VLC_GC_Order_INTER[tableindex][1]; read_GOLOMB(&currSE); symbol2D = currSE.value1; run = symbol2D; } find_level(sign, &level, run, intra, tableindex, abs_lev_diff); } // added by PSL 20041228 previousRunCnt += run+1; buffer_level[k] = level; buffer_run[k] = run; abslevel = abs(level); if(abslevel>=incLevel_inter[tableindex]) { if(abslevel == 1) tableindex = (run>incRun_inter[tableindex])?level1_inter[run]:tableindex; else if(abslevel == 2) tableindex = 4; else if(abslevel <= 4) tableindex = 5; else tableindex = 6; } // added by PSL 20041228 if (previousRunCnt==16) { vlc_numcoef = k+1; break; } #if TRACE snprintf(currSE.tracestring, TRACESTRING_SIZE, "%s (run, level) (%d,%3d) k=%d vlc=%d ", "LUMA4x4_INTER", run, level, VLC_GC_Order_INTER[tableindex][0], tableindex); tracebits(currSE.tracestring,currSE.len,currSE.inf,currSE.value1); fflush(p_trace); #endif }//loop for k ipos = -1; for(i=(vlc_numcoef-1); i>=0; i--) { ipos += (buffer_run[i]+1); ii = SCAN[ipos][0]; jj = SCAN[ipos][1]; pgImage->m7[boff_x + ii][boff_y + jj] = buffer_level[i]; } } } // end /* ************************************************************************* * Function: decode chroma coefficents * Input: * Output: * Return: * Attention: ************************************************************************* */ // modified by dongjie void readChromaCoeff_4x4_UVLC(int b8, int b4) //qwang 2004-4-27 { int mb_nr = pgImage->current_mb_nr; SyntaxElement currSE; int ipos; int run, level; int ii,jj,k,tableindex,i,vlc_numcoef; int boff_x, boff_y; int symbol2D,Golomb_se_type; int buffer_level[16], buffer_run[16],abslevel; const char (*table2D)[13]; int previousRunCnt = 0; // added by PSL 20041228 int incLevel_chroma[4]={0,1,2,3000}; // dongjie boff_x = ((b4 &1)<<2); boff_y = ((b4>>1)<<2); Golomb_se_type=SE_LUM_AC_INTER; //make decoder table for VLC_CHROMA code if(VLC_CHROMA_dec[0][0][1]<0) // Don't need to set this every time. rewrite later. { memset(VLC_CHROMA_dec,-1,sizeof(VLC_CHROMA_dec)); for(i=0;i<4;i++) { table2D=VLC_CHROMA[i]; for(run=0;run<16;run++) for(level=0;level<13;level++) { ipos=table2D[run][level]; assert(ipos<40); if(ipos>=0) { if(i==0) { VLC_CHROMA_dec[i][ipos][0]=level+1; VLC_CHROMA_dec[i][ipos][1]=run; VLC_CHROMA_dec[i][ipos+1][0]=-(level+1); VLC_CHROMA_dec[i][ipos+1][1]=run; } else { VLC_CHROMA_dec[i][ipos][0]=level; VLC_CHROMA_dec[i][ipos][1]=run; if(level) { VLC_CHROMA_dec[i][ipos+1][0]=-(level); VLC_CHROMA_dec[i][ipos+1][1]=run; } } } } } assert(VLC_CHROMA_dec[0][1]>=0); //otherwise, tables are bad. } ipos = -1; level=1; // get inside loop tableindex = 0; for(k=0; k<17; k++) { currSE.type = Golomb_se_type; currSE.golomb_grad = VLC_GC_Order_CHROMA[tableindex][0]; currSE.golomb_maxlevels = VLC_GC_Order_CHROMA[tableindex][1]; read_GOLOMB(&currSE); symbol2D = currSE.value1; if((symbol2D==0)&&(tableindex!=0)) { vlc_numcoef = k; break; } if(symbol2D < CODE2D_ESCAPE_SYMBOL) { level = VLC_CHROMA_dec[tableindex][symbol2D][0]; run = VLC_CHROMA_dec[tableindex][symbol2D][1]; } else { // commented by PSL 20041228 //symbol2D_levrun_chroma(&level, &run, symbol2D, tableindex); // added by PSL 20041228 int abs_lev_diff; int sign; if(symbol2D<32+39) { sign = symbol2D&0x1; //MAZHAN for "sign" run = ((symbol2D-39)%32)/2; abs_lev_diff = 1; } else { abs_lev_diff = (symbol2D -39-32)/2+2; sign = symbol2D&0x1;//MAZHAN for "sign" currSE.type = Golomb_se_type; currSE.golomb_grad = 0; currSE.golomb_maxlevels = VLC_GC_Order_CHROMA[tableindex][1]; read_GOLOMB(&currSE); symbol2D = currSE.value1; run = symbol2D; } find_level_chroma(sign, &level, run, tableindex, abs_lev_diff); } // added by PSL 20041228 previousRunCnt += run+1; buffer_level[k] = level; buffer_run[k] = run; abslevel = abs(level); if(abslevel>incLevel_chroma[tableindex]) { if(abslevel<3) tableindex = abslevel; else tableindex = 3; } // added by PSL 20041228 if (previousRunCnt==16) { vlc_numcoef = k+1; break; } #if TRACE snprintf(currSE.tracestring, TRACESTRING_SIZE, "%s (run, level) (%d,%3d) k=%d vlc=%d ", "CHR4x4",run, level, VLC_GC_Order_CHROMA[tableindex][0], tableindex); tracebits(currSE.tracestring,currSE.len,currSE.inf,currSE.value1); fflush(p_trace); #endif }//loop for k ipos = -1; for(i=(vlc_numcoef-1); i>=0; i--) { ipos += (buffer_run[i]+1); ii = SCAN[ipos][0]; jj = SCAN[ipos][1]; pgImage->m8[b8-4][boff_x + ii][boff_y + jj] = buffer_level[i]; } } // end #if TRACE /* ************************************************************************* * Function: * Input: * Output: * Return: * Attention: ************************************************************************* */ void encode_golomb_word(unsigned int symbol,unsigned int grad0,unsigned int max_levels,unsigned int *res_bits,unsigned int *res_len) { unsigned int level,res,numbits; res=1UL< =res && level =max_levels) { if(symbol>=res) symbol=res-1UL; //crop if too large. } //set data bits *res_bits=res|symbol; *res_len=numbits; } /* ************************************************************************* * Function: * Input: * Output: * Return: * Attention: ************************************************************************* */ void encode_multilayer_golomb_word(unsigned int symbol,const unsigned int *grad,const unsigned int *max_levels,unsigned int *res_bits,unsigned int *res_len) { unsigned accbits,acclen,bits,len,tmp; accbits=acclen=0UL; while(1) { encode_golomb_word(symbol,*grad,*max_levels,&bits,&len); accbits=(accbits< >bit)&1UL) ; bit = (bit-1UL) & 7UL ; if(bit==7UL) byte=*(++rd); } } else { for( t=0UL ; t<(grad0+level-1) ; t++ ) { databits = (databits<<1UL) | ((byte>>bit)&1UL) ; bit = (bit-1UL) & 7UL ; if(bit==7UL) byte=*(++rd); } if( (signed)databits > ((1< >bit)&1UL) ; bit = (bit-1UL) & 7UL ; if(bit==7UL) byte=*(++rd); first_layer = 0; } else first_layer = 1; } *buffer=rd; *bitoff=bit; num_codeword = 0; for(i=0; i >bit)&1UL) ; bit = (bit-1UL) & 7UL ; if(bit==7UL)byte=*(++rd); } *buffer=rd; *bitoff=bit; return (((1UL< frame_bitoffset; buf = (unsigned char*)currStream->streamBuffer; BitstreamLengthInBytes = currStream->bitstream_length; bit=7UL-(frame_bitoffset&7); read=buf+(frame_bitoffset>>3); se->value1=decode_hybridgolomb_word(&read,&bit,se->golomb_grad,se->golomb_maxlevels); se->len=(((read-buf)<<3)+(7-bit))-frame_bitoffset; se->value2=0; currStream->frame_bitoffset += se->len; return 1; } int read_GOLOMB(SyntaxElement *se) { int frame_bitoffset; unsigned char *buf,*read; int BitstreamLengthInBytes; unsigned int bit,i; unsigned int grad[4],max_lev[4]; #if TRACE unsigned int len; #endif frame_bitoffset = currStream->frame_bitoffset; buf = (unsigned char*)currStream->streamBuffer; BitstreamLengthInBytes = currStream->bitstream_length; bit=7UL-(frame_bitoffset&7); read=buf+(frame_bitoffset>>3); if(!( se->golomb_maxlevels&~0xFF )) { se->value1=decode_golomb_word(&read,&bit,se->golomb_grad,se->golomb_maxlevels); } else { for(i=0UL;i<4UL;i++) { grad[i]=(se->golomb_grad>>(i<<3))&0xFFUL; max_lev[i]=(se->golomb_maxlevels>>(i<<3))&0xFFUL; } se->value1=decode_multilayer_golomb_word(&read,&bit,grad,max_lev); } se->len=(((read-buf)<<3)+(7-bit))-frame_bitoffset; #if TRACE if(!( se->golomb_maxlevels&~0xFF )) //only bits 0-7 used? This means normal Golomb word. encode_golomb_word(se->value1,se->golomb_grad,se->golomb_maxlevels,&(se->value2),&len); else { for(i=0UL;i<4UL;i++) { grad[i]=(se->golomb_grad>>(i<<3))&0xFFUL; max_lev[i]=(se->golomb_maxlevels>>(i<<3))&0xFFUL; } encode_multilayer_golomb_word(se->value1,grad,max_lev,&(se->value2),&len); } // tracebits3("", se->len, se->value2, se->value1); #endif se->value2=0; currStream->frame_bitoffset += se->len; return 1; } //#ifdef AVS_ABT /************************************************************************* * Function:Read coefficients of one 8x8 block * Input: * Output: * Return: * Attention: *************************************************************************/ void readLumaCoeff_8x8_UVLC(int b8) { int i; SyntaxElement currSE; int icoef; /* current coefficient */ int ipos; int run, level; int ii,jj; int vlc_numcoef; int tablenum; //add by qwang static const int incVlc_inter[2][7] = { {0,1,2,3,5,8,3000}, {0,1,2,3,6,9,3000} }; //qwang 11.29 int buffer_level[65]; //add by qwang int buffer_run[64]; //add by qwang int EOB_Pos_inter[2][7] = { {-1, 12, 8, 8, 10, 8, 6}, {-1, 2, 2, 2, 2, 0, 0}}; //qwang 11.29 int symbol2D,Golomb_se_type; int boff_x = ((b8 &1)<<3); int boff_y = ((b8>>1)<<3); if(AVS_2DVLC_INTER_dec[0][0][1]<0) // Don't need to set this every time. rewrite later. { memset(AVS_2DVLC_INTER_dec,-1,sizeof(AVS_2DVLC_INTER_dec)); for(i=0;i<7;i++) { for(run=0;run<26;run++) for(level=0;level<27;level++) { ipos=AVS_2DVLC_INTER[i][run][level]; assert(ipos<64); if(ipos>=0) { if(i==0) { AVS_2DVLC_INTER_dec[i][ipos][0]=level+1; AVS_2DVLC_INTER_dec[i][ipos][1]=run; AVS_2DVLC_INTER_dec[i][ipos+1][0]=-(level+1); AVS_2DVLC_INTER_dec[i][ipos+1][1]=run; } else { AVS_2DVLC_INTER_dec[i][ipos][0]=level; AVS_2DVLC_INTER_dec[i][ipos][1]=run; if(level) { AVS_2DVLC_INTER_dec[i][ipos+1][0]=-(level); AVS_2DVLC_INTER_dec[i][ipos+1][1]=run; } } } } } assert(AVS_2DVLC_INTER_dec[0][0][1]>=0); //otherwise, tables are bad. } vlc_numcoef=-1; Golomb_se_type=SE_LUM_AC_INTER; if (pgcurrMB->cbp & (1< >1; currSE.type=Golomb_se_type; currSE.golomb_grad = 0; currSE.golomb_maxlevels=11; readSyntaxElement_GOLOMB(&currSE); level = currSE.value1 + ((run>MaxRun[1][tablenum])?1:RefAbsLevel[tablenum+7][run]); if( (symbol2D-ABTCODE2D_ESCAPE_SYMBOL) & 1 ) level=-level; } buffer_level[icoef] = level; buffer_run[icoef] = run; if(abs(level) > incVlc_inter[1][tablenum]) //qwang 11.29 { if(abs(level) <= 3) tablenum = abs(level); else if(abs(level) <= 6) tablenum = 4; else if(abs(level) <= 9) tablenum = 5; else tablenum = 6; } #if TRACE snprintf(currSE.tracestring, TRACESTRING_SIZE, "%s (run, level) (%d,%3d) k=%d vlc=%d ", "LUMA8x8", run, level, icoef, tablenum); tracebits(currSE.tracestring,currSE.len,currSE.inf,currSE.value1); fflush(p_trace); #endif }//loop for icoef ipos = -1; for(i=(vlc_numcoef-1); i>=0; i--) { ipos += (buffer_run[i]+1); ii = B8SCAN[1][ipos][0]; jj = B8SCAN[1][ipos][1]; pgImage->m7[boff_x + ii][boff_y + jj] = buffer_level[i]; } }//end if ( cbp & (1< frame_bitoffset; buf = (unsigned char*)currStream->streamBuffer; BitstreamLengthInBytes = currStream->bitstream_length; bit=7UL-(frame_bitoffset&7); read=buf+(frame_bitoffset>>3); if(!(se->golomb_maxlevels&~0xFF )) { se->value1=decode_golomb_word(&read,&bit,se->golomb_grad,se->golomb_maxlevels); } else { for(i=0UL;i<4UL;i++) { grad[i]=(se->golomb_grad>>(i<<3))&0xFFUL; max_lev[i]=(se->golomb_maxlevels>>(i<<3))&0xFFUL; } se->value1=decode_multilayer_golomb_word(&read,&bit,grad,max_lev); } se->len=(((read-buf)<<3)+(7-bit))-frame_bitoffset; currStream->frame_bitoffset += se->len; return 1; } //#endif