GCC Code Coverage Report
Directory: ../../../ffmpeg/ Exec Total Coverage
File: src/libavcodec/cfhddata.c Lines: 58 60 96.7 %
Date: 2019-11-18 18:00:01 Branches: 23 26 88.5 %

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