Coverage Report

Created: 2026-04-01 07:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/huffyuvdec.c
Line
Count
Source
1
/*
2
 * huffyuv decoder
3
 *
4
 * Copyright (c) 2002-2014 Michael Niedermayer <michaelni@gmx.at>
5
 *
6
 * see https://multimedia.cx/huffyuv.txt for a description of
7
 * the algorithm used
8
 *
9
 * This file is part of FFmpeg.
10
 *
11
 * FFmpeg is free software; you can redistribute it and/or
12
 * modify it under the terms of the GNU Lesser General Public
13
 * License as published by the Free Software Foundation; either
14
 * version 2.1 of the License, or (at your option) any later version.
15
 *
16
 * FFmpeg is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19
 * Lesser General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU Lesser General Public
22
 * License along with FFmpeg; if not, write to the Free Software
23
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
 *
25
 * yuva, gray, 4:4:4, 4:1:1, 4:1:0 and >8 bit per sample support sponsored by NOA
26
 */
27
28
/**
29
 * @file
30
 * huffyuv decoder
31
 */
32
33
#define UNCHECKED_BITSTREAM_READER 1
34
35
#include "config_components.h"
36
37
#include "avcodec.h"
38
#include "bswapdsp.h"
39
#include "bytestream.h"
40
#include "codec_internal.h"
41
#include "get_bits.h"
42
#include "huffyuv.h"
43
#include "huffyuvdsp.h"
44
#include "lossless_videodsp.h"
45
#include "thread.h"
46
#include "libavutil/emms.h"
47
#include "libavutil/imgutils.h"
48
#include "libavutil/mem.h"
49
#include "libavutil/pixdesc.h"
50
51
26.9M
#define VLC_BITS 12
52
53
typedef struct HYuvDecContext {
54
    GetBitContext gb;
55
    Predictor predictor;
56
    int interlaced;
57
    int decorrelate;
58
    int bitstream_bpp;
59
    int version;
60
    int yuy2;                               //use yuy2 instead of 422P
61
    int bgr32;                              //use bgr32 instead of bgr24
62
    int bps;
63
    int n;                                  // 1<<bps
64
    int vlc_n;                              // number of vlc codes (FFMIN(1<<bps, MAX_VLC_N))
65
    int alpha;
66
    int chroma;
67
    int yuv;
68
    int chroma_h_shift;
69
    int chroma_v_shift;
70
    int flags;
71
    int context;
72
    int last_slice_end;
73
74
    union {
75
        uint8_t  *temp[3];
76
        uint16_t *temp16[3];
77
    };
78
    uint8_t len[4][MAX_VLC_N];
79
    uint32_t bits[4][MAX_VLC_N];
80
    uint32_t pix_bgr_map[1<<VLC_BITS];
81
    VLC vlc[8];                             //Y,U,V,A,YY,YU,YV,AA
82
    uint8_t *bitstream_buffer;
83
    unsigned int bitstream_buffer_size;
84
    BswapDSPContext bdsp;
85
    HuffYUVDSPContext hdsp;
86
    LLVidDSPContext llviddsp;
87
} HYuvDecContext;
88
89
90
static const uint8_t classic_shift_luma[] = {
91
    34, 36, 35, 69, 135, 232,   9, 16, 10, 24,  11,  23,  12,  16, 13, 10,
92
    14,  8, 15,  8,  16,   8,  17, 20, 16, 10, 207, 206, 205, 236, 11,  8,
93
    10, 21,  9, 23,   8,   8, 199, 70, 69, 68,
94
};
95
96
static const uint8_t classic_shift_chroma[] = {
97
    66, 36,  37,  38, 39, 40,  41,  75,  76,  77, 110, 239, 144, 81, 82,  83,
98
    84, 85, 118, 183, 56, 57,  88,  89,  56,  89, 154,  57,  58, 57, 26, 141,
99
    57, 56,  58,  57, 58, 57, 184, 119, 214, 245, 116,  83,  82, 49, 80,  79,
100
    78, 77,  44,  75, 41, 40,  39,  38,  37,  36,  34,
101
};
102
103
static const unsigned char classic_add_luma[256] = {
104
     3,  9,  5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
105
    73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
106
    68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
107
    35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
108
    37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
109
    35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
110
    27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
111
    15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
112
    12, 17, 19, 13,  4,  9,  2, 11,  1,  7,  8,  0, 16,  3, 14,  6,
113
    12, 10,  5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
114
    18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
115
    28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
116
    28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
117
    62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
118
    54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
119
    46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13,  7,  8,
120
};
121
122
static const unsigned char classic_add_chroma[256] = {
123
     3,    1,   2,   2,   2,   2,   3,   3,   7,   5,   7,   5,   8,   6,  11,   9,
124
     7,   13,  11,  10,   9,   8,   7,   5,   9,   7,   6,   4,   7,   5,   8,   7,
125
     11,   8,  13,  11,  19,  15,  22,  23,  20,  33,  32,  28,  27,  29,  51,  77,
126
     43,  45,  76,  81,  46,  82,  75,  55,  56, 144,  58,  80,  60,  74, 147,  63,
127
    143,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
128
     80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  27,  30,  21,  22,
129
     17,  14,   5,   6, 100,  54,  47,  50,  51,  53, 106, 107, 108, 109, 110, 111,
130
    112, 113, 114, 115,   4, 117, 118,  92,  94, 121, 122,   3, 124, 103,   2,   1,
131
      0, 129, 130, 131, 120, 119, 126, 125, 136, 137, 138, 139, 140, 141, 142, 134,
132
    135, 132, 133, 104,  64, 101,  62,  57, 102,  95,  93,  59,  61,  28,  97,  96,
133
     52,  49,  48,  29,  32,  25,  24,  46,  23,  98,  45,  44,  43,  20,  42,  41,
134
     19,  18,  99,  40,  15,  39,  38,  16,  13,  12,  11,  37,  10,   9,   8,  36,
135
      7, 128, 127, 105, 123, 116,  35,  34,  33, 145,  31,  79,  42, 146,  78,  26,
136
     83,  48,  49,  50,  44,  47,  26,  31,  30,  18,  17,  19,  21,  24,  25,  13,
137
     14,  16,  17,  18,  20,  21,  12,  14,  15,   9,  10,   6,   9,   6,   5,   8,
138
      6,  12,   8,  10,   7,   9,   6,   4,   6,   2,   2,   3,   3,   3,   3,   2,
139
};
140
141
static int read_len_table(uint8_t *dst, GetByteContext *gb, int n)
142
64.7k
{
143
64.7k
    int i, val, repeat;
144
145
22.2M
    for (i = 0; i < n;) {
146
22.2M
        if (bytestream2_get_bytes_left(gb) <= 0)
147
7.91k
            goto error;
148
22.2M
        repeat = bytestream2_peek_byteu(gb) >> 5;
149
22.2M
        val    = bytestream2_get_byteu(gb) & 0x1F;
150
22.2M
        if (repeat == 0) {
151
1.59M
            if (bytestream2_get_bytes_left(gb) <= 0)
152
2.75k
                goto error;
153
1.59M
            repeat = bytestream2_get_byteu(gb);
154
1.59M
        }
155
22.2M
        if (i + repeat > n)
156
7.43k
            goto error;
157
65.9M
        while (repeat--)
158
43.7M
            dst[i++] = val;
159
22.2M
    }
160
46.6k
    return 0;
161
162
18.1k
error:
163
18.1k
    av_log(NULL, AV_LOG_ERROR, "Error reading huffman table\n");
164
18.1k
    return AVERROR_INVALIDDATA;
165
64.7k
}
166
167
static int generate_joint_tables(HYuvDecContext *s)
168
18.5k
{
169
18.5k
    int ret;
170
18.5k
    uint16_t *symbols = av_mallocz(5 << VLC_BITS);
171
18.5k
    uint16_t *bits;
172
18.5k
    uint8_t *len;
173
18.5k
    if (!symbols)
174
0
        return AVERROR(ENOMEM);
175
18.5k
    bits = symbols + (1 << VLC_BITS);
176
18.5k
    len = (uint8_t *)(bits + (1 << VLC_BITS));
177
178
18.5k
    if (s->bitstream_bpp < 24 || s->version > 2) {
179
13.8k
        int count = 1 + s->alpha + 2 * s->chroma;
180
13.8k
        int p, i, y, u;
181
42.8k
        for (p = 0; p < count; p++) {
182
28.9k
            int p0 = s->version > 2 ? p : 0;
183
23.2M
            for (i = y = 0; y < s->vlc_n; y++) {
184
23.1M
                int len0  = s->len[p0][y];
185
23.1M
                int limit = VLC_BITS - len0;
186
23.1M
                if (limit <= 0 || !len0)
187
22.1M
                    continue;
188
1.00M
                if ((sign_extend(y, 8) & (s->vlc_n-1)) != y)
189
106k
                    continue;
190
258M
                for (u = 0; u < s->vlc_n; u++) {
191
257M
                    int len1 = s->len[p][u];
192
257M
                    if (len1 > limit || !len1)
193
243M
                        continue;
194
13.5M
                    if ((sign_extend(u, 8) & (s->vlc_n-1)) != u)
195
21.3k
                        continue;
196
13.5M
                    av_assert0(i < (1 << VLC_BITS));
197
13.5M
                    len[i]     = len0 + len1;
198
13.5M
                    bits[i]    = (s->bits[p0][y] << len1) + s->bits[p][u];
199
13.5M
                    symbols[i] = (y << 8) + (u & 0xFF);
200
13.5M
                        i++;
201
13.5M
                }
202
899k
            }
203
28.9k
            ff_vlc_free(&s->vlc[4 + p]);
204
28.9k
            if ((ret = ff_vlc_init_sparse(&s->vlc[4 + p], VLC_BITS, i, len, 1, 1,
205
28.9k
                                          bits, 2, 2, symbols, 2, 2, 0)) < 0)
206
0
                goto out;
207
28.9k
        }
208
13.8k
    } else {
209
4.63k
        uint8_t (*map)[4] = (uint8_t(*)[4]) s->pix_bgr_map;
210
4.63k
        int i, b, g, r, code;
211
4.63k
        int p0 = s->decorrelate;
212
4.63k
        int p1 = !s->decorrelate;
213
        /* Restrict the range to +/-16 because that's pretty much guaranteed
214
         * to cover all the combinations that fit in 11 bits total, and it
215
         *  does not matter if we miss a few rare codes. */
216
153k
        for (i = 0, g = -16; g < 16; g++) {
217
148k
            int len0   = s->len[p0][g & 255];
218
148k
            int limit0 = VLC_BITS - len0;
219
148k
            if (limit0 < 2 || !len0)
220
98.5k
                continue;
221
1.64M
            for (b = -16; b < 16; b++) {
222
1.59M
                int len1   = s->len[p1][b & 255];
223
1.59M
                int limit1 = limit0 - len1;
224
1.59M
                if (limit1 < 1 || !len1)
225
1.25M
                    continue;
226
335k
                code = (s->bits[p0][g & 255] << len1) + s->bits[p1][b & 255];
227
11.0M
                for (r = -16; r < 16; r++) {
228
10.7M
                    int len2 = s->len[2][r & 255];
229
10.7M
                    if (len2 > limit1 || !len2)
230
10.0M
                        continue;
231
672k
                    av_assert0(i < (1 << VLC_BITS));
232
672k
                    len[i]  = len0 + len1 + len2;
233
672k
                    bits[i] = (code << len2) + s->bits[2][r & 255];
234
672k
                    if (s->decorrelate) {
235
298k
                        map[i][G] = g;
236
298k
                        map[i][B] = g + b;
237
298k
                        map[i][R] = g + r;
238
373k
                    } else {
239
373k
                        map[i][B] = g;
240
373k
                        map[i][G] = b;
241
373k
                        map[i][R] = r;
242
373k
                    }
243
672k
                    i++;
244
672k
                }
245
335k
            }
246
49.7k
        }
247
4.63k
        ff_vlc_free(&s->vlc[4]);
248
4.63k
        if ((ret = vlc_init(&s->vlc[4], VLC_BITS, i, len, 1, 1,
249
4.63k
                            bits, 2, 2, 0)) < 0)
250
0
            goto out;
251
4.63k
    }
252
18.5k
    ret = 0;
253
18.5k
out:
254
18.5k
    av_freep(&symbols);
255
18.5k
    return ret;
256
18.5k
}
257
258
static int read_huffman_tables(HYuvDecContext *s, const uint8_t *src, int length)
259
37.0k
{
260
37.0k
    GetByteContext gb;
261
37.0k
    int i, ret;
262
37.0k
    int count = 3;
263
264
37.0k
    bytestream2_init(&gb, src, length);
265
266
37.0k
    if (s->version > 2)
267
25.7k
        count = 1 + s->alpha + 2*s->chroma;
268
269
76.2k
    for (i = 0; i < count; i++) {
270
60.0k
        if ((ret = read_len_table(s->len[i], &gb, s->vlc_n)) < 0)
271
18.1k
            return ret;
272
41.9k
        if ((ret = ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->vlc_n)) < 0)
273
1.60k
            return ret;
274
40.3k
        ff_vlc_free(&s->vlc[i]);
275
40.3k
        if ((ret = vlc_init(&s->vlc[i], VLC_BITS, s->vlc_n, s->len[i], 1, 1,
276
40.3k
                           s->bits[i], 4, 4, 0)) < 0)
277
1.13k
            return ret;
278
40.3k
    }
