• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

libavcodec/bgmc.c

Go to the documentation of this file.
00001 /*
00002  * Block Gilbert-Moore decoder
00003  * Copyright (c) 2010 Thilo Borgmann <thilo.borgmann _at_ googlemail.com>
00004  *
00005  * This file is part of FFmpeg.
00006  *
00007  * FFmpeg is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * FFmpeg is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with FFmpeg; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
00020  */
00021 
00029 #include "bgmc.h"
00030 
00031 
00032 #define FREQ_BITS  14                      // bits used by frequency counters
00033 #define VALUE_BITS 18                      // bits used to represent the values
00034 #define TOP_VALUE  ((1 << VALUE_BITS) - 1) // maximum value
00035 #define FIRST_QTR  (TOP_VALUE / 4 + 1)     // first quarter of values maximum value
00036 #define HALF       (2 * FIRST_QTR)         // first half of values maximum value
00037 #define THIRD_QTR  (3 * FIRST_QTR)         // third quarter of values maximum value
00038 
00039 #define LUT_BITS   (FREQ_BITS - 8)         // number of bits used to index lookup tables
00040 #define LUT_SIZE   (1 << LUT_BITS)         // size of the lookup tables
00041 #define LUT_BUFF   4                       // number of buffered lookup tables
00042 
00043 
00046 static const uint16_t cf_tables_1[3][129] = {
00047     {
00048     16384, 16066, 15748, 15431, 15114, 14799, 14485, 14173, 13861, 13552,
00049     13243, 12939, 12635, 12336, 12038, 11745, 11452, 11161, 10870, 10586,
00050     10303, 10027,  9751,  9483,  9215,  8953,  8692,  8440,  8189,  7946,
00051      7704,  7472,  7240,  7008,  6776,  6554,  6333,  6122,  5912,  5711,
00052      5512,  5320,  5128,  4947,  4766,  4595,  4425,  4264,  4104,  3946,
00053      3788,  3640,  3493,  3355,  3218,  3090,  2963,  2842,  2721,  2609,
00054      2498,  2395,  2292,  2196,  2100,  2004,  1908,  1820,  1732,  1651,
00055      1570,  1497,  1424,  1355,  1287,  1223,  1161,  1100,  1044,   988,
00056       938,   888,   839,   790,   746,   702,   662,   623,   588,   553,
00057       520,   488,   459,   431,   405,   380,   357,   334,   311,   288,
00058       268,   248,   230,   213,   197,   182,   168,   154,   142,   130,
00059       119,   108,    99,    90,    81,    72,    64,    56,    49,    42,
00060        36,    30,    25,    20,    15,    11,     7,     3,     0
00061    },
00062    {
00063     16384, 16080, 15776, 15473, 15170, 14868, 14567, 14268, 13970, 13674,
00064     13378, 13086, 12794, 12505, 12218, 11936, 11654, 11373, 11092, 10818,
00065     10544, 10276, 10008,  9749,  9490,  9236,  8982,  8737,  8492,  8256,
00066      8020,  7792,  7564,  7336,  7108,  6888,  6669,  6459,  6249,  6050,
00067      5852,  5660,  5468,  5286,  5104,  4931,  4760,  4598,  4436,  4275,
00068      4115,  3965,  3816,  3674,  3534,  3403,  3272,  3147,  3023,  2907,
00069      2792,  2684,  2577,  2476,  2375,  2274,  2173,  2079,  1986,  1897,
00070      1810,  1724,  1645,  1567,  1493,  1419,  1351,  1284,  1222,  1161,
00071      1105,  1050,   995,   941,   891,   842,   797,   753,   713,   673,
00072       636,   599,   566,   533,   503,   473,   446,   419,   392,   365,
00073       340,   316,   294,   272,   253,   234,   216,   199,   184,   169,
00074       155,   142,   130,   118,   106,    95,    85,    75,    66,    57,
00075        49,    41,    34,    27,    21,    15,    10,     5,     0
00076    },
00077    {
00078     16384, 16092, 15801, 15510, 15219, 14930, 14641, 14355, 14069, 13785,
00079     13501, 13219, 12938, 12661, 12384, 12112, 11841, 11571, 11301, 11037,
00080     10773, 10514, 10256, 10005,  9754,  9508,  9263,  9025,  8787,  8557,
00081      8327,  8103,  7879,  7655,  7431,  7215,  7000,  6792,  6585,  6387,
00082      6190,  5998,  5807,  5625,  5445,  5272,  5100,  4937,  4774,  4613,
00083      4452,  4301,  4150,  4007,  3865,  3731,  3597,  3469,  3341,  3218,
00084      3099,  2981,  2869,  2758,  2652,  2546,  2440,  2334,  2234,  2134,
00085      2041,  1949,  1864,  1779,  1699,  1620,  1547,  1474,  1407,  1340,
00086      1278,  1217,  1157,  1097,  1043,   989,   940,   891,   846,   801,
00087       759,   718,   680,   643,   609,   575,   543,   511,   479,   447,
00088       418,   389,   363,   337,   314,   291,   270,   249,   230,   212,
00089       195,   179,   164,   149,   135,   121,   108,    96,    85,    74,
00090        64,    54,    45,    36,    28,    20,    13,     6,     0
00091    }
00092 };
00093 
00094 
00095 static const uint16_t cf_tables_2[8][193] = {
00096     {
00097     16384, 16104, 15825, 15546, 15268, 14991, 14714, 14439, 14164, 13891,
00098     13620, 13350, 13081, 12815, 12549, 12287, 12025, 11765, 11505, 11250,
00099     10996, 10746, 10497, 10254, 10011,  9772,  9534,  9303,  9072,  8848,
00100      8624,  8406,  8188,  7970,  7752,  7539,  7327,  7123,  6919,  6724,
00101      6529,  6339,  6150,  5970,  5790,  5618,  5446,  5282,  5119,  4957,
00102      4795,  4642,  4490,  4345,  4201,  4065,  3929,  3798,  3669,  3547,
00103      3425,  3310,  3196,  3086,  2976,  2866,  2756,  2650,  2545,  2447,
00104      2350,  2260,  2170,  2085,  2000,  1921,  1843,  1770,  1698,  1632,
00105      1566,  1501,  1436,  1376,  1316,  1261,  1207,  1157,  1108,  1061,
00106      1015,   973,   931,   893,   855,   819,   783,   747,   711,   677,
00107       644,   614,   584,   557,   530,   505,   480,   458,   436,   416,
00108       396,   378,   360,   343,   326,   310,   295,   281,   267,   255,
00109       243,   232,   221,   211,   201,   192,   183,   174,   166,   158,
00110       150,   142,   134,   126,   119,   112,   106,   100,    95,    90,
00111        85,    80,    76,    72,    69,    66,    63,    60,    57,    54,
00112        51,    48,    46,    44,    42,    40,    38,    36,    34,    33,
00113        32,    31,    30,    29,    28,    27,    26,    25,    24,    23,
00114        22,    21,    20,    19,    18,    17,    16,    15,    14,    13,
00115        12,    11,    10,     9,     8,     7,     6,     5,     4,     3,
00116         2,     1,     0
00117     },
00118     {
00119     16384, 16116, 15849, 15582, 15316, 15050, 14785, 14521, 14257, 13995,
00120     13734, 13476, 13218, 12963, 12708, 12457, 12206, 11956, 11706, 11460,
00121     11215, 10975, 10735, 10500, 10265, 10034,  9803,  9579,  9355,  9136,
00122      8917,  8703,  8489,  8275,  8061,  7853,  7645,  7444,  7244,  7051,
00123      6858,  6671,  6484,  6305,  6127,  5956,  5785,  5622,  5459,  5298,
00124      5137,  4983,  4830,  4684,  4539,  4401,  4263,  4131,  3999,  3874,
00125      3750,  3632,  3515,  3401,  3287,  3173,  3059,  2949,  2840,  2737,
00126      2635,  2539,  2444,  2354,  2264,  2181,  2098,  2020,  1943,  1872,
00127      1801,  1731,  1661,  1596,  1532,  1472,  1412,  1357,  1303,  1251,
00128      1200,  1153,  1106,  1063,  1020,   979,   938,   897,   856,   818,
00129       780,   746,   712,   681,   650,   621,   592,   566,   540,   517,
00130       494,   473,   452,   431,   410,   391,   373,   356,   340,   325,
00131       310,   296,   282,   270,   258,   247,   236,   225,   214,   203,
00132       192,   182,   172,   162,   153,   144,   136,   128,   121,   114,
00133       108,   102,    97,    92,    87,    82,    77,    73,    69,    65,
00134        62,    59,    56,    53,    50,    47,    45,    43,    41,    39,
00135        37,    35,    33,    31,    29,    27,    26,    25,    24,    23,
00136        22,    21,    20,    19,    18,    17,    16,    15,    14,    13,
00137        12,    11,    10,     9,     8,     7,     6,     5,     4,     3,
00138         2,     1,     0
00139     },
00140     {
00141     16384, 16128, 15872, 15617, 15362, 15107, 14853, 14600, 14347, 14096,
00142     13846, 13597, 13350, 13105, 12860, 12618, 12376, 12135, 11894, 11657,
00143     11421, 11189, 10957, 10730, 10503, 10279, 10056,  9838,  9620,  9407,
00144      9195,  8987,  8779,  8571,  8363,  8159,  7955,  7758,  7561,  7371,
00145      7182,  6997,  6812,  6635,  6459,  6289,  6120,  5957,  5795,  5634,
00146      5473,  5319,  5165,  5018,  4871,  4732,  4593,  4458,  4324,  4197,
00147      4071,  3951,  3831,  3714,  3597,  3480,  3363,  3250,  3138,  3032,
00148      2927,  2828,  2729,  2635,  2541,  2453,  2366,  2284,  2202,  2126,
00149      2050,  1975,  1900,  1830,  1761,  1697,  1633,  1574,  1515,  1459,
00150      1403,  1351,  1300,  1252,  1205,  1160,  1115,  1070,  1025,   982,
00151       939,   899,   860,   824,   789,   756,   723,   693,   663,   636,
00152       609,   584,   559,   535,   511,   489,   467,   447,   427,   409,
00153       391,   374,   358,   343,   328,   313,   300,   287,   274,   261,
00154       248,   235,   223,   211,   200,   189,   179,   169,   160,   151,
00155       143,   135,   128,   121,   115,   109,   103,    97,    92,    87,
00156        82,    77,    73,    69,    65,    61,    58,    55,    52,    49,
00157        46,    43,    40,    37,    35,    33,    31,    29,    27,    25,
00158        23,    21,    20,    19,    18,    17,    16,    15,    14,    13,
00159        12,    11,    10,     9,     8,     7,     6,     5,     4,     3,
00160         2,     1,     0
00161     },
00162     {
00163     16384, 16139, 15894, 15649, 15405, 15162, 14919, 14677, 14435, 14195,
00164     13955, 13717, 13479, 13243, 13008, 12775, 12542, 12310, 12079, 11851,
00165     11623, 11399, 11176, 10956, 10737, 10521, 10305, 10094,  9883,  9677,
00166      9471,  9268,  9065,  8862,  8659,  8459,  8260,  8067,  7874,  7688,
00167      7502,  7321,  7140,  6965,  6790,  6621,  6452,  6290,  6128,  5968,
00168      5808,  5655,  5503,  5356,  5209,  5069,  4929,  4794,  4660,  4532,
00169      4404,  4282,  4160,  4041,  3922,  3803,  3684,  3568,  3452,  3343,
00170      3234,  3131,  3029,  2931,  2833,  2741,  2649,  2563,  2477,  2396,
00171      2316,  2236,  2157,  2083,  2009,  1940,  1871,  1807,  1743,  1683,
00172      1623,  1567,  1511,  1459,  1407,  1357,  1307,  1257,  1207,  1159,
00173      1111,  1067,  1023,   983,   943,   905,   868,   834,   800,   769,
00174       738,   709,   681,   653,   625,   600,   575,   552,   529,   508,
00175       487,   466,   447,   428,   410,   392,   376,   360,   344,   328,
00176       313,   298,   283,   268,   255,   242,   230,   218,   207,   196,
00177       186,   176,   167,   158,   150,   142,   135,   128,   121,   114,
00178       108,   102,    97,    92,    87,    82,    78,    74,    70,    66,
00179        62,    58,    54,    50,    47,    44,    41,    38,    35,    32,
00180        30,    28,    26,    24,    22,    20,    18,    16,    14,    13,
00181        12,    11,    10,     9,     8,     7,     6,     5,     4,     3,
00182         2,     1,     0
00183     },
00184     {
00185     16384, 16149, 15915, 15681, 15447, 15214, 14981, 14749, 14517, 14286,
00186     14055, 13827, 13599, 13373, 13147, 12923, 12699, 12476, 12253, 12034,
00187     11815, 11599, 11383, 11171, 10959, 10750, 10541, 10337, 10133,  9933,
00188      9733,  9536,  9339,  9142,  8945,  8751,  8557,  8369,  8181,  7998,
00189      7816,  7638,  7460,  7288,  7116,  6950,  6785,  6625,  6465,  6306,
00190      6147,  5995,  5843,  5697,  5551,  5411,  5271,  5135,  5000,  4871,
00191      4742,  4618,  4495,  4374,  4253,  4132,  4011,  3893,  3775,  3663,
00192      3552,  3446,  3340,  3239,  3138,  3043,  2948,  2858,  2768,  2684,
00193      2600,  2516,  2433,  2355,  2278,  2205,  2133,  2065,  1997,  1932,
00194      1867,  1807,  1747,  1690,  1634,  1580,  1526,  1472,  1418,  1366,
00195      1314,  1266,  1218,  1174,  1130,  1088,  1047,  1009,   971,   936,
00196       901,   868,   836,   804,   772,   743,   714,   685,   658,   631,
00197       606,   582,   559,   536,   515,   494,   475,   456,   437,   418,
00198       399,   380,   362,   344,   328,   312,   297,   283,   270,   257,
00199       245,   233,   222,   211,   201,   191,   181,   172,   163,   155,
00200       147,   139,   132,   125,   119,   113,   107,   101,    96,    91,
00201        86,    81,    76,    71,    66,    62,    58,    54,    50,    46,
00202        43,    40,    37,    34,    31,    28,    26,    24,    22,    20,
00203        18,    16,    14,    12,    10,     8,     6,     5,     4,     3,
00204         2,     1,     0
00205     },
00206     {
00207     16384, 16159, 15934, 15709, 15485, 15261, 15038, 14816, 14594, 14373,
00208     14152, 13933, 13714, 13497, 13280, 13065, 12850, 12636, 12422, 12211,
00209     12000, 11791, 11583, 11378, 11173, 10971, 10769, 10571, 10373, 10179,
00210      9985,  9793,  9601,  9409,  9217,  9029,  8842,  8658,  8475,  8297,
00211      8120,  7946,  7773,  7604,  7435,  7271,  7108,  6950,  6792,  6634,
00212      6477,  6326,  6175,  6029,  5883,  5742,  5602,  5466,  5330,  5199,
00213      5068,  4943,  4818,  4696,  4574,  4452,  4330,  4211,  4093,  3979,
00214      3866,  3759,  3652,  3549,  3446,  3348,  3250,  3157,  3065,  2977,
00215      2889,  2802,  2716,  2634,  2553,  2476,  2399,  2326,  2254,  2185,
00216      2117,  2052,  1987,  1926,  1866,  1808,  1750,  1692,  1634,  1578,
00217      1522,  1470,  1418,  1369,  1321,  1275,  1229,  1187,  1145,  1105,
00218      1066,  1027,   991,   955,   919,   883,   850,   817,   786,   756,
00219       728,   700,   674,   648,   624,   600,   578,   556,   534,   512,
00220       490,   468,   447,   426,   407,   388,   371,   354,   338,   322,
00221       307,   293,   280,   267,   255,   243,   231,   219,   209,   199,
00222       189,   179,   170,   161,   153,   145,   138,   131,   124,   117,
00223       111,   105,    99,    93,    87,    81,    76,    71,    66,    61,
00224        57,    53,    49,    45,    42,    39,    36,    33,    30,    27,
00225        24,    21,    19,    17,    15,    13,    11,     9,     7,     5,
00226         3,     1,     0
00227     },
00228     {
00229     16384, 16169, 15954, 15739, 15524, 15310, 15096, 14883, 14670, 14458,
00230     14246, 14035, 13824, 13614, 13405, 13198, 12991, 12785, 12579, 12376,
00231     12173, 11972, 11772, 11574, 11377, 11182, 10987, 10795, 10603, 10414,
00232     10226, 10040,  9854,  9668,  9482,  9299,  9116,  8937,  8759,  8585,
00233      8411,  8241,  8071,  7906,  7741,  7580,  7419,  7263,  7107,  6952,
00234      6797,  6647,  6497,  6353,  6209,  6070,  5931,  5796,  5661,  5531,
00235      5401,  5275,  5150,  5027,  4904,  4781,  4658,  4538,  4419,  4304,
00236      4190,  4081,  3972,  3867,  3762,  3662,  3562,  3467,  3372,  3281,
00237      3191,  3101,  3012,  2928,  2844,  2764,  2684,  2608,  2533,  2460,
00238      2387,  2318,  2250,  2185,  2121,  2059,  1997,  1935,  1873,  1813,
00239      1754,  1698,  1642,  1588,  1535,  1483,  1433,  1384,  1338,  1292,
00240      1249,  1206,  1165,  1125,  1085,  1045,  1008,   971,   937,   903,
00241       871,   840,   810,   780,   752,   724,   698,   672,   647,   622,
00242       597,   572,   548,   524,   502,   480,   460,   440,   421,   403,
00243       386,   369,   353,   337,   323,   309,   295,   281,   268,   255,
00244       243,   231,   220,   209,   199,   189,   180,   171,   163,   155,
00245       147,   139,   131,   123,   116,   109,   102,    95,    89,    83,
00246        77,    72,    67,    62,    57,    52,    48,    44,    40,    36,
00247        32,    28,    25,    22,    19,    16,    13,    10,     8,     6,
00248         4,     2,     0
00249     },
00250     {
00251     16384, 16177, 15970, 15764, 15558, 15353, 15148, 14944, 14740, 14537,
00252     14334, 14132, 13930, 13729, 13529, 13330, 13131, 12933, 12735, 12539,
00253     12343, 12150, 11957, 11766, 11576, 11388, 11200, 11015, 10830, 10647,
00254     10465, 10285, 10105,  9925,  9745,  9568,  9391,  9218,  9045,  8876,
00255      8707,  8541,  8375,  8213,  8051,  7894,  7737,  7583,  7429,  7277,
00256      7125,  6977,  6830,  6687,  6544,  6406,  6268,  6133,  5998,  5868,
00257      5738,  5612,  5487,  5364,  5241,  5118,  4995,  4875,  4755,  4640,
00258      4525,  4414,  4304,  4198,  4092,  3990,  3888,  3790,  3693,  3600,
00259      3507,  3415,  3323,  3235,  3147,  3064,  2981,  2902,  2823,  2746,
00260      2670,  2594,  2522,  2450,  2382,  2314,  2248,  2182,  2116,  2050,
00261      1987,  1924,  1864,  1804,  1748,  1692,  1638,  1585,  1534,  1484,
00262      1437,  1390,  1346,  1302,  1258,  1215,  1174,  1133,  1095,  1057,
00263      1021,   986,   952,   918,   887,   856,   827,   798,   770,   742,
00264       714,   686,   659,   632,   607,   582,   559,   536,   514,   492,
00265       472,   452,   433,   415,   398,   381,   364,   348,   333,   318,
00266       304,   290,   277,   264,   252,   240,   229,   218,   208,   198,
00267       188,   178,   168,   158,   149,   140,   132,   124,   116,   108,
00268       101,    94,    87,    81,    75,    69,    64,    59,    54,    49,
00269        44,    39,    35,    31,    27,    23,    19,    15,    12,     9,
00270         6,     3,     0
00271     }
00272 };
00273 
00274 
00275 static const uint16_t cf_tables_3[5][257] = {
00276     {
00277     16384, 16187, 15990, 15793, 15597, 15401, 15205, 15009, 14813, 14618,
00278     14423, 14230, 14037, 13845, 13653, 13463, 13273, 13083, 12894, 12706,
00279     12518, 12332, 12146, 11962, 11778, 11597, 11416, 11237, 11059, 10882,
00280     10706, 10532, 10358, 10184, 10010,  9838,  9666,  9497,  9328,  9163,
00281      8999,  8837,  8675,  8517,  8359,  8205,  8051,  7901,  7751,  7602,
00282      7453,  7308,  7163,  7022,  6882,  6745,  6609,  6476,  6343,  6214,
00283      6085,  5960,  5835,  5712,  5589,  5466,  5343,  5223,  5103,  4987,
00284      4872,  4761,  4650,  4542,  4435,  4332,  4229,  4130,  4031,  3936,
00285      3841,  3747,  3653,  3563,  3473,  3387,  3302,  3220,  3138,  3059,
00286      2980,  2905,  2830,  2759,  2688,  2619,  2550,  2481,  2412,  2345,
00287      2278,  2215,  2152,  2092,  2032,  1974,  1917,  1863,  1809,  1758,
00288      1707,  1659,  1611,  1564,  1517,  1473,  1429,  1387,  1346,  1307,
00289      1268,  1230,  1193,  1158,  1123,  1090,  1058,  1026,   994,   962,
00290       930,   899,   869,   841,   813,   786,   760,   735,   710,   687,
00291       664,   643,   622,   602,   582,   562,   543,   525,   507,   490,
00292       473,   457,   442,   427,   412,   398,   385,   373,   361,   349,
00293       337,   325,   313,   301,   290,   279,   269,   259,   249,   240,
00294       231,   222,   214,   206,   199,   192,   185,   178,   171,   165,
00295       159,   153,   148,   143,   138,   133,   128,   123,   119,   115,
00296       111,   107,   103,    99,    95,    91,    87,    83,    80,    77,
00297        74,    71,    68,    65,    63,    61,    59,    57,    55,    53,
00298        51,    49,    47,    45,    43,    41,    40,    39,    38,    37,
00299        36,    35,    34,    33,    32,    31,    30,    29,    28,    27,
00300        26,    25,    24,    23,    22,    21,    20,    19,    18,    17,
00301        16,    15,    14,    13,    12,    11,    10,     9,     8,     7,
00302         6,     5,     4,     3,     2,     1,     0
00303     },
00304     {
00305     16384, 16195, 16006, 15817, 15629, 15441, 15253, 15065, 14878, 14692,
00306     14506, 14321, 14136, 13952, 13768, 13585, 13402, 13219, 13037, 12857,
00307     12677, 12499, 12321, 12144, 11967, 11792, 11617, 11444, 11271, 11100,
00308     10930, 10762, 10594, 10426, 10258, 10091,  9925,  9761,  9598,  9438,
00309      9278,  9120,  8963,  8809,  8655,  8504,  8354,  8207,  8060,  7914,
00310      7769,  7627,  7485,  7347,  7209,  7074,  6939,  6807,  6676,  6548,
00311      6420,  6296,  6172,  6050,  5928,  5806,  5684,  5564,  5444,  5328,
00312      5212,  5100,  4988,  4879,  4771,  4667,  4563,  4462,  4362,  4265,
00313      4169,  4073,  3978,  3886,  3795,  3707,  3619,  3535,  3451,  3369,
00314      3288,  3210,  3133,  3059,  2985,  2913,  2841,  2769,  2697,  2627,
00315      2557,  2490,  2424,  2360,  2297,  2237,  2177,  2119,  2062,  2007,
00316      1953,  1901,  1849,  1798,  1748,  1700,  1652,  1607,  1562,  1519,
00317      1476,  1435,  1394,  1355,  1317,  1281,  1245,  1210,  1175,  1140,
00318      1105,  1071,  1037,  1005,   973,   943,   913,   885,   857,   830,
00319       804,   779,   754,   731,   708,   685,   663,   642,   621,   601,
00320       581,   563,   545,   528,   511,   495,   479,   463,   448,   433,
00321       419,   405,   391,   377,   364,   351,   338,   326,   314,   302,
00322       291,   280,   270,   260,   251,   242,   234,   226,   218,   210,
00323       202,   195,   188,   181,   174,   168,   162,   156,   150,   144,
00324       139,   134,   129,   124,   119,   114,   109,   104,   100,    96,
00325        92,    88,    84,    80,    77,    74,    71,    68,    65,    62,
00326        59,    56,    54,    52,    50,    48,    46,    44,    42,    40,
00327        38,    36,    34,    33,    32,    31,    30,    29,    28,    27,
00328        26,    25,    24,    23,    22,    21,    20,    19,    18,    17,
00329        16,    15,    14,    13,    12,    11,    10,     9,     8,     7,
00330         6,     5,     4,     3,     2,     1,     0
00331     },
00332     {
00333     16384, 16203, 16022, 15842, 15662, 15482, 15302, 15122, 14942, 14763,
00334     14584, 14406, 14228, 14051, 13874, 13698, 13522, 13347, 13172, 12998,
00335     12824, 12652, 12480, 12310, 12140, 11971, 11803, 11637, 11471, 11307,
00336     11143, 10980, 10817, 10654, 10491, 10330, 10169, 10011,  9853,  9697,
00337      9542,  9389,  9236,  9086,  8936,  8789,  8642,  8498,  8355,  8212,
00338      8070,  7931,  7792,  7656,  7520,  7388,  7256,  7126,  6996,  6870,
00339      6744,  6621,  6498,  6377,  6256,  6135,  6014,  5895,  5776,  5660,
00340      5545,  5433,  5321,  5212,  5104,  4999,  4895,  4793,  4692,  4594,
00341      4496,  4400,  4304,  4211,  4118,  4028,  3939,  3853,  3767,  3684,
00342      3601,  3521,  3441,  3364,  3287,  3212,  3137,  3062,  2987,  2915,
00343      2843,  2773,  2704,  2638,  2572,  2508,  2445,  2384,  2324,  2266,
00344      2208,  2153,  2098,  2044,  1990,  1939,  1888,  1839,  1791,  1745,
00345      1699,  1655,  1611,  1569,  1527,  1487,  1448,  1409,  1370,  1331,
00346      1292,  1255,  1218,  1183,  1148,  1115,  1082,  1051,  1020,   990,
00347       960,   932,   904,   878,   852,   826,   801,   777,   753,   731,
00348       709,   687,   666,   645,   625,   605,   586,   567,   550,   533,
00349       516,   499,   482,   465,   449,   433,   418,   403,   389,   375,
00350       362,   349,   337,   325,   314,   303,   293,   283,   273,   263,
00351       254,   245,   236,   227,   219,   211,   204,   197,   190,   183,
00352       177,   171,   165,   159,   153,   147,   141,   135,   130,   125,
00353       120,   115,   110,   105,   101,    97,    93,    89,    85,    81,
00354        77,    74,    71,    68,    65,    62,    59,    56,    53,    51,
00355        49,    47,    45,    43,    41,    39,    37,    35,    33,    31,
00356        29,    27,    25,    23,    22,    21,    20,    19,    18,    17,
00357        16,    15,    14,    13,    12,    11,    10,     9,     8,     7,
00358         6,     5,     4,     3,     2,     1,     0
00359     },
00360     {
00361     16384, 16210, 16036, 15863, 15690, 15517, 15344, 15172, 15000, 14828,
00362     14656, 14485, 14314, 14145, 13976, 13808, 13640, 13472, 13304, 13137,
00363     12970, 12804, 12639, 12475, 12312, 12149, 11987, 11827, 11667, 11508,
00364     11349, 11192, 11035, 10878, 10721, 10565, 10410, 10257, 10104,  9953,
00365      9802,  9654,  9506,  9359,  9213,  9070,  8927,  8787,  8647,  8508,
00366      8369,  8233,  8097,  7964,  7831,  7700,  7570,  7442,  7315,  7190,
00367      7065,  6943,  6821,  6701,  6581,  6461,  6341,  6223,  6105,  5990,
00368      5876,  5764,  5653,  5545,  5437,  5331,  5226,  5124,  5022,  4924,
00369      4826,  4729,  4632,  4538,  4444,  4353,  4262,  4174,  4087,  4002,
00370      3917,  3835,  3753,  3674,  3595,  3518,  3441,  3364,  3287,  3212,
00371      3138,  3066,  2995,  2926,  2858,  2792,  2726,  2662,  2599,  2538,
00372      2478,  2420,  2362,  2305,  2249,  2195,  2141,  2089,  2037,  1988,
00373      1939,  1891,  1844,  1799,  1754,  1711,  1668,  1626,  1584,  1542,
00374      1500,  1459,  1418,  1380,  1342,  1305,  1269,  1234,  1199,  1166,
00375      1133,  1102,  1071,  1041,  1012,   983,   954,   926,   899,   872,
00376       847,   822,   798,   774,   751,   728,   707,   686,   666,   646,
00377       627,   608,   589,   570,   552,   534,   517,   500,   484,   468,
00378       453,   438,   424,   410,   397,   384,   372,   360,   348,   336,
00379       325,   314,   303,   293,   283,   273,   264,   255,   246,   237,
00380       229,   221,   213,   205,   197,   189,   181,   174,   167,   160,
00381       154,   148,   142,   136,   131,   126,   121,   116,   111,   106,
00382       101,    97,    93,    89,    85,    81,    77,    73,    70,    67,
00383        64,    61,    58,    55,    52,    49,    46,    43,    40,    37,
00384        35,    33,    31,    29,    27,    25,    23,    21,    19,    17,
00385        16,    15,    14,    13,    12,    11,    10,     9,     8,     7,
00386         6,     5,     4,     3,     2,     1,     0
00387     },
00388     {
00389     16384, 16218, 16052, 15886, 15720, 15554, 15389, 15224, 15059, 14895,
00390     14731, 14567, 14403, 14240, 14077, 13915, 13753, 13591, 13429, 13269,
00391     13109, 12950, 12791, 12633, 12476, 12320, 12164, 12009, 11854, 11701,
00392     11548, 11396, 11244, 11092, 10940, 10790, 10640, 10492, 10344, 10198,
00393     10052,  9908,  9764,  9622,  9481,  9342,  9203,  9066,  8929,  8793,
00394      8657,  8524,  8391,  8261,  8131,  8003,  7875,  7749,  7624,  7502,
00395      7380,  7260,  7140,  7022,  6904,  6786,  6668,  6551,  6435,  6322,
00396      6209,  6099,  5989,  5881,  5773,  5668,  5563,  5461,  5359,  5260,
00397      5161,  5063,  4965,  4871,  4777,  4686,  4595,  4506,  4417,  4331,
00398      4245,  4162,  4079,  3999,  3919,  3841,  3763,  3685,  3607,  3530,
00399      3454,  3380,  3307,  3236,  3166,  3097,  3029,  2963,  2897,  2834,
00400      2771,  2710,  2650,  2591,  2532,  2475,  2418,  2363,  2309,  2257,
00401      2205,  2155,  2105,  2057,  2009,  1963,  1918,  1873,  1828,  1783,
00402      1738,  1694,  1650,  1607,  1565,  1524,  1484,  1445,  1407,  1369,
00403      1333,  1297,  1263,  1229,  1197,  1165,  1134,  1103,  1073,  1043,
00404      1015,   987,   960,   933,   907,   882,   858,   834,   811,   788,
00405       766,   744,   722,   700,   679,   658,   638,   618,   599,   581,
00406       563,   545,   528,   511,   495,   480,   465,   451,   437,   423,
00407       410,   397,   384,   372,   360,   348,   337,   326,   315,   305,
00408       295,   285,   275,   265,   255,   245,   236,   227,   219,   211,
00409       203,   195,   188,   181,   174,   167,   161,   155,   149,   143,
00410       137,   131,   126,   121,   116,   111,   106,   101,    97,    93,
00411        89,    85,    81,    77,    73,    69,    65,    61,    58,    55,
00412        52,    49,    46,    43,    40,    37,    34,    32,    30,    28,
00413        26,    24,    22,    20,    18,    16,    14,    12,    10,     8,
00414         6,     5,     4,     3,     2,     1,     0
00415     }
00416 };
00417 
00418 
00419 static const uint16_t * const cf_table[16] = {
00420     cf_tables_1[0], cf_tables_1[1], cf_tables_1[2], cf_tables_2[0],
00421     cf_tables_2[1], cf_tables_2[2], cf_tables_2[3], cf_tables_2[4],
00422     cf_tables_2[5], cf_tables_2[6], cf_tables_2[7], cf_tables_3[0],
00423     cf_tables_3[1], cf_tables_3[2], cf_tables_3[3], cf_tables_3[4]
00424 };
00425 
00426 
00429 static void bgmc_lut_fillp(uint8_t *lut, unsigned int *lut_status,
00430                            unsigned int delta)
00431 {
00432     unsigned int sx, i;
00433 
00434     for (sx = 0; sx < 16; sx++)
00435         for (i = 0; i < LUT_SIZE; i++) {
00436             unsigned int target = (i + 1) << (FREQ_BITS - LUT_BITS);
00437             unsigned int symbol = 1 << delta;
00438 
00439             while (cf_table[sx][symbol] > target)
00440                 symbol += 1 << delta;
00441 
00442             *lut++ = symbol >> delta;
00443         }
00444 
00445     *lut_status = delta;
00446 }
00447 
00448 
00451 static uint8_t* bgmc_lut_getp(uint8_t *lut, unsigned int *lut_status,
00452                               unsigned int delta)
00453 {
00454     unsigned int i = av_clip(delta, 0, LUT_BUFF - 1);
00455 
00456     lut += (i * LUT_SIZE) << 4;
00457 
00458     if (lut_status[i] != delta)
00459         bgmc_lut_fillp(lut, &lut_status[i], delta);
00460 
00461     return lut;
00462 }
00463 
00464 
00467 int ff_bgmc_init(AVCodecContext *avctx, uint8_t **cf_lut, unsigned int **cf_lut_status)
00468 {
00469     *cf_lut        = av_malloc(sizeof(*cf_lut       ) * LUT_BUFF * 16 * LUT_SIZE);
00470     *cf_lut_status = av_malloc(sizeof(*cf_lut_status) * LUT_BUFF);
00471 
00472     if (!cf_lut || !cf_lut_status) {
00473         ff_bgmc_end(cf_lut, cf_lut_status);
00474         av_log(avctx, AV_LOG_ERROR, "Allocating buffer memory failed.\n");
00475         return AVERROR(ENOMEM);
00476     }
00477 
00478     return 0;
00479 }
00480 
00481 
00484 void ff_bgmc_end(uint8_t **cf_lut, unsigned int **cf_lut_status)
00485 {
00486     av_freep(cf_lut);
00487     av_freep(cf_lut_status);
00488 }
00489 
00490 
00493 void ff_bgmc_decode_init(GetBitContext *gb,
00494                       unsigned int *h, unsigned int *l, unsigned int *v)
00495 {
00496     *h = TOP_VALUE;
00497     *l = 0;
00498     *v = get_bits_long(gb, VALUE_BITS);
00499 }
00500 
00501 
00504 void ff_bgmc_decode_end(GetBitContext *gb)
00505 {
00506     skip_bits_long(gb, -(VALUE_BITS - 2));
00507 }
00508 
00509 
00512 void ff_bgmc_decode(GetBitContext *gb, unsigned int num, int32_t *dst,
00513                  unsigned int delta, unsigned int sx,
00514                  unsigned int *h, unsigned int *l, unsigned int *v,
00515                  uint8_t *cf_lut, unsigned int *cf_lut_status)
00516 {
00517     unsigned int i;
00518     uint8_t *lut = bgmc_lut_getp(cf_lut, cf_lut_status, delta);
00519 
00520     // read current state
00521     unsigned int high   = *h;
00522     unsigned int low    = *l;
00523     unsigned int value  = *v;
00524 
00525     lut += sx * LUT_SIZE;
00526 
00527     // decode num samples
00528     for (i = 0; i < num; i++) {
00529         unsigned int range  = high - low + 1;
00530         unsigned int target = (((value - low + 1) << FREQ_BITS) - 1) / range;
00531         unsigned int symbol = lut[target >> (FREQ_BITS - LUT_BITS)] << delta;
00532 
00533         while (cf_table[sx][symbol] > target)
00534             symbol += 1 << delta;
00535 
00536         symbol = (symbol >> delta) - 1;
00537 
00538         high = low + ((range * cf_table[sx][(symbol    ) << delta] - (1 << FREQ_BITS)) >> FREQ_BITS);
00539         low  = low + ((range * cf_table[sx][(symbol + 1) << delta]                   ) >> FREQ_BITS);
00540 
00541         while (1) {
00542             if (high >= HALF) {
00543                 if        (low >= HALF) {
00544                     value -= HALF;
00545                     low   -= HALF;
00546                     high  -= HALF;
00547                 } else if (low >= FIRST_QTR && high < THIRD_QTR) {
00548                     value -= FIRST_QTR;
00549                     low   -= FIRST_QTR;
00550                     high  -= FIRST_QTR;
00551                 } else break;
00552             }
00553 
00554             low   *= 2;
00555             high   = 2 * high  + 1;
00556             value  = 2 * value + get_bits1(gb);
00557         }
00558 
00559         *dst++ = symbol;
00560     }
00561 
00562     // save current state
00563     *h = high;
00564     *l = low;
00565     *v = value;
00566 }
00567 

Generated on Fri Sep 16 2011 17:17:34 for FFmpeg by  doxygen 1.7.1