]> git.sesse.net Git - ffmpeg/blob - libavcodec/imcdata.h
avformat/avio: Add Metacube support
[ffmpeg] / libavcodec / imcdata.h
1 /*
2  * IMC compatible decoder
3  * Copyright (c) 2002-2004 Maxim Poliakovski
4  * Copyright (c) 2006 Benjamin Larsson
5  * Copyright (c) 2006 Konstantin Shishkov
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23
24 #ifndef AVCODEC_IMCDATA_H
25 #define AVCODEC_IMCDATA_H
26
27 #include <stdint.h>
28
29 static const uint16_t band_tab[33] = {
30       0,   3,   6,   9,  12,  16,  20,  24,  29,  34,  40,
31      46,  53,  60,  68,  76,  84,  93, 102, 111, 121, 131,
32     141, 151, 162, 173, 184, 195, 207, 219, 231, 243, 256,
33 };
34
35
36 static const int8_t cyclTab[32] = {
37     1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
38    12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23,
39    24, 25, 26, 27, 28, 29, 30, 31, 32, 32,
40 };
41
42 static const int8_t cyclTab2[32] = {
43    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
44  12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22,
45 23, 24, 25, 26, 27, 28, 29};
46
47 static const float imc_weights1[31] = {
48     0.119595, 0.123124, 0.129192, 9.97377e-2, 8.1923e-2, 9.61153e-2, 8.77885e-2, 8.61174e-2,
49     9.00882e-2, 9.91658e-2, 0.112991, 0.131126, 0.152886, 0.177292, 0.221782, 0.244917, 0.267386,
50     0.306816, 0.323046, 0.33729, 0.366773, 0.392557, 0.398076, 0.403302, 0.42451, 0.444777,
51     0.449188, 0.455445, 0.477853, 0.500669, 0.510395};
52
53 static const float imc_weights2[31] = {
54     3.23466e-3, 3.49886e-3, 3.98413e-3, 1.98116e-3, 1.16465e-3, 1.79283e-3, 1.40372e-3, 1.33274e-3,
55     1.50523e-3, 1.95064e-3, 2.77472e-3, 4.14725e-3, 6.2776e-3, 9.36401e-3, 1.71397e-2, 2.24052e-2,
56     2.83971e-2, 4.11689e-2, 4.73165e-2, 5.31631e-2, 6.66614e-2, 8.00824e-2, 8.31588e-2, 8.61397e-2,
57     9.89229e-2, 0.112197, 0.115227, 0.119613, 0.136174, 0.15445, 0.162685};
58
59 static const float imc_quantizer1[4][8] = {
60     { 8.4431201e-1, 4.7358301e-1, 1.448354, 2.7073899e-1, 7.4449003e-1, 1.241991,  1.845484,  0.0},
61     { 8.6876702e-1, 4.7659001e-1, 1.478224, 2.5672799e-1, 7.55777e-1,   1.3229851, 2.03438,   0.0},
62     { 7.5891501e-1, 6.2272799e-1, 1.271322, 3.47904e-1,   7.5317699e-1, 1.150767,  1.628476,  0.0},
63     { 7.65257e-1,   6.44647e-1,   1.263824, 3.4548101e-1, 7.6384902e-1, 1.214466,  1.7638789, 0.0},
64 };
65
66 static const float imc_quantizer2[2][56] = {
67     { 1.39236e-1, 3.50548e-1, 5.9547901e-1, 8.5772401e-1, 1.121545, 1.3882281, 1.695882, 2.1270809,
68       7.2221003e-2, 1.85177e-1, 2.9521701e-1, 4.12568e-1, 5.4068601e-1, 6.7679501e-1, 8.1196898e-1, 9.4765198e-1,
69       1.0779999, 1.203415, 1.337265, 1.481871, 1.639982, 1.814766, 2.0701399, 2.449862,
70       3.7533998e-2, 1.02722e-1, 1.6021401e-1, 2.16043e-1, 2.7231601e-1, 3.3025399e-1, 3.9022601e-1, 4.52849e-1,
71       5.1794899e-1, 5.8529502e-1, 6.53956e-1, 7.2312802e-1, 7.9150802e-1, 8.5891002e-1, 9.28141e-1, 9.9706203e-1,
72       1.062153, 1.12564, 1.189834, 1.256122, 1.324469, 1.3955311, 1.468906, 1.545084,
73       1.6264729, 1.711524, 1.802705, 1.91023, 2.0533991, 2.22333, 2.4830019, 3.253329 },
74     { 1.11654e-1, 3.54469e-1, 6.4232099e-1, 9.6128798e-1, 1.295053, 1.61777, 1.989839, 2.51107,
75       5.7721999e-2, 1.69879e-1, 2.97589e-1, 4.3858799e-1, 5.9039903e-1, 7.4934798e-1, 9.1628098e-1, 1.087297,
76       1.262751, 1.4288321, 1.6040879, 1.79067, 2.000668, 2.2394669, 2.649332, 5.2760072,
77       2.9722e-2, 8.7316997e-2, 1.4445201e-1, 2.04247e-1, 2.6879501e-1, 3.3716801e-1, 4.08811e-1, 4.8306999e-1,
78       5.6049401e-1, 6.3955498e-1, 7.2044599e-1, 8.0427998e-1, 8.8933599e-1, 9.7537601e-1, 1.062461, 1.1510431,
79       1.240236, 1.326715, 1.412513, 1.500502, 1.591749, 1.686413, 1.785239, 1.891233,
80       2.0051291, 2.127681, 2.2709141, 2.475826, 2.7219379, 3.101985, 4.686213, 6.2287788},
81 };
82
83
84 static const float xTab[14] = {7.6, 3.6, 4.4, 3.7, 6.1, 5.1, 2.3, 1.6, 6.2, 1.5, 1.8, 1.2, 0, 0}; //10014048
85
86 /* precomputed table for 10^(i/4), i=-15..16 */
87 static const float imc_exp_tab[32] = {
88     1.778280e-4, 3.162278e-4, 5.623413e-4, 1.000000e-3,
89     1.778280e-3, 3.162278e-3, 5.623413e-3, 1.000000e-2,
90     1.778280e-2, 3.162278e-2, 5.623413e-2, 1.000000e-1,
91     1.778280e-1, 3.162278e-1, 5.623413e-1, 1.000000e00,
92     1.778280e00, 3.162278e00, 5.623413e00, 1.000000e01,
93     1.778280e01, 3.162278e01, 5.623413e01, 1.000000e02,
94     1.778280e02, 3.162278e02, 5.623413e02, 1.000000e03,
95     1.778280e03, 3.162278e03, 5.623413e03, 1.000000e04
96 };
97 static const float * const imc_exp_tab2 = imc_exp_tab + 8;
98
99
100 static const uint8_t imc_cb_select[4][32] = {
101     { 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
102       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2 },
103     { 0, 2, 0, 3, 2, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
104       0, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
105     { 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
106       3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2 },
107     { 0, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
108       3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
109 };
110
111 static const uint8_t imc_huffman_sizes[4] = {
112     17,  17,  18,  18
113 };
114
115 static const uint8_t imc_huffman_lens[4][4][18] = {
116     {
117         { 1,  2,  5,  6, 11, 12, 15, 16, 16, 14, 13, 10,  9,  8,  7,  4,  3 },
118         { 2,  3,  3,  4,  4,  4,  6,  6,  7,  7,  7,  8,  9, 10, 11, 11,  2 },
119         { 1,  4,  4,  7,  9, 10, 12, 15, 15, 14, 13, 11,  8,  6,  5,  4,  2 },
120         { 2,  2,  4,  8,  9, 14, 15, 15, 13, 12, 11, 10,  7,  6,  5,  3,  2 },
121     },
122     {
123         { 2,  2,  3,  4,  7,  7, 10, 11, 12, 14, 14, 13,  9,  8,  7,  5,  2 },
124         { 2,  3, 14, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  3,  2 },
125         { 2,  3,  3,  4,  4,  5,  7,  9, 11, 12, 13, 13, 10,  8,  6,  4,  2 },
126         { 2,  3,  3,  4,  4,  5,  7,  9, 11, 12, 13, 13, 10,  8,  6,  4,  2 },
127     },
128     {
129         { 3,  5,  8,  9, 12, 15, 17, 17, 16, 14, 13, 11, 10,  7,  6,  4,  2,  1 },
130         { 4,  7,  8, 10, 11, 12, 15, 16, 16, 14, 13,  9,  6,  5,  3,  2,  2,  2 },
131         { 4,  5,  6,  7, 12, 13, 17, 17, 16, 15, 14, 11, 10,  9,  8,  3,  2,  1 },
132         { 2,  5,  7,  8, 14, 15, 16, 16, 13, 12, 11, 10,  9,  6,  4,  3,  2,  2 },
133     },
134     {
135         { 2,  4,  7,  9, 10, 12, 13, 15, 16, 16, 14, 11,  8,  6,  5,  3,  2,  2 },
136         { 3,  5,  5,  7, 10, 11, 11,  9,  8,  6,  5,  4,  4,  3,  3,  3,  3,  3 },
137         { 5,  8,  9,  9,  7,  6,  6,  6,  5,  5,  5,  4,  4,  4,  3,  3,  3,  2 },
138         { 2,  3,  5,  7,  8, 11, 12, 13, 15, 15, 14, 10,  9,  6,  4,  3,  3,  2 },
139     }
140 };
141
142 static const uint8_t imc_huffman_syms[4][4][18] = {
143     {
144         {  7,  8,  5, 10,  3, 13,  1,  0, 15, 14,  2, 12, 11,  4, 16,  9,  6 },
145         {  8,  9,  6, 10,  5,  4, 11,  3, 16, 12,  2,  1, 13,  0, 14, 15,  7 },
146         {  8,  6,  9, 11, 12, 13, 14,  1,  0,  2, 15,  3,  4,  5, 10, 16,  7 },
147         {  8,  6,  5,  3, 12, 16, 15, 14,  0, 13,  1,  2, 11,  4, 10,  9,  7 },
148     },
149     {
150         {  8,  7,  9,  5, 16,  4,  2, 13,  1, 15,  0, 14, 12,  3, 11, 10,  6 },
151         {  8, 16,  0, 15,  1, 14,  2, 13, 12,  3, 11,  4, 10,  5,  6,  9,  7 },
152         {  8,  6,  9, 10, 16,  4,  3, 13, 14,  1,  0, 15,  2, 12, 11,  5,  7 },
153         {  8,  6,  9, 10, 16,  4,  3, 13, 14,  1,  0, 15,  2, 12, 11,  5,  7 },
154     },
155     {
156         {  6,  5,  4, 11,  2, 14, 15, 17,  0,  1, 13, 12,  3, 10, 16,  9,  8,  7 },
157         {  5, 11,  3, 12,  2, 13,  0, 17, 15, 14,  1, 16,  4, 10,  9,  6,  7,  8 },
158         { 16,  9,  5, 10,  1, 12, 15, 17, 14, 13,  0,  2, 11,  3,  4,  6,  8,  7 },
159         {  8,  5,  4, 12,  1, 15,  0, 17, 14,  2, 13, 16,  3, 11, 10,  9,  6,  7 },
160     },
161     {
162         {  7,  9,  4, 11,  2, 12,  0, 14, 17, 15, 13,  1,  3, 10,  5, 16,  8,  6 },
163         {  8, 17, 15,  5,  2,  1,  0,  3,  4, 16,  6,  7, 14, 13,  9, 10, 12, 11 },
164         {  4, 16,  0,  1,  2,  3, 17, 15, 14, 13, 11,  5, 12, 10,  9,  7,  6,  8 },
165         {  7,  9,  4, 11,  3, 13,  1,  0, 15, 17, 14,  2, 12, 16, 10,  6,  5,  8 },
166     }
167 };
168
169 #endif /* AVCODEC_IMCDATA_H */