279
280
16.1k
    if ((ret = generate_joint_tables(s)) < 0)
281
0
        return ret;
282
283
16.1k
    return bytestream2_tell(&gb);
284
16.1k
}
285
286
static int read_old_huffman_tables(HYuvDecContext *s)
287
2.33k
{
288
2.33k
    GetByteContext gb;
289
2.33k
    int i, ret;
290
291
2.33k
    bytestream2_init(&gb, classic_shift_luma,
292
2.33k
                     sizeof(classic_shift_luma));
293
2.33k
    ret = read_len_table(s->len[0], &gb, 256);
294
2.33k
    av_assert1(ret >= 0);
295
296
2.33k
    bytestream2_init(&gb, classic_shift_chroma,
297
2.33k
                     sizeof(classic_shift_chroma));
298
2.33k
    ret = read_len_table(s->len[1], &gb, 256);
299
2.33k
    av_assert1(ret >= 0);
300
301
600k
    for (i = 0; i < 256; i++)
302
598k
        s->bits[0][i] = classic_add_luma[i];
303
600k
    for (i = 0; i < 256; i++)
304
598k
        s->bits[1][i] = classic_add_chroma[i];
305
306
2.33k
    if (s->bitstream_bpp >= 24) {
307
1.21k
        memcpy(s->bits[1], s->bits[0], 256 * sizeof(uint32_t));
308
1.21k
        memcpy(s->len[1], s->len[0], 256 * sizeof(uint8_t));
309
1.21k
    }
310
2.33k
    memcpy(s->bits[2], s->bits[1], 256 * sizeof(uint32_t));
311
2.33k
    memcpy(s->len[2], s->len[1], 256 * sizeof(uint8_t));
312
313
11.6k
    for (i = 0; i < 4; i++) {
314
9.35k
        ff_vlc_free(&s->vlc[i]);
315
9.35k
        if ((ret = vlc_init(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1,
316
9.35k
                            s->bits[i], 4, 4, 0)) < 0)
317
0
            return ret;
318
9.35k
    }
319
320
2.33k
    if ((ret = generate_joint_tables(s)) < 0)
321
0
        return ret;
322
323
2.33k
    return 0;
324
2.33k
}
325
326
static av_cold int decode_end(AVCodecContext *avctx)
327
6.33k
{
328
6.33k
    HYuvDecContext *s = avctx->priv_data;
329
6.33k
    int i;
330
331
25.3k
    for (int i = 0; i < 3; i++)
332
18.9k
        av_freep(&s->temp[i]);
333
334
6.33k
    av_freep(&s->bitstream_buffer);
335
336
56.9k
    for (i = 0; i < 8; i++)
337
50.6k
        ff_vlc_free(&s->vlc[i]);
338
339
6.33k
    return 0;
340
6.33k
}
341
342
static av_cold int decode_init(AVCodecContext *avctx)
343
6.33k
{
344
6.33k
    HYuvDecContext *s = avctx->priv_data;
345
6.33k
    int ret;
346
347
6.33k
    ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
348
6.33k
    if (ret < 0)
349
422
        return ret;
350
351
5.90k
    s->flags = avctx->flags;
352
353
5.90k
    ff_bswapdsp_init(&s->bdsp);
354
5.90k
    ff_huffyuvdsp_init(&s->hdsp, avctx->pix_fmt);
355
5.90k
    ff_llviddsp_init(&s->llviddsp);
356
357
5.90k
    s->interlaced = avctx->height > 288;
358
5.90k
    s->bgr32      = 1;
359
360
5.90k
    if (avctx->extradata_size) {
361
3.81k
        if ((avctx->bits_per_coded_sample & 7) &&
362
252
            avctx->bits_per_coded_sample != 12)
363
247
            s->version = 1; // do such files exist at all?
364
3.57k
        else if (avctx->extradata_size > 3 && avctx->extradata[3] == 0)
365
934
            s->version = 2;
366
2.63k
        else
367
2.63k
            s->version = 3;
368
3.81k
    } else
369
2.09k
        s->version = 0;
370
371
5.90k
    s->bps = 8;
372
5.90k
    s->n = 1<<s->bps;
373
5.90k
    s->vlc_n = FFMIN(s->n, MAX_VLC_N);
374
5.90k
    s->chroma = 1;
375
5.90k
    if (s->version >= 2) {
376
3.57k
        int method, interlace;
377
378
3.57k
        if (avctx->extradata_size < 4)
379
9
            return AVERROR_INVALIDDATA;
380
381
3.56k
        method           = avctx->extradata[0];
382
3.56k
        s->decorrelate   = method & 64 ? 1 : 0;
383
3.56k
        s->predictor     = method & 63;
384
3.56k
        if (s->version == 2) {
385
934
            s->bitstream_bpp = avctx->extradata[1];
386
934
            if (s->bitstream_bpp == 0)
387
133
                s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
388
2.62k
        } else {
389
2.62k
            s->bps = (avctx->extradata[1] >> 4) + 1;
390
2.62k
            s->n = 1<<s->bps;
391
2.62k
            s->vlc_n = FFMIN(s->n, MAX_VLC_N);
392
2.62k
            s->chroma_h_shift = avctx->extradata[1] & 3;
393
2.62k
            s->chroma_v_shift = (avctx->extradata[1] >> 2) & 3;
394
2.62k
            s->yuv   = !!(avctx->extradata[2] & 1);
395
2.62k
            s->chroma= !!(avctx->extradata[2] & 3);
396
2.62k
            s->alpha = !!(avctx->extradata[2] & 4);
397
2.62k
        }
398
3.56k
        interlace     = (avctx->extradata[2] & 0x30) >> 4;
399
3.56k
        s->interlaced = (interlace == 1) ? 1 : (interlace == 2) ? 0 : s->interlaced;
400
3.56k
        s->context    = avctx->extradata[2] & 0x40 ? 1 : 0;
401
402
3.56k
        if ((ret = read_huffman_tables(s, avctx->extradata + 4,
403
3.56k
                                       avctx->extradata_size - 4)) < 0)
404
330
            return ret;
405
3.56k
    } else {
406
2.33k
        switch (avctx->bits_per_coded_sample & 7) {
407
95
        case 1:
408
95
            s->predictor   = LEFT;
409
95
            s->decorrelate = 0;
410
95
            break;
411
252
        case 2:
412
252
            s->predictor   = LEFT;
413
252
            s->decorrelate = 1;
414
252
            break;
415
624
        case 3:
416
624
            s->predictor   = PLANE;
417
624
            s->decorrelate = avctx->bits_per_coded_sample >= 24;
418
624
            break;
419
413
        case 4:
420
413
            s->predictor   = MEDIAN;
421
413
            s->decorrelate = 0;
422
413
            break;
423
954
        default:
424
954
            s->predictor   = LEFT; // OLD
425
954
            s->decorrelate = 0;
426
954
            break;
427
2.33k
        }
428
2.33k
        s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
429
2.33k
        s->context       = 0;
430
431
2.33k
        if ((ret = read_old_huffman_tables(s)) < 0)
432
0
            return ret;
433
2.33k
    }
434
435
5.56k
    if (s->version <= 2) {
436
3.20k
        switch (s->bitstream_bpp) {
437
471
        case 12:
438
471
            avctx->pix_fmt = AV_PIX_FMT_YUV420P;
439
471
            s->yuv = 1;
440
471
            break;
441
1.00k
        case 16:
442
1.00k
            if (s->yuy2)
443
0
                avctx->pix_fmt = AV_PIX_FMT_YUYV422;
444
1.00k
            else
445
1.00k
                avctx->pix_fmt = AV_PIX_FMT_YUV422P;
446
1.00k
            s->yuv = 1;
447
1.00k
            break;
448
559
        case 24:
449
559
            if (s->bgr32)
450
559
                avctx->pix_fmt = AV_PIX_FMT_0RGB32;
451
0
            else
452
0
                avctx->pix_fmt = AV_PIX_FMT_BGR24;
453
559
            break;
454
786
        case 32:
455
786
            av_assert0(s->bgr32);
456
786
            avctx->pix_fmt = AV_PIX_FMT_RGB32;
457
786
            s->alpha = 1;
458
786
            break;
459
385
        default:
460
385
            return AVERROR_INVALIDDATA;
461
3.20k
        }
462
2.81k
        av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt,
463
2.81k
                                         &s->chroma_h_shift,
464
2.81k
                                         &s->chroma_v_shift);
465
2.81k
    } else {
466
2.36k
        switch ( (s->chroma<<10) | (s->yuv<<9) | (s->alpha<<8) | ((s->bps-1)<<4) | s->chroma_h_shift | (s->chroma_v_shift<<2)) {
467
523
        case 0x070:
468
523
            avctx->pix_fmt = AV_PIX_FMT_GRAY8;
469
523
            break;
470
132
        case 0x0F0:
471
132
            avctx->pix_fmt = AV_PIX_FMT_GRAY16;
472
132
            break;
473
114
        case 0x470:
474
114
            avctx->pix_fmt = AV_PIX_FMT_GBRP;
475
114
            break;
476
111
        case 0x480:
477
111
            avctx->pix_fmt = AV_PIX_FMT_GBRP9;
478
111
            break;
479
25
        case 0x490:
480
25
            avctx->pix_fmt = AV_PIX_FMT_GBRP10;
481
25
            break;
482
0
        case 0x4B0:
483
0
            avctx->pix_fmt = AV_PIX_FMT_GBRP12;
484
0
            break;
485
16
        case 0x4D0:
486
16
            avctx->pix_fmt = AV_PIX_FMT_GBRP14;
487
16
            break;
488
32
        case 0x4F0:
489
32
            avctx->pix_fmt = AV_PIX_FMT_GBRP16;
490
32
            break;
491
29
        case 0x570:
492
29
            avctx->pix_fmt = AV_PIX_FMT_GBRAP;
493
29
            break;
494
36
        case 0x670:
495
36
            avctx->pix_fmt = AV_PIX_FMT_YUV444P;
496
36
            break;
497
52
        case 0x680:
498
52
            avctx->pix_fmt = AV_PIX_FMT_YUV444P9;
499
52
            break;
500
26
        case 0x690:
501
26
            avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
502
26
            break;
503
0
        case 0x6B0:
504
0
            avctx->pix_fmt = AV_PIX_FMT_YUV444P12;
505
0
            break;
506
16
        case 0x6D0:
507
16
            avctx->pix_fmt = AV_PIX_FMT_YUV444P14;
508
16
            break;
509
19
        case 0x6F0:
510
19
            avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
511
19
            break;
512
3
        case 0x671:
513
3
            avctx->pix_fmt = AV_PIX_FMT_YUV422P;
514
3
            break;
515
194
        case 0x681:
516
194
            avctx->pix_fmt = AV_PIX_FMT_YUV422P9;
517
194
            break;
518
27
        case 0x691:
519
27
            avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
520
27
            break;
521
0
        case 0x6B1:
522
0
            avctx->pix_fmt = AV_PIX_FMT_YUV422P12;
523
0
            break;
524
18
        case 0x6D1:
525
18
            avctx->pix_fmt = AV_PIX_FMT_YUV422P14;
526
18
            break;
527
16
        case 0x6F1:
528
16
            avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
529
16
            break;
530
85
        case 0x672:
531
85
            avctx->pix_fmt = AV_PIX_FMT_YUV411P;
532
85
            break;
533
37
        case 0x674:
534
37
            avctx->pix_fmt = AV_PIX_FMT_YUV440P;
535
37
            break;
536
3
        case 0x675:
537
3
            avctx->pix_fmt = AV_PIX_FMT_YUV420P;
538
3
            break;
539
122
        case 0x685:
540
122
            avctx->pix_fmt = AV_PIX_FMT_YUV420P9;
541
122
            break;
542
27
        case 0x695:
543
27
            avctx->pix_fmt = AV_PIX_FMT_YUV420P10;
544
27
            break;
545
0
        case 0x6B5:
546
0
            avctx->pix_fmt = AV_PIX_FMT_YUV420P12;
547
0
            break;
548
16
        case 0x6D5:
549
16
            avctx->pix_fmt = AV_PIX_FMT_YUV420P14;
550
16
            break;
551
20
        case 0x6F5:
552
20
            avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
553
20
            break;
554
73
        case 0x67A:
555
73
            avctx->pix_fmt = AV_PIX_FMT_YUV410P;
556
73
            break;
557
29
        case 0x770:
558
29
            avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
559
29
            break;
560
34
        case 0x780:
561
34
            avctx->pix_fmt = AV_PIX_FMT_YUVA444P9;
562
34
            break;
563
24
        case 0x790:
564
24
            avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
565
24
            break;
566
34
        case 0x7F0:
567
34
            avctx->pix_fmt = AV_PIX_FMT_YUVA444P16;
568
34
            break;
569
39
        case 0x771:
570
39
            avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
571
39
            break;
572
28
        case 0x781:
573
28
            avctx->pix_fmt = AV_PIX_FMT_YUVA422P9;
574
28
            break;
575
76
        case 0x791:
576
76
            avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
577
76
            break;
578
16
        case 0x7F1:
579
16
            avctx->pix_fmt = AV_PIX_FMT_YUVA422P16;
580
16
            break;
581
25
        case 0x775:
582
25
            avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
583
25
            break;
584
35
        case 0x785:
585
35
            avctx->pix_fmt = AV_PIX_FMT_YUVA420P9;
586
35
            break;
587
24
        case 0x795:
588
24
            avctx->pix_fmt = AV_PIX_FMT_YUVA420P10;
589
24
            break;
590
16
        case 0x7F5:
591
16
            avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
592
16
            break;
593
216
        default:
594
216
            return AVERROR_INVALIDDATA;
595
2.36k
        }
596
2.36k
    }
