/**************************************************************************** * * Module Title : TokenEntropy.c * * Description : Video CODEC: Coefficient token entropy module. * * AUTHOR : Paul Wilkins * ***************************************************************************** * Revision History * * 1.01 PGW 27 Jun 01 Created * ***************************************************************************** */ /**************************************************************************** * Header Files ***************************************************************************** */ /**************************************************************************** * Header Frames ***************************************************************************** */ #define STRICT /* Strict type checking. */ #include "type_aliases.h" #include "systemdependant.h" #include "codec_common.h" #include "codec_common_interface.h" #include "tokenentropy.h" #include "pbdll.h" /**************************************************************************** * Explicit Imports ***************************************************************************** */ /**************************************************************************** * Constants ***************************************************************************** */ /**************************************************************************** * Types ***************************************************************************** */ /**************************************************************************** * Data structures ***************************************************************************** */ #ifndef MAPCA // Costs in bits for different probabilities (expressed in range 0-255) // Costs are multiplied by 256 const UINT32 ProbCost[256] = { 2047, 2047,1791,1641,1535,1452,1385,1328,1279,1235,1196, 1161,1129,1099,1072,1046,1023,1000,979,959,940, 922,905,889,873,858,843,829,816,803,790, 778,767,755,744,733,723,713,703,693,684, 675,666,657,649,641,633,625,617,609,602, 594,587,580,573,567,560,553,547,541,534, 528,522,516,511,505,499,494,488,483,477, 472,467,462,457,452,447,442,437,433,428, 424,419,415,410,406,401,397,393,389,385, 381,377,373,369,365,361,357,353,349,346, 342,338,335,331,328,324,321,317,314,311, 307,304,301,297,294,291,288,285,281,278, 275,272,269,266,263,260,257,255,252,249, 246,243,240,238,235,232,229,227,224,221, 219,216,214,211,208,206,203,201,198,196, 194,191,189,186,184,181,179,177,174,172, 170,168,165,163,161,159,156,154,152,150, 148,145,143,141,139,137,135,133,131,129, 127,125,123,121,119,117,115,113,111,109, 107,105,103,101,99,97,95,93,92,90, 88,86,84,82,81,79,77,75,73,72, 70,68,66,65,63,61,60,58,56,55, 53,51,50,48,46,45,43,41,40,38, 37,35,33,32,30,29,27,25,24,22, 21,19,18,16,15,13,12,10,9,7, 6,4,3,1, 1, }; #endif // Index categories for previous tokens in this block const UINT8 PrevTokenIndex[MAX_ENTROPY_TOKENS] = { 0,1,2,2,2,2,2,2,2,2,2,0 }; // For details of tokens and extra bit breakdown see token definitions in huffman.h const UINT8 ExtraBitLengths_VP5[MAX_ENTROPY_TOKENS] = { 0, 1, 1, 1, 1, 2, 3, 4, 5, 6, 12, 0 }; const UINT32 DctRangeMinVals[MAX_ENTROPY_TOKENS] = { 0, 1, 2, 3, 4, 5, 7, 11, 19, 35, 67, 0 }; const UINT8 DcUpdateProbs[2][MAX_ENTROPY_TOKENS-1] = { { 146, 197, 181, 207, 232, 243, 238, 251, 244, 250, 249 }, { 179, 219, 214, 240, 250, 254, 244, 254, 254, 254, 254 } }; const UINT8 AcUpdateProbs[PREC_CASES][2][VP5_AC_BANDS][MAX_ENTROPY_TOKENS-1] = { { // preceded by 0 { { 227, 246, 230, 247, 244, 254, 254, 254, 254, 254, 254 }, { 202, 254, 209, 231, 231, 249, 249, 253, 254, 254, 254 }, { 206, 254, 225, 242, 241, 251, 253, 254, 254, 254, 254 }, { 235, 254, 241, 253, 252, 254, 254, 254, 254, 254, 254 }, { 234, 254, 248, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, { { 240, 254, 248, 254, 254, 254, 254, 254, 254, 254, 254 }, { 238, 254, 240, 253, 254, 254, 254, 254, 254, 254, 254 }, { 244, 254, 251, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, }, { // preceded by 1 { { 206, 203, 227, 239, 247, 254, 253, 254, 254, 254, 254 }, { 207, 199, 220, 236, 243, 252, 252, 254, 254, 254, 254 }, { 212, 219, 230, 243, 244, 253, 252, 254, 254, 254, 254 }, { 236, 237, 247, 252, 253, 254, 254, 254, 254, 254, 254 }, { 240, 240, 248, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, { { 230, 233, 249, 254, 254, 254, 254, 254, 254, 254, 254 }, { 238, 238, 250, 254, 254, 254, 254, 254, 254, 254, 254 }, { 248, 251, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, }, { // preceded by > 1 { { 225, 239, 227, 231, 244, 253, 243, 254, 254, 253, 254 }, { 232, 234, 224, 228, 242, 249, 242, 252, 251, 251, 254 }, { 235, 249, 238, 240, 251, 254, 249, 254, 253, 253, 254 }, { 249, 253, 251, 250, 254, 254, 254, 254, 254, 254, 254 }, { 251, 250, 249, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, { { 243, 244, 250, 250, 254, 254, 254, 254, 254, 254, 254 }, { 249, 248, 250, 253, 254, 254, 254, 254, 254, 254, 254 }, { 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, }, }; /* { { // preceded by 0 { { 234, 246, 250, 249, 244, 254, 254, 254, 254, 254, 254 }, { 225, 254, 242, 238, 234, 253, 252, 254, 254, 254, 254 }, { 230, 254, 248, 243, 238, 254, 254, 254, 254, 254, 254 }, { 244, 254, 254, 252, 247, 254, 254, 254, 254, 254, 254 }, { 253, 254, 254, 254, 253, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, 227, 246, 230, 247, 244, 254, 254, 254, 254, 254, 254, 202, 254, 209, 231, 231, 249, 249, 253, 254, 254, 254, 206, 254, 225, 242, 241, 251, 253, 254, 254, 254, 254, 235, 254, 241, 253, 252, 254, 254, 254, 254, 254, 254, 234, 254, 248, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, }, { { 251, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 243, 254, 254, 253, 253, 254, 254, 254, 254, 254, 254 }, { 252, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, }, { // preceded by 1 { { 211, 216, 233, 233, 234, 252, 251, 254, 254, 254, 254 }, { 224, 219, 236, 237, 236, 252, 250, 254, 254, 253, 254 }, { 227, 230, 245, 241, 238, 253, 254, 254, 254, 254, 254 }, { 237, 235, 253, 252, 250, 254, 254, 254, 254, 254, 254 }, { 252, 251, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, { { 237, 242, 253, 253, 253, 254, 254, 254, 254, 254, 254 }, { 248, 250, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, }, { // preceded by > 1 { { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, { { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, { 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254 }, }, }, }; */ // DC context equations LINE_EQ DcNodeEqs[CONTEXT_NODES][TOKEN_CONTEXTS][TOKEN_CONTEXTS] = { { // zero { { 154, 61 },{ 141, 54 },{ 90, 45 },{ 54, 34 },{ 54, 13 },{ 128, 109 }, }, { { 136, 54 },{ 148, 45 },{ 92, 41 },{ 54, 33 },{ 51, 15 },{ 87, 113 }, }, { { 87, 44 },{ 97, 40 },{ 67, 36 },{ 46, 29 },{ 41, 15 },{ 64, 80 }, }, { { 59, 33 },{ 61, 31 },{ 51, 28 },{ 44, 22 },{ 33, 12 },{ 49, 63 }, }, { { 69, 12 },{ 59, 16 },{ 46, 14 },{ 31, 13 },{ 26, 6 },{ 92, 26 }, }, { { 128, 108 },{ 77, 119 },{ 54, 84 },{ 26, 71 },{ 87, 19 },{ 95, 155 }, }, }, { // eob { { 154, 4 },{ 182, 0 },{ 159, -8 },{ 128, -5 },{ 143, -5 },{ 187, 55 }, }, { { 182, 0 },{ 228, -3 },{ 187, -7 },{ 174, -9 },{ 189, -11 },{ 169, 79 }, }, { { 161, -9 },{ 192, -8 },{ 187, -9 },{ 169, -10 },{ 136, -9 },{ 184, 40 }, }, { { 164, -11 },{ 179, -10 },{ 174, -10 },{ 161, -10 },{ 115, -7 },{ 197, 20 }, }, { { 195, -11 },{ 195, -11 },{ 146, -10 },{ 110, -6 },{ 95, -4 },{ 195, 39 }, }, { { 182, 55 },{ 172, 77 },{ 177, 37 },{ 169, 29 },{ 172, 52 },{ 92, 162 }, }, }, { // one { { 174, 80 },{ 164, 80 },{ 95, 80 },{ 46, 66 },{ 56, 24 },{ 36, 193 }, }, { { 164, 80 },{ 166, 77 },{ 105, 76 },{ 49, 68 },{ 46, 31 },{ 49, 186 }, }, { { 97, 78 },{ 110, 74 },{ 72, 72 },{ 44, 60 },{ 33, 30 },{ 69, 131 }, }, { { 61, 61 },{ 69, 63 },{ 51, 57 },{ 31, 48 },{ 26, 27 },{ 64, 89 }, }, { { 67, 23 },{ 51, 32 },{ 36, 33 },{ 26, 28 },{ 20, 12 },{ 44, 68 }, }, { { 26, 197 },{ 41, 189 },{ 61, 129 },{ 28, 103 },{ 49, 52 },{ -12, 245 }, }, }, { // low value { { 102, 141 },{ 79, 166 },{ 72, 162 },{ 97, 125 },{ 179, 4 },{ 307, 0 }, }, { { 72, 168 },{ 69, 175 },{ 84, 160 },{ 105, 127 },{ 148, 34 },{ 310, 0 }, }, { { 84, 151 },{ 82, 161 },{ 87, 153 },{ 87, 135 },{ 115, 51 },{ 317, 0 }, }, { { 97, 125 },{ 102, 131 },{ 105, 125 },{ 87, 122 },{ 84, 64 },{ 54, 184 }, }, { { 166, 18 },{ 146, 43 },{ 125, 51 },{ 90, 64 },{ 95, 7 },{ 38, 154 }, }, { { 294, 0 },{ 13, 225 },{ 10, 225 },{ 67, 168 },{ 0, 167 },{ 161, 94 }, }, }, { // two { { 172, 76 },{ 172, 75 },{ 136, 80 },{ 64, 98 },{ 74, 67 },{ 315, 0 }, }, { { 169, 76 },{ 207, 56 },{ 164, 66 },{ 97, 80 },{ 67, 72 },{ 328, 0 }, }, { { 136, 80 },{ 187, 53 },{ 154, 62 },{ 72, 85 },{ -2, 105 },{ 305, 0 }, }, { { 74, 91 },{ 128, 64 },{ 113, 64 },{ 61, 77 },{ 41, 75 },{ 259, 0 }, }, { { 46, 84 },{ 51, 81 },{ 28, 89 },{ 31, 78 },{ 23, 77 },{ 202, 0 }, }, { { 323, 0 },{ 323, 0 },{ 300, 0 },{ 236, 0 },{ 195, 0 },{ 328, 0 }, }, }, }; // AC context equations LINE_EQ AcNodeEqs[PREC_CASES][VP5_AC_BANDS-3][CONTEXT_NODES][TOKEN_CONTEXTS] = { { // Preceded by 0 { // Band 0 { { 276, 0 },{ 238, 0 },{ 195, 0 },{ 156, 0 },{ 113, 0 },{ 274, 0 }, }, { { 0, 1 },{ 0, 1 },{ 0, 1 },{ 0, 1 },{ 0, 1 },{ 0, 1 }, }, { { 192, 59 },{ 182, 50 },{ 141, 48 },{ 110, 40 },{ 92, 19 },{ 125, 128 }, }, { { 169, 87 },{ 169, 83 },{ 184, 62 },{ 220, 16 },{ 184, 0 },{ 264, 0 }, }, { { 212, 40 },{ 212, 36 },{ 169, 49 },{ 174, 27 },{ 8, 120 },{ 182, 71 }, }, }, { // Band 1 { { 259, 10 },{ 197, 19 },{ 143, 22 },{ 123, 16 },{ 110, 8 },{ 133, 88 }, }, { { 0, 1 },{ 256, 0 },{ 0, 1 },{ 0, 1 },{ 0, 1 },{ 0, 1 }, }, { { 207, 46 },{ 187, 50 },{ 97, 83 },{ 23, 100 },{ 41, 56 },{ 56, 188 }, }, { { 166, 90 },{ 146, 108 },{ 161, 88 },{ 136, 95 },{ 174, 0 },{ 266, 0 }, }, { { 264, 7 },{ 243, 18 },{ 184, 43 },{ -14, 154 },{ 20, 112 },{ 20, 199 }, }, }, { // Band 2 { { 230, 26 },{ 197, 22 },{ 159, 20 },{ 146, 12 },{ 136, 4 },{ 54, 162 }, }, { { 0, 1 },{ 0, 1 },{ 0, 1 },{ 0, 1 },{ 0, 1 },{ 0, 1 }, }, { { 192, 59 },{ 156, 72 },{ 84, 101 },{ 49, 101 },{ 79, 47 },{ 79, 167 }, }, { { 138, 115 },{ 136, 116 },{ 166, 80 },{ 238, 0 },{ 195, 0 },{ 261, 0 }, }, { { 225, 33 },{ 205, 42 },{ 159, 61 },{ 79, 96 },{ 92, 66 },{ 28, 195 }, }, }, }, { // Preceded by 1 { // Band 0 { { 200, 37 },{ 197, 18 },{ 159, 13 },{ 143, 7 },{ 102, 5 },{ 123, 126 }, }, { { 197, 3 },{ 220, -9 },{ 210, -12 },{ 187, -6 },{ 151, -2 },{ 174, 80 }, }, { { 200, 53 },{ 187, 47 },{ 159, 40 },{ 118, 38 },{ 100, 18 },{ 141, 111 }, }, { { 179, 78 },{ 166, 86 },{ 197, 50 },{ 207, 27 },{ 187, 0 },{ 115, 139 }, }, { { 218, 34 },{ 220, 29 },{ 174, 46 },{ 128, 61 },{ 54, 89 },{ 187, 65 }, }, }, { // Band 1 { { 238, 14 },{ 197, 18 },{ 125, 26 },{ 90, 25 },{ 82, 13 },{ 161, 86 }, }, { { 189, 1 },{ 205, -2 },{ 156, -4 },{ 143, -4 },{ 146, -4 },{ 172, 72 }, }, { { 230, 31 },{ 192, 45 },{ 102, 76 },{ 38, 85 },{ 56, 41 },{ 64, 173 }, }, { { 166, 91 },{ 141, 111 },{ 128, 116 },{ 118, 109 },{ 177, 0 },{ 23, 222 }, }, { { 253, 14 },{ 236, 21 },{ 174, 49 },{ 33, 118 },{ 44, 93 },{ 23, 187 }, }, }, { // Band 2 { { 218, 28 },{ 179, 28 },{ 118, 35 },{ 95, 30 },{ 72, 24 },{ 128, 108 }, }, { { 187, 1 },{ 174, -1 },{ 125, -1 },{ 110, -1 },{ 108, -1 },{ 202, 52 }, }, { { 197, 53 },{ 146, 75 },{ 46, 118 },{ 33, 103 },{ 64, 50 },{ 118, 126 }, }, { { 138, 114 },{ 128, 122 },{ 161, 86 },{ 243, -6 },{ 195, 0 },{ 38, 210 }, }, { { 215, 39 },{ 179, 58 },{ 97, 101 },{ 95, 85 },{ 87, 70 },{ 69, 152 }, }, }, }, { // Preceded by 2 { // Band 0 { { 236, 24 },{ 205, 18 },{ 172, 12 },{ 154, 6 },{ 125, 1 },{ 169, 75 }, }, { { 187, 4 },{ 230, -2 },{ 228, -4 },{ 236, -4 },{ 241, -2 },{ 192, 66 }, }, { { 200, 46 },{ 187, 42 },{ 159, 34 },{ 136, 25 },{ 105, 10 },{ 179, 62 }, }, { { 207, 55 },{ 192, 63 },{ 192, 54 },{ 195, 36 },{ 177, 1 },{ 143, 98 }, }, { { 225, 27 },{ 207, 34 },{ 200, 30 },{ 131, 57 },{ 97, 60 },{ 197, 45 }, }, }, { // Band 1 { { 271, 8 },{ 218, 13 },{ 133, 19 },{ 90, 19 },{ 72, 7 },{ 182, 51 }, }, { { 179, 1 },{ 225, -1 },{ 154, -2 },{ 110, -1 },{ 92, 0 },{ 195, 41 }, }, { { 241, 26 },{ 189, 40 },{ 82, 64 },{ 33, 60 },{ 67, 17 },{ 120, 94 }, }, { { 192, 68 },{ 151, 94 },{ 146, 90 },{ 143, 72 },{ 161, 0 },{ 113, 128 }, }, { { 256, 12 },{ 218, 29 },{ 166, 48 },{ 44, 99 },{ 31, 87 },{ 148, 78 }, }, }, { // Band 2 { { 238, 20 },{ 184, 22 },{ 113, 27 },{ 90, 22 },{ 74, 9 },{ 192, 37 }, }, { { 184, 0 },{ 215, -1 },{ 141, -1 },{ 97, 0 },{ 49, 0 },{ 264, 13 }, }, { { 182, 51 },{ 138, 61 },{ 95, 63 },{ 54, 59 },{ 64, 25 },{ 200, 45 }, }, { { 179, 75 },{ 156, 87 },{ 174, 65 },{ 177, 44 },{ 174, 0 },{ 164, 85 }, }, { { 195, 45 },{ 148, 65 },{ 105, 79 },{ 95, 72 },{ 87, 60 },{ 169, 63 }, }, }, }, }; /**************************************************************************** * Functions ***************************************************************************** */ /**************************************************************************** * * ROUTINE : ConfigureContexts * * INPUTS : Decoder Instance * * * OUTPUTS : None. * * RETURNS : None. * * FUNCTION : Configures the context dependant entropy probabilities. * * SPECIAL NOTES : None. * * * ERRORS : None. * ****************************************************************************/ void ConfigureContexts(PB_INSTANCE *pbi) { UINT32 i,j; UINT32 Band; UINT32 Node; UINT32 Plane; UINT32 Prec; INT32 Temp; // Clear MMX state so floating point can work again #ifndef MACPPC #ifndef MAPCA ClearSysState(); #endif #endif // DC Node Probabilities for ( Plane = 0; Plane < 2; Plane ++ ) { for ( i = 0; i < TOKEN_CONTEXTS; i++ ) { for ( j = 0; j < TOKEN_CONTEXTS; j++ ) { // Tree Nodes for ( Node = 0; Node < CONTEXT_NODES; Node ++ ) { Temp = ( ( pbi->DcProbs[DCProbOffset(Plane,Node)] * DcNodeEqs[Node][i][j].M + 128 ) >> 8) + DcNodeEqs[Node][i][j].C; Temp = (Temp > 254)? 254: Temp; Temp = (Temp < 1)? 1 : Temp; pbi->DcNodeContexts[DCContextOffset(Plane,i,j,Node)] = (UINT8)Temp; } } } } // AC Node Probabilities for ( Prec = 0; Prec < PREC_CASES; Prec++ ) { for ( Plane = 0; Plane < 2; Plane ++ ) { // Higher AC bands do not use contexts. for ( Band = 0; Band < VP5_AC_BANDS-3; Band++ ) { for ( i = 0; i < TOKEN_CONTEXTS; i++ ) { // Tree Nodes for ( Node = 0; Node < CONTEXT_NODES; Node ++ ) { Temp = ( ( pbi->AcProbs[ACProbOffset(Plane,Prec,Band,Node)] * AcNodeEqs[Prec][Band][Node][i].M + 128 ) >> 8) + AcNodeEqs[Prec][Band][Node][i].C; Temp = (Temp > 254)? 254: Temp; Temp = (Temp < 1)? 1 : Temp; pbi->AcNodeContexts[ACContextOffset(Plane,Prec,Band,i,Node)] = (UINT8)Temp; } } } } } }