]> git.sesse.net Git - ffmpeg/blob - libavcodec/cfhddata.c
nvenc: Allow different const qps for I, P and B frames
[ffmpeg] / libavcodec / cfhddata.c
1 /*
2  * Copyright (c) 2015 Kieran Kunhya
3  *
4  * This file is part of Libav.
5  *
6  * Libav is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * Libav is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with Libav; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 #include <stdint.h>
22
23 #include "libavutil/attributes.h"
24
25 #include "cfhd.h"
26
27 #define NB_VLC_TABLE_9   (71 + 3)
28 #define NB_VLC_TABLE_18 (263 + 1)
29
30 static const uint32_t table_9_vlc_bits[NB_VLC_TABLE_9] = {
31             0,       0x2,       0xc,      0x1a,
32          0x1d,      0x1e,      0x39,      0x3e,
33          0x37,      0x7e,      0x6c,      0xe2,
34          0xfe,      0xdb,      0xe0,     0x1c3,
35         0x1c6,     0x1ff,     0x1fe,     0x1b5,
36         0x369,     0x385,     0x71d,     0x6d0,
37         0x708,     0x71f,     0xe3d,     0xe39,
38         0xe13,     0xe12,    0x1c71,    0x1b45,
39        0x1b47,    0x3689,    0x38f2,    0x38e1,
40        0x38e0,    0x38f1,    0x3688,    0x6d1b,
41        0x71e0,    0x6d19,    0x71e7,    0xe3cd,
42        0xda35,    0xda30,    0xe3c3,   0x1b469,
43       0x1b462,   0x1c798,   0x1b463,   0x1c799,
44       0x38f08,   0x38f09,   0x38f0a,   0x6d1a0,
45       0x6d1a3,   0x6d1a1,   0xda345,   0xda344,
46       0xe3c2d,   0xe3c2f,   0xe3c2e,  0x38f0b2,
47      0x71e160,  0x71e162,  0x71e166,  0x71e161,
48      0xe3c2ce,  0xe3c2c6,  0xe3c2c7, 0x1C7859E,
49     0x38F0B3F, 0x38F0B3E,
50 };
51
52 static const uint8_t table_9_vlc_len[NB_VLC_TABLE_9] = {
53      1,    2,    4,    5,    5,    5,    6,    6,
54      6,    7,    7,    8,    8,    8,    8,    9,
55      9,    9,    9,    9,   10,   10,   11,   11,
56     11,   11,   12,   12,   12,   12,   13,   13,
57     13,   14,   14,   14,   14,   14,   14,   15,
58     15,   15,   15,   16,   16,   16,   16,   17,
59     17,   17,   17,   17,   18,   18,   18,   19,
60     19,   19,   20,   20,   20,   20,   20,   22,
61     23,   23,   23,   23,   24,   24,   24,   25,
62     26,   26,
63 };
64
65 static const uint16_t table_9_vlc_run[NB_VLC_TABLE_9] = {
66     1,    1,    1,    1,   12,    1,   32,  160,
67     1,    1,    1,  320,    1,    1,   80,  120,
68     1,    1,  100,    1,    1,    1,    1,    1,
69     1,    1,    1,    1,    1,    1,    1,    1,
70     1,    1,    1,    1,    1,    1,    1,    1,
71     1,    1,    1,    1,    1,    1,    1,    1,
72     1,    1,    1,    1,    1,    1,    1,    1,
73     1,    1,    1,    1,    1,    1,    1,    1,
74     1,    1,    1,    1,    1,    1,    1,    1,
75     1,    1
76 };
77
78 static const uint8_t table_9_vlc_level[NB_VLC_TABLE_9] = {
79      0,    1,    2,    3,    0,    4,    0,    0,
80      5,    7,    6,    0,    9,    8,    0,    0,
81     11,   12,    0,   10,   13,   14,   17,   15,
82     16,   18,   22,   21,   20,   19,   25,   23,
83     24,   27,   31,   29,   28,   30,   26,   33,
84     34,   32,   35,   39,   37,   36,   38,   42,
85     40,   43,   41,   44,   45,   46,   47,   48,
86     50,   49,   52,   51,   53,   55,   54,   56,
87     57,   59,   60,   58,   61,   62,   63,   64,
88     64,   64,
89 };
90
91 static const uint32_t table_18_vlc_bits[NB_VLC_TABLE_18] = {
92             0,       0x2,       0x7,      0x19,
93          0x30,      0x36,      0x6f,      0x63,
94          0x69,      0x6b,      0xd1,      0xd4,
95          0xdc,     0x189,     0x18a,     0x1a0,
96         0x1ab,     0x377,     0x310,     0x316,
97         0x343,     0x354,     0x375,     0x623,
98         0x684,     0x685,     0x6ab,     0x6ec,
99         0xddb,     0xc5c,     0xc5e,     0xc44,
100         0xd55,     0xdd1,     0xdd3,    0x1bb5,
101        0x188b,    0x18bb,    0x18bf,    0x1aa8,
102        0x1ba0,    0x1ba5,    0x1ba4,    0x3115,
103        0x3175,    0x317d,    0x3553,    0x3768,
104        0x6e87,    0x6ed3,    0x62e8,    0x62f8,
105        0x6228,    0x6aa4,    0x6e85,    0xc453,
106        0xc5d3,    0xc5f3,    0xdda4,    0xdd08,
107        0xdd0c,   0x1bb4b,   0x1bb4a,   0x18ba5,
108       0x18be5,   0x1aa95,   0x1aa97,   0x188a4,
109       0x1ba13,   0x31748,   0x317c8,   0x35528,
110       0x3552c,   0x37424,   0x37434,   0x37436,
111       0x62294,   0x62e92,   0x62f92,   0x6aa52,
112       0x6aa5a,   0x6e86a,   0x6e86e,   0x6e84a,
113       0xc452a,   0xc5d27,   0xc5f26,   0xd54a6,
114       0xd54b6,   0xdd096,   0xdd0d6,   0xdd0de,
115      0x188a56,  0x18ba4d,  0x18be4e,  0x18be4f,
116      0x1aa96e,  0x1ba12e,  0x1ba12f,  0x1ba1af,
117      0x1ba1bf,  0x37435d,  0x37437d,  0x317498,
118      0x35529c,  0x35529d,  0x3552de,  0x3552df,
119      0x62e933,  0x62295d,  0x6aa53d,  0x6aa53f,
120      0x6aa53e,  0x6e86b9,  0x6e86f8,  0xd54a79,
121      0xc5d265,  0xc452b8,  0xdd0d71,  0xd54a78,
122      0xdd0d70,  0xdd0df2,  0xdd0df3, 0x188a5f6,
123     0x188a5f5, 0x188a5f4, 0x188a5f3, 0x188a5f2,
124     0x188a5f1, 0x188a5f0, 0x188a5ef, 0x188a5ee,
125     0x188a5ed, 0x188a5aa, 0x188a5e3, 0x188a5df,
126     0x188a589, 0x188a5dd, 0x188a578, 0x188a5e0,
127     0x188a588, 0x188a5d6, 0x188a5db, 0x188a5e1,
128     0x188a587, 0x188a59a, 0x188a5c4, 0x188a5ec,
129     0x188a586, 0x188a573, 0x188a59c, 0x188a5c8,
130     0x188a5fb, 0x188a5a1, 0x188a5eb, 0x188a5a8,
131     0x188a584, 0x188a5d2, 0x188a599, 0x188a598,
132     0x188a583, 0x18ba4c9, 0x188a5d0, 0x188a594,
133     0x188a582, 0x188a5cb, 0x188a5d8, 0x188a5e7,
134     0x188a581, 0x188a5ea, 0x188a5a9, 0x188a5a6,
135     0x188a580, 0x188a5a0, 0x188a59d, 0x188a5c3,
136     0x188a57f, 0x188a5c0, 0x188a5de, 0x188a5d4,
137     0x188a57e, 0x188a5c2, 0x188a592, 0x188a5cd,
138     0x188a57d, 0x188a5a3, 0x188a5e8, 0x188a5a2,
139     0x188a57c, 0x188a58e, 0x188a5b3, 0x188a5b2,
140     0x188a5b1, 0x188a5b0, 0x188a5af, 0x188a5ae,
141     0x188a5ad, 0x188a5ac, 0x188a5ab, 0x188a5da,
142     0x188a5e4, 0x188a5e5, 0x188a5d9, 0x188a5b5,
143     0x188a5bc, 0x188a5bd, 0x188a5e9, 0x188a5cc,
144     0x188a585, 0x188a5d3, 0x188a5e2, 0x188a595,
145     0x188a596, 0x188a5b8, 0x188a590, 0x188a5c9,
146     0x188a5a4, 0x188a5e6, 0x188a5a5, 0x188a5ce,
147     0x188a5bf, 0x188a572, 0x188a59b, 0x188a5be,
148     0x188a5c7, 0x188a5ca, 0x188a5d5, 0x188a57b,
149     0x188a58d, 0x188a58c, 0x188a58b, 0x188a58a,
150     0x18ba4c8, 0x188a5c5, 0x188a5fa, 0x188a5bb,
151     0x188a5c1, 0x188a5cf, 0x188a5b9, 0x188a5b6,
152     0x188a597, 0x188a5fe, 0x188a5d7, 0x188a5ba,
153     0x188a591, 0x188a5c6, 0x188a5dc, 0x188a57a,
154     0x188a59f, 0x188a5f9, 0x188a5b4, 0x188a5a7,
155     0x188a58f, 0x188a5fd, 0x188a5b7, 0x188a593,
156     0x188a59e, 0x188a5f8, 0x188a5ff, 0x188a5fc,
157     0x188a579, 0x188a5f7, 0x3114ba2, 0x3114ba3,
158 };
159
160 static const uint8_t table_18_vlc_len[NB_VLC_TABLE_18] = {
161      1,  2,  3,  5,  6,  6,  7,  7,
162      7,  7,  8,  8,  8,  9,  9,  9,
163      9, 10, 10, 10, 10, 10, 10, 11,
164     11, 11, 11, 11, 12, 12, 12, 12,
165     12, 12, 12, 13, 13, 13, 13, 13,
166     13, 13, 13, 14, 14, 14, 14, 14,
167     15, 15, 15, 15, 15, 15, 15, 16,
168     16, 16, 16, 16, 16, 17, 17, 17,
169     17, 17, 17, 17, 17, 18, 18, 18,
170     18, 18, 18, 18, 19, 19, 19, 19,
171     19, 19, 19, 19, 20, 20, 20, 20,
172     20, 20, 20, 20, 21, 21, 21, 21,
173     21, 21, 21, 21, 21, 22, 22, 22,
174     22, 22, 22, 22, 23, 23, 23, 23,
175     23, 23, 23, 24, 24, 24, 24, 24,
176     24, 24, 24, 25, 25, 25, 25, 25,
177     25, 25, 25, 25, 25, 25, 25, 25,
178     25, 25, 25, 25, 25, 25, 25, 25,
179     25, 25, 25, 25, 25, 25, 25, 25,
180     25, 25, 25, 25, 25, 25, 25, 25,
181     25, 25, 25, 25, 25, 25, 25, 25,
182     25, 25, 25, 25, 25, 25, 25, 25,
183     25, 25, 25, 25, 25, 25, 25, 25,
184     25, 25, 25, 25, 25, 25, 25, 25,
185     25, 25, 25, 25, 25, 25, 25, 25,
186     25, 25, 25, 25, 25, 25, 25, 25,
187     25, 25, 25, 25, 25, 25, 25, 25,
188     25, 25, 25, 25, 25, 25, 25, 25,
189     25, 25, 25, 25, 25, 25, 25, 25,
190     25, 25, 25, 25, 25, 25, 25, 25,
191     25, 25, 25, 25, 25, 25, 25, 25,
192     25, 25, 25, 25, 25, 25, 25, 25,
193     25, 25, 25, 25, 25, 25, 26, 26,
194 };
195
196 static const uint16_t table_18_vlc_run[NB_VLC_TABLE_18] = {
197      1,    1,    1,    1,    1,    1,    1,    1,
198     12,    1,   20,    1,    1,    1,   32,    1,
199      1,    1,    1,    1,   60,    1,    1,    1,
200      1,  100,    1,    1,    1,    1,    1,    1,
201      1,    1,    1,    1,    1,    1,  180,    1,
202      1,  320,    1,    1,    1,    1,    1,    1,
203      1,    1,    1,    1,    1,    1,    1,    1,
204      1,    1,    1,    1,    1,    1,    1,    1,
205      1,    1,    1,    1,    1,    1,    1,    1,
206      1,    1,    1,    1,    1,    1,    1,    1,
207      1,    1,    1,    1,    1,    1,    1,    1,
208      1,    1,    1,    1,    1,    1,    1,    1,
209      1,    1,    1,    1,    1,    1,    1,    1,
210      1,    1,    1,    1,    1,    1,    1,    1,
211      1,    1,    1,    1,    1,    1,    1,    1,
212      1,    1,    1,    1,    1,    1,    1,    1,
213      1,    1,    1,    1,    1,    1,    1,    1,
214      1,    1,    1,    1,    1,    1,    1,    1,
215      1,    1,    1,    1,    1,    1,    1,    1,
216      1,    1,    1,    1,    1,    1,    1,    1,
217      1,    1,    1,    1,    1,    1,    1,    1,
218      1,    1,    1,    1,    1,    1,    1,    1,
219      1,    1,    1,    1,    1,    1,    1,    1,
220      1,    1,    1,    1,    1,    1,    1,    1,
221      1,    1,    1,    1,    1,    1,    1,    1,
222      1,    1,    1,    1,    1,    1,    1,    1,
223      1,    1,    1,    1,    1,    1,    1,    1,
224      1,    1,    1,    1,    1,    1,    1,    1,
225      1,    1,    1,    1,    1,    1,    1,    1,
226      1,    1,    1,    1,    1,    1,    1,    1,
227      1,    1,    1,    1,    1,    1,    1,    1,
228      1,    1,    1,    1,    1,    1,    1,    1,
229      1,    1,    1,    1,    1,    1,    1,    2,
230 };
231
232 static const uint8_t table_18_vlc_level[NB_VLC_TABLE_18] = {
233       0,    1,    2,    3,    4,    5,    8,    6,
234       0,    7,    0,    9,   10,   11,    0,   12,
235      13,   18,   14,   15,    0,   16,   17,   19,
236      20,    0,   21,   22,   29,   24,   25,   23,
237      26,   27,   28,   35,   30,   31,    0,   32,
238      33,    0,   34,   36,   37,   38,   39,   40,
239      46,   47,   42,   43,   41,   44,   45,   48,
240      49,   50,   53,   51,   52,   61,   60,   55,
241      56,   57,   58,   54,   59,   62,   63,   64,
242      65,   66,   67,   68,   69,   70,   71,   72,
243      73,   75,   76,   74,   77,   78,   79,   80,
244      81,   82,   83,   84,   85,   86,   87,   88,
245      89,   90,   91,   92,   93,   99,  100,   94,
246      95,   96,   97,   98,  102,  101,  103,  105,
247     104,  106,  107,  111,  109,  108,  113,  110,
248     112,  114,  115,  225,  189,  188,  203,  202,
249     197,  207,  169,  223,  159,  235,  152,  192,
250     179,  201,  172,  149,  178,  120,  219,  150,
251     127,  211,  125,  158,  247,  238,  163,  228,
252     183,  217,  168,  122,  128,  249,  187,  186,
253     136,  181,  255,  230,  135,  233,  222,  145,
254     134,  167,  248,  209,  243,  216,  164,  140,
255     157,  239,  191,  251,  156,  139,  242,  133,
256     162,  213,  165,  212,  227,  198,  236,  234,
257     117,  215,  124,  123,  254,  253,  148,  218,
258     146,  147,  224,  143,  184,  185,  166,  132,
259     129,  250,  151,  119,  193,  176,  245,  229,
260     206,  144,  208,  137,  241,  237,  190,  240,
261     131,  232,  252,  171,  205,  204,  118,  214,
262     180,  126,  182,  175,  141,  138,  177,  153,
263     194,  160,  121,  174,  246,  130,  200,  170,
264     221,  196,  142,  210,  199,  155,  154,  244,
265     220,  195,  161,  231,  173,  226,  116,  255,
266 };
267
268 static int init_vlc_signed(VLC *vlc, CFHD_RL_VLC_ELEM table_rl_vlc[],
269                            unsigned bound,
270                            const uint32_t table_vlc_bits[],
271                            const uint8_t table_vlc_len[],
272                            const uint16_t table_vlc_run[],
273                            const uint8_t table_vlc_level[])
274 {
275     uint32_t  vlc_bits[NB_VLC_TABLE_18 * 2];
276     uint8_t    vlc_len[NB_VLC_TABLE_18 * 2];
277     uint16_t   vlc_run[NB_VLC_TABLE_18 * 2];
278     int16_t  vlc_level[NB_VLC_TABLE_18 * 2];
279     unsigned i, j;
280     int ret;
281
282     for (i = 0, j = 0; i < bound; i++, j++) {
283         vlc_bits[j]  = table_vlc_bits[i];
284         vlc_len[j]   = table_vlc_len[i];
285         vlc_run[j]   = table_vlc_run[i];
286         vlc_level[j] = table_vlc_level[i];
287
288         /* Don't include the zero level nor escape bits */
289         if (table_vlc_level[i] &&
290             vlc_bits[j] != table_vlc_bits[bound - 1]) {
291             vlc_bits[j] <<= 1;
292             vlc_len[j]++;
293             j++;
294             vlc_bits[j]  = (table_vlc_bits[i] << 1) | 1;
295             vlc_len[j]   =  table_vlc_len[i] + 1;
296             vlc_run[j]   =  table_vlc_run[i];
297             vlc_level[j] = -table_vlc_level[i];
298         }
299     }
300
301     if ((ret = init_vlc(vlc, VLC_BITS, j, vlc_len, 1, 1, vlc_bits, 4, 4, 0)) < 0)
302         return ret;
303
304     for (i = 0; i < (*vlc).table_size; i++) {
305         int code = (*vlc).table[i][0];
306         int len  = (*vlc).table[i][1];
307         int level, run;
308
309         if (len < 0) { // more bits needed
310             run   = 0;
311             level = code;
312         } else {
313             run   = vlc_run[code];
314             level = vlc_level[code];
315         }
316         table_rl_vlc[i].len   = len;
317         table_rl_vlc[i].level = level;
318         table_rl_vlc[i].run   = run;
319     }
320
321     return 0;
322 }
323
324 av_cold int ff_cfhd_init_vlcs(CFHDContext *s)
325 {
326     /** Similar to dv.c, generate signed VLC tables **/
327
328     int ret = init_vlc_signed(&s->vlc_9, s->table_9_rl_vlc, NB_VLC_TABLE_9,
329                               table_9_vlc_bits, table_9_vlc_len,
330                               table_9_vlc_run, table_9_vlc_level);
331     if (ret < 0)
332         return ret;
333
334     return init_vlc_signed(&s->vlc_18, s->table_18_rl_vlc, NB_VLC_TABLE_18,
335                            table_18_vlc_bits, table_18_vlc_len,
336                            table_18_vlc_run, table_18_vlc_level);
337 }