597
598
4.96k
    if ((avctx->pix_fmt == AV_PIX_FMT_YUV422P || avctx->pix_fmt == AV_PIX_FMT_YUV420P) && avctx->width & 1) {
599
9
        av_log(avctx, AV_LOG_ERROR, "width must be even for this colorspace\n");
600
9
        return AVERROR_INVALIDDATA;
601
9
    }
602
4.95k
    if (s->predictor == MEDIAN && avctx->pix_fmt == AV_PIX_FMT_YUV422P &&
603
372
        avctx->width % 4) {
604
3
        av_log(avctx, AV_LOG_ERROR, "width must be a multiple of 4 "
605
3
               "for this combination of colorspace and predictor type.\n");
606
3
        return AVERROR_INVALIDDATA;
607
3
    }
608
609
19.8k
    for (int i = 0; i < 3; i++) {
610
14.8k
        s->temp[i] = av_malloc(4 * avctx->width + 16);
611
14.8k
        if (!s->temp[i])
612
0
            return AVERROR(ENOMEM);
613
14.8k
    }
614
615
4.95k
    return 0;
616
4.95k
}
617
618
/** Subset of GET_VLC for use in hand-roller VLC code */
619
#define VLC_INTERN(dst, table, gb, name, bits, max_depth)   \
620
100M
    code = table[index].sym;                                \
621
100M
    n    = table[index].len;                                \
622
100M
    if (max_depth > 1 && n < 0) {                           \
623
6.35M
        LAST_SKIP_BITS(name, gb, bits);                     \
624
6.35M
        UPDATE_CACHE(name, gb);                             \
625
6.35M
                                                            \
626
6.35M
        nb_bits = -n;                                       \
627
6.35M
        index   = SHOW_UBITS(name, gb, nb_bits) + code;     \
628
6.35M
        code    = table[index].sym;                         \
629
6.35M
        n       = table[index].len;                         \
630
6.35M
        if (max_depth > 2 && n < 0) {                       \
631
674k
            LAST_SKIP_BITS(name, gb, nb_bits);              \
632
674k
            UPDATE_CACHE(name, gb);                         \
633
674k
                                                            \
634
674k
            nb_bits = -n;                                   \
635
674k
            index   = SHOW_UBITS(name, gb, nb_bits) + code; \
636
674k
            code    = table[index].sym;                     \
637
674k
            n       = table[index].len;                     \
638
674k
        }                                                   \
639
6.35M
    }                                                       \
640
100M
    dst = code;                                             \
641
100M
    LAST_SKIP_BITS(name, gb, n)
642
643
644
#define GET_VLC_DUAL(dst0, dst1, name, gb, dtable, table1, table2,  \
645
                     bits, max_depth, OP)                           \
646
55.2M
    do {                                                            \
647
55.2M
        unsigned int index = SHOW_UBITS(name, gb, bits);            \
648
55.2M
        int          code, n = dtable[index].len;                   \
649
55.2M
                                                                    \
650
55.2M
        if (n<=0) {                                                 \
651
27.2M
            int nb_bits;                                            \
652
27.2M
            VLC_INTERN(dst0, table1, gb, name, bits, max_depth);    \
653
27.2M
                                                                    \
654
27.2M
            UPDATE_CACHE(re, gb);                                   \
655
27.2M
            index = SHOW_UBITS(name, gb, bits);                     \
656
27.2M
            VLC_INTERN(dst1, table2, gb, name, bits, max_depth);    \
657
27.9M
        } else {                                                    \
658
27.9M
            code = dtable[index].sym;                               \
659
27.9M
            OP(dst0, dst1, code);                                   \
660
27.9M
            LAST_SKIP_BITS(name, gb, n);                            \
661
27.9M
        }                                                           \
662
55.2M
    } while (0)
663
664
23.5M
#define OP8bits(dst0, dst1, code) dst0 = code>>8; dst1 = code
665
666
#define READ_2PIX(dst0, dst1, plane1)                                   \
667
30.2M
    UPDATE_CACHE(re, &s->gb);                                           \
668
30.2M
    GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane1].table,        \
669
20.1M
                 s->vlc[0].table, s->vlc[plane1].table, VLC_BITS, 3, OP8bits)
670
671
static void decode_422_bitstream(HYuvDecContext *s, int count)
672
1.40M
{
673
1.40M
    int i, icount;
674
1.40M
    OPEN_READER(re, &s->gb);
675
1.40M
    count /= 2;
676
677
1.40M
    icount = get_bits_left(&s->gb) / (32 * 4);
678
1.40M
    if (count >= icount) {
679
3.64M
        for (i = 0; i < icount; i++) {
680
2.50M
            READ_2PIX(s->temp[0][2 * i],     s->temp[1][i], 1);
681
2.50M
            READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
682
2.50M
        }
683
11.5M
        for (; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
684
10.4M
            READ_2PIX(s->temp[0][2 * i    ], s->temp[1][i], 1);
685
10.4M
            if (BITS_LEFT(re, &s->gb) <= 0) break;
686
10.4M
            READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
687
10.4M
        }
688
30.4M
        for (; i < count; i++)
689
29.2M
            s->temp[0][2 * i    ] = s->temp[1][i] =
690
29.2M
            s->temp[0][2 * i + 1] = s->temp[2][i] = 0;
691
1.14M
    } else {
692
1.12M
        for (i = 0; i < count; i++) {
693
856k
            READ_2PIX(s->temp[0][2 * i],     s->temp[1][i], 1);
694
856k
            READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
695
856k
        }
696
267k
    }
697
1.40M
    CLOSE_READER(re, &s->gb);
698
1.40M
}
699
700
#define READ_2PIX_PLANE(dst0, dst1, plane, OP) \
701
25.0M
    UPDATE_CACHE(re, &s->gb); \
702
25.0M
    GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane].table, \
703
25.0M
                 s->vlc[plane].table, s->vlc[plane].table, VLC_BITS, 3, OP)
704
705
4.44M
#define OP14bits(dst0, dst1, code) dst0 = code>>8; dst1 = sign_extend(code, 8)
706
707
/* TODO instead of restarting the read when the code isn't in the first level
708
 * of the joint table, jump into the 2nd level of the individual table. */
709
1.58M
#define READ_2PIX_PLANE16(dst0, dst1, plane){\
710
1.58M
    dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)*4;\
711
1.58M
    dst0 += get_bits(&s->gb, 2);\
712
1.58M
    dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)*4;\
713
1.58M
    dst1 += get_bits(&s->gb, 2);\
714
1.58M
}
715
static void decode_plane_bitstream(HYuvDecContext *s, int width, int plane)
716
17.2M
{
717
17.2M
    int i, count = width/2;
718
719
17.2M
    if (s->bps <= 8) {
720
1.39M
        OPEN_READER(re, &s->gb);
721
1.39M
        if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
722
9.77M
            for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
723
9.27M
                READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits);
724
9.27M
            }
725
896k
        } else {
726
2.48M
            for(i=0; i<count; i++){
727
1.59M
                READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits);
728
1.59M
            }
729
896k
        }
730
1.39M
        if( width&1 && BITS_LEFT(re, &s->gb)>0 ) {
731
681k
            unsigned int index;
732
681k
            int nb_bits, code, n;
733
681k
            UPDATE_CACHE(re, &s->gb);
734
681k
            index = SHOW_UBITS(re, &s->gb, VLC_BITS);
735
681k
            VLC_INTERN(s->temp[0][width-1], s->vlc[plane].table,
736
681k
                       &s->gb, re, VLC_BITS, 3);
737
681k
        }
738
1.39M
        CLOSE_READER(re, &s->gb);
739
15.8M
    } else if (s->bps <= 14) {
740
14.4M
        OPEN_READER(re, &s->gb);
741
14.4M
        if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
742
21.3M
            for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
743
12.4M
                READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
744
12.4M
            }
745
8.86M
        } else {
746
7.32M
            for(i=0; i<count; i++){
747
1.69M
                READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
748
1.69M
            }
749
5.62M
        }
750
14.4M
        if( width&1 && BITS_LEFT(re, &s->gb)>0 ) {
751
5.55M
            unsigned int index;
752
5.55M
            int nb_bits, code, n;
753
5.55M
            UPDATE_CACHE(re, &s->gb);
754
5.55M
            index = SHOW_UBITS(re, &s->gb, VLC_BITS);
755
5.55M
            VLC_INTERN(s->temp16[0][width-1], s->vlc[plane].table,
756
5.55M
                       &s->gb, re, VLC_BITS, 3);
757
5.55M
        }
758
14.4M
        CLOSE_READER(re, &s->gb);
759
14.4M
    } else {
760
1.33M
        if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
761
1.12M
            for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
762
168k
                READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
763
168k
            }
764
955k
        } else {
765
1.79M
            for(i=0; i<count; i++){
766
1.41M
                READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
767
1.41M
            }
768
379k
        }
769
1.33M
        if( width&1 && get_bits_left(&s->gb)>0 ) {
770
380k
            int dst = (unsigned)get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;
771
380k
            s->temp16[0][width-1] = dst + get_bits(&s->gb, 2);
772
380k
        }
773
1.33M
    }
774
17.2M
}
775
776
static void decode_gray_bitstream(HYuvDecContext *s, int count)
777
937k
{
778
937k
    int i;
779
937k
    OPEN_READER(re, &s->gb);
780
937k
    count /= 2;
781
782
937k
    if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
783
2.28M
        for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
784
1.56M
            READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
785
1.56M
        }
786
5.25M
        for (; i < count; i++)
787
4.54M
            s->temp[0][2 * i] = s->temp[0][2 * i + 1] = 0;
788
717k
    } else {
789
1.28M
        for (i = 0; i < count; i++) {
790
1.05M
            READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
791
1.05M
        }
792
220k
    }
793
937k
    CLOSE_READER(re, &s->gb);
794
937k
}
795
796
static av_always_inline void decode_bgr_1(HYuvDecContext *s, int count,
797
                                          int decorrelate, int alpha)
798
8.06M
{
799
8.06M
    int i;
800
8.06M
    OPEN_READER(re, &s->gb);
801
802
24.2M
    for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
803
16.2M
        unsigned int index;
804
16.2M
        int code, n, nb_bits;
805
806
16.2M
        UPDATE_CACHE(re, &s->gb);
807
16.2M
        index = SHOW_UBITS(re, &s->gb, VLC_BITS);
808
16.2M
        n     = s->vlc[4].table[index].len;
809
810
16.2M
        if (n>0) {
811
5.94M
            code  = s->vlc[4].table[index].sym;
812
5.94M
            *(uint32_t *) &s->temp[0][4 * i] = s->pix_bgr_map[code];
813
5.94M
            LAST_SKIP_BITS(re, &s->gb, n);
814
10.2M
        } else {
815
10.2M
            if (decorrelate) {
816
1.72M
                VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table,
817
1.72M
                           &s->gb, re, VLC_BITS, 3);
818
819
1.72M
                UPDATE_CACHE(re, &s->gb);
820
1.72M
                index = SHOW_UBITS(re, &s->gb, VLC_BITS);
821
1.72M
                VLC_INTERN(code, s->vlc[0].table, &s->gb, re, VLC_BITS, 3);
822
1.72M
                s->temp[0][4 * i + B] = code + s->temp[0][4 * i + G];
823
824
1.72M
                UPDATE_CACHE(re, &s->gb);
825
1.72M
                index = SHOW_UBITS(re, &s->gb, VLC_BITS);
826
1.72M
                VLC_INTERN(code, s->vlc[2].table, &s->gb, re, VLC_BITS, 3);
827
1.72M
                s->temp[0][4 * i + R] = code + s->temp[0][4 * i + G];
828
8.56M
            } else {
829
8.56M
                VLC_INTERN(s->temp[0][4 * i + B], s->vlc[0].table,
830
8.56M
                           &s->gb, re, VLC_BITS, 3);
831
832
8.56M
                UPDATE_CACHE(re, &s->gb);
833
8.56M
                index = SHOW_UBITS(re, &s->gb, VLC_BITS);
834
8.56M
                VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table,
835
8.56M
                           &s->gb, re, VLC_BITS, 3);
836
837
8.56M
                UPDATE_CACHE(re, &s->gb);
838
8.56M
                index = SHOW_UBITS(re, &s->gb, VLC_BITS);
839
8.56M
                VLC_INTERN(s->temp[0][4 * i + R], s->vlc[2].table,
840
8.56M
                           &s->gb, re, VLC_BITS, 3);
841
8.56M
            }
842
10.2M
        }
843
16.2M
        if (alpha) {
844
8.86M
            UPDATE_CACHE(re, &s->gb);
845
8.86M
            index = SHOW_UBITS(re, &s->gb, VLC_BITS);
846
8.86M
            VLC_INTERN(s->temp[0][4 * i + A], s->vlc[2].table,
847
8.86M
                       &s->gb, re, VLC_BITS, 3);
848
8.86M
        } else
849
7.36M
            s->temp[0][4 * i + A] = 0;
850
16.2M
    }
851
8.06M
    CLOSE_READER(re, &s->gb);
852
8.06M
}
853
854
static void decode_bgr_bitstream(HYuvDecContext *s, int count)
855
8.06M
{
856
8.06M
    if (s->decorrelate) {
857
7.26M
        if (s->bitstream_bpp == 24)
858
1.75M
            decode_bgr_1(s, count, 1, 0);
859
5.50M
        else
860
5.50M
            decode_bgr_1(s, count, 1, 1);
861
7.26M
    } else {
862
803k
        if (s->bitstream_bpp == 24)
863
214k
            decode_bgr_1(s, count, 0, 0);
864
588k
        else
865
588k
            decode_bgr_1(s, count, 0, 1);
866
803k
    }
867
8.06M
}
868
869
static void draw_slice(HYuvDecContext *s, AVCodecContext *avctx, AVFrame *frame, int y)
870
1.60M
{
871
1.60M
    int h, cy, i;
872
1.60M
    int offset[AV_NUM_DATA_POINTERS];
873
874
1.60M
    if (!avctx->draw_horiz_band)
875
1.60M
        return;
876
877
0
    h  = y - s->last_slice_end;
878
0
    y -= h;
879
880
0
    if (s->bitstream_bpp == 12)
881
0
        cy = y >> 1;
882
0
    else
883
0
        cy = y;
884
885
0
    offset[0] = frame->linesize[0] * y;
886
0
    offset[1] = frame->linesize[1] * cy;
887
0
    offset[2] = frame->linesize[2] * cy;
888
0
    for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
889
0
        offset[i] = 0;
890
0
    emms_c();
891
892
0
    avctx->draw_horiz_band(avctx, frame, offset, y, 3, h);
893
894
0
    s->last_slice_end = y + h;
895
0
}
896
897
static int left_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, int w, int acc)
898
4.81M
{
899
4.81M
    if (s->bps <= 8) {
900
752k
        return s->llviddsp.add_left_pred(dst, src, w, acc);
901
4.05M
    } else {
902
4.05M
        return s->llviddsp.add_left_pred_int16((      uint16_t *)dst, (const uint16_t *)src, s->n-1, w, acc);
903
4.05M
    }
904
4.81M
}
905
906
static void add_bytes(HYuvDecContext *s, uint8_t *dst, uint8_t *src, int w)
907
4.03M
{
908
4.03M
    if (s->bps <= 8) {
909
362k
        s->llviddsp.add_bytes(dst, src, w);
910
3.67M
    } else {
911
3.67M
        s->hdsp.add_int16((uint16_t*)dst, (const uint16_t*)src, s->n - 1, w);
912
3.67M
    }
913
4.03M
}
914
915
static void add_median_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, const uint8_t *diff, int w, int *left, int *left_top)
916
12.4M
{
917
12.4M
    if (s->bps <= 8) {
918
637k
        s->llviddsp.add_median_pred(dst, src, diff, w, left, left_top);
919
11.7M
    } else {
920
11.7M
        s->hdsp.add_hfyu_median_pred_int16((uint16_t *)dst, (const uint16_t *)src, (const uint16_t *)diff, s->n-1, w, left, left_top);
921
11.7M
    }
922
12.4M
}
923
924
static int decode_slice(AVCodecContext *avctx, AVFrame *p, int height,
925
                        int buf_size, int y_offset, int table_size)
926
308k
{
927
308k
    HYuvDecContext *s = avctx->priv_data;
928
308k
    int fake_ystride, fake_ustride, fake_vstride;
929
308k
    const int width  = avctx->width;
930
308k
    const int width2 = avctx->width >> 1;
931
308k
    int ret;
932
933
308k
    if ((ret = init_get_bits8(&s->gb, s->bitstream_buffer + table_size, buf_size - table_size)) < 0)
934
228
        return ret;
935
936
308k
    fake_ystride = s->interlaced ? p->linesize[0] * 2 : p->linesize[0];
937
308k
    fake_ustride = s->interlaced ? p->linesize[1] * 2 : p->linesize[1];
938
308k
    fake_vstride = s->interlaced ? p->linesize[2] * 2 : p->linesize[2];
939
940
308k
    if (s->version > 2) {
941
50.1k
        int plane;
942
189k
        for(plane = 0; plane < 1 + 2*s->chroma + s->alpha; plane++) {
943
138k
            int left, lefttop, y;
944
138k
            int w = width;
945
138k
            int h = height;
946
138k
            int fake_stride = fake_ystride;
947
948
138k
            if (s->chroma && (plane == 1 || plane == 2)) {
949
79.1k
                w >>= s->chroma_h_shift;
950
79.1k
                h >>= s->chroma_v_shift;
951
79.1k
                fake_stride = plane == 1 ? fake_ustride : fake_vstride;
952
79.1k
            }
953
954
138k
            switch (s->predictor) {
955
45.3k
            case LEFT:
956
70.4k
            case PLANE:
957
70.4k
                decode_plane_bitstream(s, w, plane);
958
70.4k
                left = left_prediction(s, p->data[plane], s->temp[0], w, 0);
959
960
4.75M
                for (y = 1; y < h; y++) {
961
4.68M
                    uint8_t *dst = p->data[plane] + p->linesize[plane]*y;
962
963
4.68M
                    decode_plane_bitstream(s, w, plane);
964
4.68M
                    left = left_prediction(s, dst, s->temp[0], w, left);
965
4.68M
                    if (s->predictor == PLANE) {
966
4.04M
                        if (y > s->interlaced) {
967
4.03M
                            add_bytes(s, dst, dst - fake_stride, w);
968
4.03M
                        }
969
4.04M
                    }
970
4.68M
                }
971
972
70.4k
                break;
973
50.7k
            case MEDIAN:
974
50.7k
                decode_plane_bitstream(s, w, plane);
975
50.7k
                left= left_prediction(s, p->data[plane], s->temp[0], w, 0);
976
977
50.7k
                y = 1;
978
50.7k
                if (y >= h)
979
6.96k
                    break;
980
981
                /* second line is left predicted for interlaced case */
982
43.8k
                if (s->interlaced) {
983
9.80k
                    decode_plane_bitstream(s, w, plane);
984
9.80k
                    left = left_prediction(s, p->data[plane] + p->linesize[plane], s->temp[0], w, left);
985
9.80k
                    y++;
986
9.80k
                    if (y >= h)
987
1.67k
                        break;
988
9.80k
                }
989
990
42.1k
                lefttop = p->data[plane][0];
991
42.1k
                decode_plane_bitstream(s, w, plane);
992
42.1k
                add_median_prediction(s, p->data[plane] + fake_stride, p->data[plane], s->temp[0], w, &left, &lefttop);
993
42.1k
                y++;
994
995
12.4M
                for (; y<h; y++) {
996
12.3M
                    uint8_t *dst;
997
998
12.3M
                    decode_plane_bitstream(s, w, plane);
999
1000
12.3M
                    dst = p->data[plane] + p->linesize[plane] * y;
1001
1002
12.3M
                    add_median_prediction(s, dst, dst - fake_stride, s->temp[0], w, &left, &lefttop);
1003
12.3M
                }
1004
1005
42.1k
                break;
1006
138k
            }
1007
138k
        }
1008
50.1k
        draw_slice(s, avctx, p, height);
1009
257k
    } else if (s->bitstream_bpp < 24) {
1010
68.4k
        int y, cy;
1011
68.4k
        int lefty, leftu, leftv;
1012
68.4k
        int lefttopy, lefttopu, lefttopv;
1013
1014
68.4k
        if (s->yuy2) {
1015
0
            p->data[0][3] = get_bits(&s->gb, 8);
1016
0
            p->data[0][2] = get_bits(&s->gb, 8);
1017
0
            p->data[0][1] = get_bits(&s->gb, 8);
1018
0
            p->data[0][0] = get_bits(&s->gb, 8);
1019
1020
0
            av_log(avctx, AV_LOG_ERROR,
1021
0
                   "YUY2 output is not implemented yet\n");
1022
0
            return AVERROR_PATCHWELCOME;
1023
68.4k
        } else {
1024
68.4k
            leftv         =
1025
68.4k
            p->data[2][0 + y_offset * p->linesize[2]] = get_bits(&s->gb, 8);
1026
68.4k
            lefty         =
1027
68.4k
            p->data[0][1 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
1028
68.4k
            leftu         =
1029
68.4k
            p->data[1][0 + y_offset * p->linesize[1]] = get_bits(&s->gb, 8);
1030
68.4k
            p->data[0][0 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
1031
1032
68.4k
            switch (s->predictor) {
1033
45.4k
            case LEFT:
1034
50.1k
            case PLANE:
1035
50.1k
                decode_422_bitstream(s, width - 2);
1036
50.1k
                lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0] * y_offset + 2, s->temp[0],
1037
50.1k
                                                   width - 2, lefty);
1038
50.1k
                if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1039
50.1k
                    leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[1] * y_offset + 1, s->temp[1], width2 - 1, leftu);
1040
50.1k
                    leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[2] * y_offset + 1, s->temp[2], width2 - 1, leftv);
1041
50.1k
                }
1042
1043
499k
                for (cy = y = 1; y < height; y++, cy++) {
1044
450k
                    uint8_t *ydst, *udst, *vdst;
1045
1046
450k
                    if (s->bitstream_bpp == 12) {
1047
197k
                        decode_gray_bitstream(s, width);
1048
1049
197k
                        ydst = p->data[0] + p->linesize[0] * (y + y_offset);
1050
1051
197k
                        lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
1052
197k
                                                           width, lefty);
1053
197k
                        if (s->predictor == PLANE) {
1054
195k
                            if (y > s->interlaced)
1055
194k
                                s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width);
1056
195k
                        }
1057
197k
                        y++;
1058
197k
                        if (y >= height)
1059
1.67k
                            break;
1060
197k
                    }
1061
1062
449k
                    draw_slice(s, avctx, p, y);
1063
1064
449k
                    ydst = p->data[0] + p->linesize[0] * (y  + y_offset);
1065
449k
                    udst = p->data[1] + p->linesize[1] * (cy + y_offset);
1066
449k
                    vdst = p->data[2] + p->linesize[2] * (cy + y_offset);
1067
1068
449k
                    decode_422_bitstream(s, width);
1069
449k
                    lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
1070
449k
                                                       width, lefty);
1071
449k
                    if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1072
449k
                        leftu = s->llviddsp.add_left_pred(udst, s->temp[1], width2, leftu);
1073
449k
                        leftv = s->llviddsp.add_left_pred(vdst, s->temp[2], width2, leftv);
1074
449k
                    }
1075
449k
                    if (s->predictor == PLANE) {
1076
352k
                        if (cy > s->interlaced) {
1077
351k
                            s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width);
1078
351k
                            if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1079
351k
                                s->llviddsp.add_bytes(udst, udst - fake_ustride, width2);
1080
351k
                                s->llviddsp.add_bytes(vdst, vdst - fake_vstride, width2);
1081
351k
                            }
1082
351k
                        }
1083
352k
                    }
1084
449k
                }
1085
50.1k
                draw_slice(s, avctx, p, height);
1086
1087
50.1k
                break;
1088
16.3k
            case MEDIAN:
1089
                /* first line except first 2 pixels is left predicted */
1090
16.3k
                decode_422_bitstream(s, width - 2);
1091
16.3k
                lefty = s->llviddsp.add_left_pred(p->data[0] + 2, s->temp[0],
1092
16.3k
                                                   width - 2, lefty);
1093
16.3k
                if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1094
16.3k
                    leftu = s->llviddsp.add_left_pred(p->data[1] + 1, s->temp[1], width2 - 1, leftu);
1095
16.3k
                    leftv = s->llviddsp.add_left_pred(p->data[2] + 1, s->temp[2], width2 - 1, leftv);
1096
16.3k
                }
1097
1098
16.3k
                cy = y = 1;
1099
16.3k
                if (y >= height)
1100
1.30k
                    break;
1101
1102
                /* second line is left predicted for interlaced case */
1103
15.0k
                if (s->interlaced) {
1104
2.59k
                    decode_422_bitstream(s, width);
1105
2.59k
                    lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0],
1106
2.59k
                                                       s->temp[0], width, lefty);
1107
2.59k
                    if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1108
2.59k
                        leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
1109
2.59k
                        leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
1110
2.59k
                    }
1111
2.59k
                    y++;
1112
2.59k
                    cy++;
1113
2.59k
                    if (y >= height)
1114
1.32k
                        break;
1115
2.59k
                }
1116
1117
                /* next 4 pixels are left predicted too */
1118
13.7k
                decode_422_bitstream(s, 4);
1119
13.7k
                lefty = s->llviddsp.add_left_pred(p->data[0] + fake_ystride,
1120
13.7k
                                                   s->temp[0], 4, lefty);
1121
13.7k
                if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1122
13.7k
                    leftu = s->llviddsp.add_left_pred(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
1123
13.7k
                    leftv = s->llviddsp.add_left_pred(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
1124
13.7k
                }
1125
1126
                /* next line except the first 4 pixels is median predicted */
1127
13.7k
                lefttopy = p->data[0][3];
1128
13.7k
                decode_422_bitstream(s, width - 4);
1129
13.7k
                s->llviddsp.add_median_pred(p->data[0] + fake_ystride + 4,
1130
13.7k
                                             p->data[0] + 4, s->temp[0],
1131
13.7k
                                             width - 4, &lefty, &lefttopy);
1132
13.7k
                if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1133
13.7k
                    lefttopu = p->data[1][1];
1134
13.7k
                    lefttopv = p->data[2][1];
1135
13.7k
                    s->llviddsp.add_median_pred(p->data[1] + fake_ustride + 2, p->data[1] + 2, s->temp[1], width2 - 2, &leftu, &lefttopu);
1136
13.7k
                    s->llviddsp.add_median_pred(p->data[2] + fake_vstride + 2, p->data[2] + 2, s->temp[2], width2 - 2, &leftv, &lefttopv);
1137
13.7k
                }
1138
13.7k
                y++;
1139
13.7k
                cy++;
1140
1141
877k
                for (; y < height; y++, cy++) {
1142
865k
                    uint8_t *ydst, *udst, *vdst;
1143
1144
865k
                    if (s->bitstream_bpp == 12) {
1145
1.47M
                        while (2 * cy > y) {
1146
740k
                            decode_gray_bitstream(s, width);
1147
740k
                            ydst = p->data[0] + p->linesize[0] * y;
1148
740k
                            s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1149
740k
                                                         s->temp[0], width,
1150
740k
                                                         &lefty, &lefttopy);
1151
740k
                            y++;
1152
740k
                        }
1153
729k
                        if (y >= height)
1154
1.42k
                            break;
1155
729k
                    }
1156
863k
                    draw_slice(s, avctx, p, y);
1157
1158
863k
                    decode_422_bitstream(s, width);
1159
1160
863k
                    ydst = p->data[0] + p->linesize[0] * y;
1161
863k
                    udst = p->data[1] + p->linesize[1] * cy;
1162
863k
                    vdst = p->data[2] + p->linesize[2] * cy;
1163
1164
863k
                    s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1165
863k
                                                 s->temp[0], width,
1166
863k
                                                 &lefty, &lefttopy);
1167
863k
                    if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1168
863k
                        s->llviddsp.add_median_pred(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu);
1169
863k
                        s->llviddsp.add_median_pred(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv);
1170
863k
                    }
1171
863k
                }
1172
1173
13.7k
                draw_slice(s, avctx, p, height);
1174
13.7k
                break;
1175
68.4k
            }
1176
68.4k
        }
1177
189k
    } else {
1178
189k
        int y;
1179
189k
        uint8_t left[4];
1180
189k
        const int last_line = (y_offset + height - 1) * p->linesize[0];
1181
1182
189k
        if (s->bitstream_bpp == 32) {
1183
102k
            left[A] = p->data[0][last_line + A] = get_bits(&s->gb, 8);
1184
102k
            left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8);
1185
102k
            left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8);
1186
102k
            left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8);
1187
102k
        } else {
1188
86.8k
            left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8);
1189
86.8k
            left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8);
1190
86.8k
            left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8);
1191
86.8k
            left[A] = p->data[0][last_line + A] = 255;
1192
86.8k
            skip_bits(&s->gb, 8);
1193
86.8k
        }
1194
1195
189k
        if (s->bgr32) {
1196
189k
            switch (s->predictor) {
1197
178k
            case LEFT:
1198
181k
            case PLANE:
1199
181k
                decode_bgr_bitstream(s, width - 1);
1200
181k
                s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + last_line + 4,
1201
181k
                                                 s->temp[0], width - 1, left);
1202
1203
8.06M
                for (y = height - 2; y >= 0; y--) { // Yes it is stored upside down.
1204
7.88M
                    decode_bgr_bitstream(s, width);
1205
1206
7.88M
                    s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + p->linesize[0] * (y + y_offset),
1207
7.88M
                                                     s->temp[0], width, left);
1208
7.88M
                    if (s->predictor == PLANE) {
1209
5.03M
                        if (s->bitstream_bpp != 32)
1210
1.63M
                            left[A] = 0;
1211
5.03M
                        if (y < height - 1 - s->interlaced) {
1212
5.03M
                            s->llviddsp.add_bytes(p->data[0] + p->linesize[0] * (y + y_offset),
1213
5.03M
                                              p->data[0] + p->linesize[0] * (y + y_offset) +
1214
5.03M
                                              fake_ystride, 4 * width);
1215
5.03M
                        }
1216
5.03M
                    }
1217
7.88M
                }
1218
                // just 1 large slice as this is not possible in reverse order
1219
181k
                draw_slice(s, avctx, p, height);
1220
181k
                break;
1221
7.56k
            default:
1222
7.56k
                av_log(avctx, AV_LOG_ERROR,
1223
7.56k
                       "prediction type not supported!\n");
1224
189k
            }
1225
189k
        } else {
1226
0
            av_log(avctx, AV_LOG_ERROR,
1227
0
                   "BGR24 output is not implemented yet\n");
1228
0
            return AVERROR_PATCHWELCOME;
1229
0
        }
1230
189k
    }
1231
1232
308k
    return 0;
1233
308k
}
1234
1235
static int decode_frame(AVCodecContext *avctx, AVFrame *p,
1236
                        int *got_frame, AVPacket *avpkt)
1237
2.55M
{
1238
2.55M
    const uint8_t *buf = avpkt->data;
1239
2.55M
    int buf_size       = avpkt->size;
1240
2.55M
    HYuvDecContext *s = avctx->priv_data;
1241
2.55M
    const int width  = avctx->width;
1242
2.55M
    const int height = avctx->height;
1243
2.55M
    int slice, table_size = 0, ret, nb_slices;
1244
2.55M
    unsigned slices_info_offset;
1245
2.55M
    int slice_height;
1246
1247
2.55M
    if (buf_size < (width * height + 7)/8)
1248
2.22M
        return AVERROR_INVALIDDATA;
1249
1250
332k
    av_fast_padded_malloc(&s->bitstream_buffer,
1251
332k
                   &s->bitstream_buffer_size,
1252
332k
                   buf_size);
1253
332k
    if (!s->bitstream_buffer)
1254
0
        return AVERROR(ENOMEM);
1255
1256
332k
    s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer,
1257
332k
                      (const uint32_t *) buf, buf_size / 4);
1258
1259
332k
    if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0)
1260
12
        return ret;
1261
1262
332k
    if (s->context) {
1263
33.4k
        table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
1264
33.4k
        if (table_size < 0)
1265
20.5k
            return table_size;
1266
33.4k
    }
1267
1268
311k
    if ((unsigned) (buf_size - table_size) >= INT_MAX / 8)
1269
0
        return AVERROR_INVALIDDATA;
1270
1271
311k
    s->last_slice_end = 0;
1272
1273
311k
    if (avctx->codec_id == AV_CODEC_ID_HYMT &&
1274
126k
        (buf_size > 32 && AV_RL32(avpkt->data + buf_size - 16) == 0)) {
1275
3.87k
        slices_info_offset = AV_RL32(avpkt->data + buf_size - 4);
1276
3.87k
        slice_height = AV_RL32(avpkt->data + buf_size - 8);
1277
3.87k
        nb_slices = AV_RL32(avpkt->data + buf_size - 12);
1278
3.87k
        if (nb_slices * 8LL + slices_info_offset > buf_size - 16 ||
1279
3.33k
            s->chroma_v_shift ||
1280
2.87k
            slice_height <= 0 || nb_slices * (uint64_t)slice_height > height)
1281
2.22k
            return AVERROR_INVALIDDATA;
1282
307k
    } else {
1283
307k
        slice_height = height;
1284
307k
        nb_slices = 1;
1285
307k
    }
1286
1287
617k
    for (slice = 0; slice < nb_slices; slice++) {
1288
309k
        int y_offset, slice_offset, slice_size;
1289
1290
309k
        if (nb_slices > 1) {
1291
1.82k
            slice_offset = AV_RL32(avpkt->data + slices_info_offset + slice * 8);
1292
1.82k
            slice_size = AV_RL32(avpkt->data + slices_info_offset + slice * 8 + 4);
1293
1294
1.82k
            if (slice_offset < 0 || slice_size <= 0 || (slice_offset&3) ||
1295
981
                slice_offset + (int64_t)slice_size > buf_size)
1296
1.17k
                return AVERROR_INVALIDDATA;
1297
1298
649
            y_offset = height - (slice + 1) * slice_height;
1299
649
            s->bdsp.bswap_buf((uint32_t *)s->bitstream_buffer,
1300
649
                              (const uint32_t *)(buf + slice_offset), slice_size / 4);
1301
307k
        } else {
1302
307k
            y_offset = 0;
1303
307k
            slice_offset = 0;
1304
307k
            slice_size = buf_size;
1305
307k
        }
1306
1307
308k
        ret = decode_slice(avctx, p, slice_height, slice_size, y_offset, table_size);
1308
308k
        emms_c();
1309
308k
        if (ret < 0)
1310
228
            return ret;
1311
308k
    }
1312
1313
307k
    *got_frame = 1;
1314
1315
307k
    return (get_bits_count(&s->gb) + 31) / 32 * 4 + table_size;
1316
309k
}
1317
1318
const FFCodec ff_huffyuv_decoder = {
1319
    .p.name           = "huffyuv",
1320
    CODEC_LONG_NAME("Huffyuv / HuffYUV"),
1321
    .p.type           = AVMEDIA_TYPE_VIDEO,
1322
    .p.id             = AV_CODEC_ID_HUFFYUV,
1323
    .priv_data_size   = sizeof(HYuvDecContext),
1324
    .init             = decode_init,
1325
    .close            = decode_end,
1326
    FF_CODEC_DECODE_CB(decode_frame),
1327
    .p.capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1328
                        AV_CODEC_CAP_FRAME_THREADS,
1329
    .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP,
1330
};
1331
1332
#if CONFIG_FFVHUFF_DECODER
1333
const FFCodec ff_ffvhuff_decoder = {
1334
    .p.name           = "ffvhuff",
1335
    CODEC_LONG_NAME("Huffyuv FFmpeg variant"),
1336
    .p.type           = AVMEDIA_TYPE_VIDEO,
1337
    .p.id             = AV_CODEC_ID_FFVHUFF,
1338
    .priv_data_size   = sizeof(HYuvDecContext),
1339
    .init             = decode_init,
1340
    .close            = decode_end,
1341
    FF_CODEC_DECODE_CB(decode_frame),
1342
    .p.capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1343
                        AV_CODEC_CAP_FRAME_THREADS,
1344
    .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP,
1345
};
1346
#endif /* CONFIG_FFVHUFF_DECODER */
1347
1348
#if CONFIG_HYMT_DECODER
1349
const FFCodec ff_hymt_decoder = {
1350
    .p.name           = "hymt",
1351
    CODEC_LONG_NAME("HuffYUV MT"),
1352
    .p.type           = AVMEDIA_TYPE_VIDEO,
1353
    .p.id             = AV_CODEC_ID_HYMT,
1354
    .priv_data_size   = sizeof(HYuvDecContext),
1355
    .init             = decode_init,
1356
    .close            = decode_end,
1357
    FF_CODEC_DECODE_CB(decode_frame),
1358
    .p.capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1359
                        AV_CODEC_CAP_FRAME_THREADS,
1360
    .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP,
1361
};
1362
#endif /* CONFIG_HYMT_DECODER */