Coverage Report

Created: 2026-04-01 07:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/sheervideo.c
Line
Count
Source
1
/*
2
 * BitJazz SheerVideo decoder
3
 * Copyright (c) 2016 Paul B Mahol
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21
22
#define CACHED_BITSTREAM_READER !ARCH_X86_32
23
3.21G
#define SHEER_VLC_BITS 12
24
25
#include "libavutil/intreadwrite.h"
26
#include "avcodec.h"
27
#include "codec_internal.h"
28
#include "get_bits.h"
29
#include "thread.h"
30
#include "sheervideodata.h"
31
32
typedef struct SheerVideoContext {
33
    unsigned format;
34
    int alt;
35
    VLC vlc[2];
36
    void (*decode_frame)(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb);
37
} SheerVideoContext;
38
39
static void decode_ca4i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
40
1.81k
{
41
1.81k
    SheerVideoContext *s = avctx->priv_data;
42
1.81k
    uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
43
1.81k
    int x, y;
44
45
1.81k
    dst_a = (uint16_t *)p->data[3];
46
1.81k
    dst_y = (uint16_t *)p->data[0];
47
1.81k
    dst_u = (uint16_t *)p->data[1];
48
1.81k
    dst_v = (uint16_t *)p->data[2];
49
50
1.42M
    for (y = 0; y < avctx->height; y++) {
51
1.42M
        if (get_bits1(gb)) {
52
112k
            for (x = 0; x < avctx->width; x++) {
53
104k
                dst_a[x] = get_bits(gb, 10);
54
104k
                dst_y[x] = get_bits(gb, 10);
55
104k
                dst_u[x] = get_bits(gb, 10);
56
104k
                dst_v[x] = get_bits(gb, 10);
57
104k
            }
58
1.41M
        } else {
59
1.41M
            int pred[4] = { 502, 512, 512, 502 };
60
61
30.5M
            for (x = 0; x < avctx->width; x++) {
62
29.1M
                int y, u, v, a;
63
64
29.1M
                a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
65
29.1M
                y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
66
29.1M
                u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
67
29.1M
                v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
68
69
29.1M
                dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
70
29.1M
                dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
71
29.1M
                dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
72
29.1M
                dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
73
29.1M
            }
74
1.41M
        }
75
76
1.42M
        dst_y += p->linesize[0] / 2;
77
1.42M
        dst_u += p->linesize[1] / 2;
78
1.42M
        dst_v += p->linesize[2] / 2;
79
1.42M
        dst_a += p->linesize[3] / 2;
80
1.42M
    }
81
1.81k
}
82
83
static void decode_ca4p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
84
4.95k
{
85
4.95k
    SheerVideoContext *s = avctx->priv_data;
86
4.95k
    uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
87
4.95k
    int x, y;
88
89
4.95k
    dst_a = (uint16_t *)p->data[3];
90
4.95k
    dst_y = (uint16_t *)p->data[0];
91
4.95k
    dst_u = (uint16_t *)p->data[1];
92
4.95k
    dst_v = (uint16_t *)p->data[2];
93
94
4.95k
    if (get_bits1(gb)) {
95
2.62M
        for (x = 0; x < avctx->width; x++) {
96
2.62M
            dst_a[x] = get_bits(gb, 10);
97
2.62M
            dst_y[x] = get_bits(gb, 10);
98
2.62M
            dst_u[x] = get_bits(gb, 10);
99
2.62M
            dst_v[x] = get_bits(gb, 10);
100
2.62M
        }
101
2.93k
    } else {
102
2.93k
        int pred[4] = { 502, 512, 512, 502 };
103
104
15.9M
        for (x = 0; x < avctx->width; x++) {
105
15.9M
            int y, u, v, a;
106
107
15.9M
            a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
108
15.9M
            y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
109
15.9M
            u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
110
15.9M
            v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
111
112
15.9M
            dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
113
15.9M
            dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
114
15.9M
            dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
115
15.9M
            dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
116
15.9M
        }
117
2.93k
    }
118
119
4.95k
    dst_y += p->linesize[0] / 2;
120
4.95k
    dst_u += p->linesize[1] / 2;
121
4.95k
    dst_v += p->linesize[2] / 2;
122
4.95k
    dst_a += p->linesize[3] / 2;
123
124
1.62M
    for (y = 1; y < avctx->height; y++) {
125
1.61M
        if (get_bits1(gb)) {
126
189k
            for (x = 0; x < avctx->width; x++) {
127
172k
                dst_a[x] = get_bits(gb, 10);
128
172k
                dst_y[x] = get_bits(gb, 10);
129
172k
                dst_u[x] = get_bits(gb, 10);
130
172k
                dst_v[x] = get_bits(gb, 10);
131
172k
            }
132
1.60M
        } else {
133
1.60M
            int pred_TL[4], pred_L[4], pred_T[4];
134
1.60M
            int y, u, v, a;
135
136
1.60M
            pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
137
1.60M
            pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
138
1.60M
            pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
139
1.60M
            pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
140
141
25.8M
            for (x = 0; x < avctx->width; x++) {
142
24.2M
                pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
143
24.2M
                pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
144
24.2M
                pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
145
24.2M
                pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
146
147
24.2M
                a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
148
24.2M
                y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
149
24.2M
                u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
150
24.2M
                v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
151
152
24.2M
                dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
153
24.2M
                dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
154
24.2M
                dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
155
24.2M
                dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
156
157
24.2M
                pred_TL[0] = pred_T[0];
158
24.2M
                pred_TL[1] = pred_T[1];
159
24.2M
                pred_TL[2] = pred_T[2];
160
24.2M
                pred_TL[3] = pred_T[3];
161
24.2M
            }
162
1.60M
        }
163
164
1.61M
        dst_y += p->linesize[0] / 2;
165
1.61M
        dst_u += p->linesize[1] / 2;
166
1.61M
        dst_v += p->linesize[2] / 2;
167
1.61M
        dst_a += p->linesize[3] / 2;
168
1.61M
    }
169
4.95k
}
170
171
static void decode_ybr10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
172
1.45k
{
173
1.45k
    SheerVideoContext *s = avctx->priv_data;
174
1.45k
    uint16_t *dst_y, *dst_u, *dst_v;
175
1.45k
    int x, y;
176
177
1.45k
    dst_y = (uint16_t *)p->data[0];
178
1.45k
    dst_u = (uint16_t *)p->data[1];
179
1.45k
    dst_v = (uint16_t *)p->data[2];
180
181
1.02M
    for (y = 0; y < avctx->height; y++) {
182
1.01M
        if (get_bits1(gb)) {
183
213k
            for (x = 0; x < avctx->width; x++) {
184
201k
                dst_y[x] = get_bits(gb, 10);
185
201k
                dst_u[x] = get_bits(gb, 10);
186
201k
                dst_v[x] = get_bits(gb, 10);
187
201k
            }
188
1.00M
        } else {
189
1.00M
            int pred[4] = { 502, 512, 512, 512 };
190
191
29.2M
            for (x = 0; x < avctx->width; x++) {
192
28.1M
                int y, u, v;
193
194
28.1M
                y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
195
28.1M
                u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
196
28.1M
                v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
197
198
28.1M
                dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
199
28.1M
                dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
200
28.1M
                dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
201
28.1M
            }
202
1.00M
        }
203
204
1.01M
        dst_y += p->linesize[0] / 2;
205
1.01M
        dst_u += p->linesize[1] / 2;
206
1.01M
        dst_v += p->linesize[2] / 2;
207
1.01M
    }
208
1.45k
}
209
210
static void decode_ybr10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
211
2.64k
{
212
2.64k
    SheerVideoContext *s = avctx->priv_data;
213
2.64k
    uint16_t *dst_y, *dst_u, *dst_v;
214
2.64k
    int x, y;
215
216
2.64k
    dst_y = (uint16_t *)p->data[0];
217
2.64k
    dst_u = (uint16_t *)p->data[1];
218
2.64k
    dst_v = (uint16_t *)p->data[2];
219
220
2.64k
    if (get_bits1(gb)) {
221
2.43M
        for (x = 0; x < avctx->width; x++) {
222
2.43M
            dst_y[x] = get_bits(gb, 10);
223
2.43M
            dst_u[x] = get_bits(gb, 10);
224
2.43M
            dst_v[x] = get_bits(gb, 10);
225
2.43M
        }
226
1.81k
    } else {
227
1.81k
        int pred[4] = { 502, 512, 512, 512 };
228
229
4.14M
        for (x = 0; x < avctx->width; x++) {
230
4.14M
            int y, u, v;
231
232
4.14M
            y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
233
4.14M
            u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
234
4.14M
            v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
235
236
4.14M
            dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
237
4.14M
            dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
238
4.14M
            dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
239
4.14M
        }
240
1.81k
    }
241
242
2.64k
    dst_y += p->linesize[0] / 2;
243
2.64k
    dst_u += p->linesize[1] / 2;
244
2.64k
    dst_v += p->linesize[2] / 2;
245
246
1.65M
    for (y = 1; y < avctx->height; y++) {
247
1.65M
        if (get_bits1(gb)) {
248
195k
            for (x = 0; x < avctx->width; x++) {
249
178k
                dst_y[x] = get_bits(gb, 10);
250
178k
                dst_u[x] = get_bits(gb, 10);
251
178k
                dst_v[x] = get_bits(gb, 10);
252
178k
            }
253
1.63M
        } else {
254
1.63M
            int pred_TL[4], pred_L[4], pred_T[4];
255
1.63M
            int y, u, v;
256
257
1.63M
            pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
258
1.63M
            pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
259
1.63M
            pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
260
261
27.1M
            for (x = 0; x < avctx->width; x++) {
262
25.5M
                pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
263
25.5M
                pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
264
25.5M
                pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
265
266
25.5M
                y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
267
25.5M
                u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
268
25.5M
                v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
269
270
25.5M
                dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
271
25.5M
                dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
272
25.5M
                dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
273
274
25.5M
                pred_TL[0] = pred_T[0];
275
25.5M
                pred_TL[1] = pred_T[1];
276
25.5M
                pred_TL[2] = pred_T[2];
277
25.5M
            }
278
1.63M
        }
279
280
1.65M
        dst_y += p->linesize[0] / 2;
281
1.65M
        dst_u += p->linesize[1] / 2;
282
1.65M
        dst_v += p->linesize[2] / 2;
283
1.65M
    }
284
2.64k
}
285
286
static void decode_yry10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
287
35.5k
{
288
35.5k
    SheerVideoContext *s = avctx->priv_data;
289
35.5k
    uint16_t *dst_y, *dst_u, *dst_v;
290
35.5k
    int x, y;
291
292
35.5k
    dst_y = (uint16_t *)p->data[0];
293
35.5k
    dst_u = (uint16_t *)p->data[1];
294
35.5k
    dst_v = (uint16_t *)p->data[2];
295
296
5.45M
    for (y = 0; y < avctx->height; y++) {
297
5.41M
        if (get_bits1(gb)) {
298
1.26M
            for (x = 0; x < avctx->width; x += 2) {
299
1.21M
                dst_y[x    ] = get_bits(gb, 10);
300
1.21M
                dst_u[x / 2] = get_bits(gb, 10);
301
1.21M
                dst_y[x + 1] = get_bits(gb, 10);
302
1.21M
                dst_v[x / 2] = get_bits(gb, 10);
303
1.21M
            }
304
5.36M
        } else {
305
5.36M
            int pred[4] = { 502, 512, 512, 0 };
306
307
17.9M
            for (x = 0; x < avctx->width; x += 2) {
308
12.5M
                int y1, y2, u, v;
309
310
12.5M
                y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
311
12.5M
                u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
312
12.5M
                y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
313
12.5M
                v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
314
315
12.5M
                dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
316
12.5M
                dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
317
12.5M
                dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
318
12.5M
                dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
319
12.5M
            }
320
5.36M
        }
321
322
5.41M
        dst_y += p->linesize[0] / 2;
323
5.41M
        dst_u += p->linesize[1] / 2;
324
5.41M
        dst_v += p->linesize[2] / 2;
325
5.41M
    }
326
35.5k
}
327
328
static void decode_yry10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
329
4.11k
{
330
4.11k
    SheerVideoContext *s = avctx->priv_data;
331
4.11k
    uint16_t *dst_y, *dst_u, *dst_v;
332
4.11k
    int x, y;
333
334
4.11k
    dst_y = (uint16_t *)p->data[0];
335
4.11k
    dst_u = (uint16_t *)p->data[1];
336
4.11k
    dst_v = (uint16_t *)p->data[2];
337
338
4.11k
    if (get_bits1(gb)) {
339
856k
        for (x = 0; x < avctx->width; x += 2) {
340
855k
            dst_y[x    ] = get_bits(gb, 10);
341
855k
            dst_u[x / 2] = get_bits(gb, 10);
342
855k
            dst_y[x + 1] = get_bits(gb, 10);
343
855k
            dst_v[x / 2] = get_bits(gb, 10);
344
855k
        }
345
2.96k
    } else {
346
2.96k
        int pred[4] = { 502, 512, 512, 0 };
347
348
7.70M
        for (x = 0; x < avctx->width; x += 2) {
349
7.69M
            int y1, y2, u, v;
350
351
7.69M
            y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
352
7.69M
            u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
353
7.69M
            y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
354
7.69M
            v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
355
356
7.69M
            dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
357
7.69M
            dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
358
7.69M
            dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
359
7.69M
            dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
360
7.69M
        }
361
2.96k
    }
362
363
4.11k
    dst_y += p->linesize[0] / 2;
364
4.11k
    dst_u += p->linesize[1] / 2;
365
4.11k
    dst_v += p->linesize[2] / 2;
366
367
4.27M
    for (y = 1; y < avctx->height; y++) {
368
4.26M
        if (get_bits1(gb)) {
369
143k
            for (x = 0; x < avctx->width; x += 2) {
370
124k
                dst_y[x    ] = get_bits(gb, 10);
371
124k
                dst_u[x / 2] = get_bits(gb, 10);
372
124k
                dst_y[x + 1] = get_bits(gb, 10);
373
124k
                dst_v[x / 2] = get_bits(gb, 10);
374
124k
            }
375
4.24M
        } else {
376
4.24M
            int pred_TL[6], pred_L[6], pred_T[6];
377
4.24M
            int y1, y2, u, v;
378
379
4.24M
            pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
380
4.24M
            pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
381
4.24M
            pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
382
383
25.3M
            for (x = 0; x < avctx->width; x += 2) {
384
21.0M
                pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
385
21.0M
                pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
386
21.0M
                pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
387
21.0M
                pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
388
389
21.0M
                y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
390
21.0M
                u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
391
21.0M
                y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
392
21.0M
                v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
393
394
21.0M
                dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
395
21.0M
                dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
396
21.0M
                dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
397
21.0M
                dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
398
399
21.0M
                pred_TL[0] = pred_T[3];
400
21.0M
                pred_TL[1] = pred_T[1];
401
21.0M
                pred_TL[2] = pred_T[2];
402
21.0M
            }
403
4.24M
        }
404
405
4.26M
        dst_y += p->linesize[0] / 2;
406
4.26M
        dst_u += p->linesize[1] / 2;
407
4.26M
        dst_v += p->linesize[2] / 2;
408
4.26M
    }
409
4.11k
}
410
411
static void decode_ca2i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
412
2.41k
{
413
2.41k
    SheerVideoContext *s = avctx->priv_data;
414
2.41k
    uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
415
2.41k
    int x, y;
416
417
2.41k
    dst_y = (uint16_t *)p->data[0];
418
2.41k
    dst_u = (uint16_t *)p->data[1];
419
2.41k
    dst_v = (uint16_t *)p->data[2];
420
2.41k
    dst_a = (uint16_t *)p->data[3];
421
422
2.81M
    for (y = 0; y < avctx->height; y++) {
423
2.81M
        if (get_bits1(gb)) {
424
297k
            for (x = 0; x < avctx->width; x += 2) {
425
282k
                dst_a[x    ] = get_bits(gb, 10);
426
282k
                dst_y[x    ] = get_bits(gb, 10);
427
282k
                dst_u[x / 2] = get_bits(gb, 10);
428
282k
                dst_a[x + 1] = get_bits(gb, 10);
429
282k
                dst_y[x + 1] = get_bits(gb, 10);
430
282k
                dst_v[x / 2] = get_bits(gb, 10);
431
282k
            }
432
2.79M
        } else {
433
2.79M
            int pred[4] = { 502, 512, 512, 502 };
434
435
35.6M
            for (x = 0; x < avctx->width; x += 2) {
436
32.8M
                int y1, y2, u, v, a1, a2;
437
438
32.8M
                a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
439
32.8M
                y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
440
32.8M
                u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
441
32.8M
                a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
442
32.8M
                y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
443
32.8M
                v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
444
445
32.8M
                dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
446
32.8M
                dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
447
32.8M
                dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
448
32.8M
                dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0x3ff;
449
32.8M
                dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
450
32.8M
                dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff;
451
32.8M
            }
452
2.79M
        }
453
454
2.81M
        dst_y += p->linesize[0] / 2;
455
2.81M
        dst_u += p->linesize[1] / 2;
456
2.81M
        dst_v += p->linesize[2] / 2;
457
2.81M
        dst_a += p->linesize[3] / 2;
458
2.81M
    }
459
2.41k
}
460
461
static void decode_ca2p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
462
6.22k
{
463
6.22k
    SheerVideoContext *s = avctx->priv_data;
464
6.22k
    uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
465
6.22k
    int x, y;
466
467
6.22k
    dst_y = (uint16_t *)p->data[0];
468
6.22k
    dst_u = (uint16_t *)p->data[1];
469
6.22k
    dst_v = (uint16_t *)p->data[2];
470
6.22k
    dst_a = (uint16_t *)p->data[3];
471
472
6.22k
    if (get_bits1(gb)) {
473
1.99M
        for (x = 0; x < avctx->width; x += 2) {
474
1.99M
            dst_a[x    ] = get_bits(gb, 10);
475
1.99M
            dst_y[x    ] = get_bits(gb, 10);
476
1.99M
            dst_u[x / 2] = get_bits(gb, 10);
477
1.99M
            dst_a[x + 1] = get_bits(gb, 10);
478
1.99M
            dst_y[x + 1] = get_bits(gb, 10);
479
1.99M
            dst_v[x / 2] = get_bits(gb, 10);
480
1.99M
        }
481
5.11k
    } else {
482
5.11k
        int pred[4] = { 502, 512, 512, 502 };
483
484
4.27M
        for (x = 0; x < avctx->width; x += 2) {
485
4.27M
            int y1, y2, u, v, a1, a2;
486
487
4.27M
            a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
488
4.27M
            y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
489
4.27M
            u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
490
4.27M
            a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
491
4.27M
            y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
492
4.27M
            v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
493
494
4.27M
            dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0x3ff;
495
4.27M
            dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0x3ff;
496
4.27M
            dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
497
4.27M
            dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0x3ff;
498
4.27M
            dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0x3ff;
499
4.27M
            dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff;
500
4.27M
        }
501
5.11k
    }
502
503
6.22k
    dst_y += p->linesize[0] / 2;
504
6.22k
    dst_u += p->linesize[1] / 2;
505
6.22k
    dst_v += p->linesize[2] / 2;
506
6.22k
    dst_a += p->linesize[3] / 2;
507
508
2.51M
    for (y = 1; y < avctx->height; y++) {
509
2.51M
        if (get_bits1(gb)) {
510
163k
            for (x = 0; x < avctx->width; x += 2) {
511
147k
                dst_a[x    ] = get_bits(gb, 10);
512
147k
                dst_y[x    ] = get_bits(gb, 10);
513
147k
                dst_u[x / 2] = get_bits(gb, 10);
514
147k
                dst_a[x + 1] = get_bits(gb, 10);
515
147k
                dst_y[x + 1] = get_bits(gb, 10);
516
147k
                dst_v[x / 2] = get_bits(gb, 10);
517
147k
            }
518
2.49M
        } else {
519
2.49M
            int pred_TL[6], pred_L[6], pred_T[6];
520
2.49M
            int y1, y2, u, v, a1, a2;
521
522
2.49M
            pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
523
2.49M
            pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
524
2.49M
            pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
525
2.49M
            pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3] / 2];
526
527
20.6M
            for (x = 0; x < avctx->width; x += 2) {
528
18.1M
                pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
529
18.1M
                pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
530
18.1M
                pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
531
18.1M
                pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
532
18.1M
                pred_T[4] = dst_a[-p->linesize[3] / 2 + x];
533
18.1M
                pred_T[5] = dst_a[-p->linesize[3] / 2 + x + 1];
534
535
18.1M
                a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
536
18.1M
                y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
537
18.1M
                u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
538
18.1M
                a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
539
18.1M
                y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
540
18.1M
                v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
541
542
18.1M
                dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
543
18.1M
                dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
544
18.1M
                dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
545
18.1M
                dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
546
18.1M
                dst_a[x    ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0x3ff;
547
18.1M
                dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0x3ff;
548
549
18.1M
                pred_TL[0] = pred_T[3];
550
18.1M
                pred_TL[1] = pred_T[1];
551
18.1M
                pred_TL[2] = pred_T[2];
552
18.1M
                pred_TL[4] = pred_T[5];
553
18.1M
            }
554
2.49M
        }
555
556
2.51M
        dst_y += p->linesize[0] / 2;
557
2.51M
        dst_u += p->linesize[1] / 2;
558
2.51M
        dst_v += p->linesize[2] / 2;
559
2.51M
        dst_a += p->linesize[3] / 2;
560
2.51M
    }
561
6.22k
}
562
563
static void decode_c82i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
564
2.94k
{
565
2.94k
    SheerVideoContext *s = avctx->priv_data;
566
2.94k
    uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
567
2.94k
    int x, y;
568
569
2.94k
    dst_y = p->data[0];
570
2.94k
    dst_u = p->data[1];
571
2.94k
    dst_v = p->data[2];
572
2.94k
    dst_a = p->data[3];
573
574
6.31M
    for (y = 0; y < avctx->height; y += 1) {
575
6.31M
        if (get_bits1(gb)) {
576
146k
            for (x = 0; x < avctx->width; x += 2) {
577
118k
                dst_a[x    ] = get_bits(gb, 8);
578
118k
                dst_y[x    ] = get_bits(gb, 8);
579
118k
                dst_u[x / 2] = get_bits(gb, 8);
580
118k
                dst_a[x + 1] = get_bits(gb, 8);
581
118k
                dst_y[x + 1] = get_bits(gb, 8);
582
118k
                dst_v[x / 2] = get_bits(gb, 8);
583
118k
            }
584
6.28M
        } else {
585
6.28M
            int pred[4] = { 125, -128, -128, 125 };
586
587
22.1M
            for (x = 0; x < avctx->width; x += 2) {
588
15.8M
                int y1, y2, u, v, a1, a2;
589
590
15.8M
                a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
591
15.8M
                y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
592
15.8M
                u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
593
15.8M
                a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
594
15.8M
                y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
595
15.8M
                v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
596
597
15.8M
                dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
598
15.8M
                dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
599
15.8M
                dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
600
15.8M
                dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
601
15.8M
                dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0xff;
602
15.8M
                dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
603
15.8M
            }
604
6.28M
        }
605
606
6.31M
        dst_y += p->linesize[0];
607
6.31M
        dst_u += p->linesize[1];
608
6.31M
        dst_v += p->linesize[2];
609
6.31M
        dst_a += p->linesize[3];
610
6.31M
    }
611
2.94k
}
612
613
static void decode_c82p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
614
4.78k
{
615
4.78k
    SheerVideoContext *s = avctx->priv_data;
616
4.78k
    uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
617
4.78k
    int x, y;
618
619
4.78k
    dst_y = p->data[0];
620
4.78k
    dst_u = p->data[1];
621
4.78k
    dst_v = p->data[2];
622
4.78k
    dst_a = p->data[3];
623
624
4.78k
    if (get_bits1(gb)) {
625
11.3k
        for (x = 0; x < avctx->width; x += 2) {
626
10.7k
            dst_a[x    ] = get_bits(gb, 8);
627
10.7k
            dst_y[x    ] = get_bits(gb, 8);
628
10.7k
            dst_u[x / 2] = get_bits(gb, 8);
629
10.7k
            dst_a[x + 1] = get_bits(gb, 8);
630
10.7k
            dst_y[x + 1] = get_bits(gb, 8);
631
10.7k
            dst_v[x / 2] = get_bits(gb, 8);
632
10.7k
        }
633
4.17k
    } else {
634
4.17k
        int pred[4] = { 125, -128, -128, 125 };
635
636
2.99M
        for (x = 0; x < avctx->width; x += 2) {
637
2.98M
            int y1, y2, u, v, a1, a2;
638
639
2.98M
            a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
640
2.98M
            y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
641
2.98M
            u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
642
2.98M
            a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
643
2.98M
            y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
644
2.98M
            v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
645
646
2.98M
            dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
647
2.98M
            dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
648
2.98M
            dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
649
2.98M
            dst_a[x    ] = pred[3] = (a1 + pred[3]) & 0xff;
650
2.98M
            dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
651
2.98M
            dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
652
2.98M
        }
653
4.17k
    }
654
655
4.78k
    dst_y += p->linesize[0];
656
4.78k
    dst_u += p->linesize[1];
657
4.78k
    dst_v += p->linesize[2];
658
4.78k
    dst_a += p->linesize[3];
659
660
6.62M
    for (y = 1; y < avctx->height; y++) {
661
6.61M
        if (get_bits1(gb)) {
662
143k
            for (x = 0; x < avctx->width; x += 2) {
663
120k
                dst_a[x    ] = get_bits(gb, 8);
664
120k
                dst_y[x    ] = get_bits(gb, 8);
665
120k
                dst_u[x / 2] = get_bits(gb, 8);
666
120k
                dst_a[x + 1] = get_bits(gb, 8);
667
120k
                dst_y[x + 1] = get_bits(gb, 8);
668
120k
                dst_v[x / 2] = get_bits(gb, 8);
669
120k
            }
670
6.59M
        } else {
671
6.59M
            int pred_TL[6], pred_L[6], pred_T[6];
672
6.59M
            int y1, y2, u, v, a1, a2;
673
674
6.59M
            pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
675
6.59M
            pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
676
6.59M
            pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
677
6.59M
            pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3]];
678
679
25.3M
            for (x = 0; x < avctx->width; x += 2) {
680
18.7M
                pred_T[0] = dst_y[-p->linesize[0] + x];
681
18.7M
                pred_T[3] = dst_y[-p->linesize[0] + x + 1];
682
18.7M
                pred_T[1] = dst_u[-p->linesize[1] + x / 2];
683
18.7M
                pred_T[2] = dst_v[-p->linesize[2] + x / 2];
684
18.7M
                pred_T[4] = dst_a[-p->linesize[3] + x];
685
18.7M
                pred_T[5] = dst_a[-p->linesize[3] + x + 1];
686
687
18.7M
                a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
688
18.7M
                y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
689
18.7M
                u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
690
18.7M
                a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
691
18.7M
                y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
692
18.7M
                v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
693
694
18.7M
                dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
695
18.7M
                dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
696
18.7M
                dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
697
18.7M
                dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
698
18.7M
                dst_a[x    ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0xff;
699
18.7M
                dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0xff;
700
701
18.7M
                pred_TL[0] = pred_T[3];
702
18.7M
                pred_TL[1] = pred_T[1];
703
18.7M
                pred_TL[2] = pred_T[2];
704
18.7M
                pred_TL[4] = pred_T[5];
705
18.7M
            }
706
6.59M
        }
707
708
6.61M
        dst_y += p->linesize[0];
709
6.61M
        dst_u += p->linesize[1];
710
6.61M
        dst_v += p->linesize[2];
711
6.61M
        dst_a += p->linesize[3];
712
6.61M
    }
713
4.78k
}
714
715
static void decode_ybyr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
716
3.88k
{
717
3.88k
    SheerVideoContext *s = avctx->priv_data;
718
3.88k
    uint8_t *dst_y, *dst_u, *dst_v;
719
3.88k
    int x, y;
720
721
3.88k
    dst_y = p->data[0];
722
3.88k
    dst_u = p->data[1];
723
3.88k
    dst_v = p->data[2];
724
725
3.88k
    if (get_bits1(gb)) {
726
1.66M
        for (x = 0; x < avctx->width; x += 2) {
727
1.66M
            dst_y[x    ] = get_bits(gb, 8);
728
1.66M
            dst_u[x / 2] = get_bits(gb, 8) + 128;
729
1.66M
            dst_y[x + 1] = get_bits(gb, 8);
730
1.66M
            dst_v[x / 2] = get_bits(gb, 8) + 128;
731
1.66M
        }
732
2.08k
    } else {
733
2.08k
        int pred[4] = { -128, 128, 128, 0 };
734
735
2.06M
        for (x = 0; x < avctx->width; x += 2) {
736
2.06M
            int y1, y2, u, v;
737
738
2.06M
            y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
739
2.06M
            u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
740
2.06M
            y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
741
2.06M
            v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
742
743
2.06M
            dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
744
2.06M
            dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
745
2.06M
            dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
746
2.06M
            dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
747
2.06M
        }
748
2.08k
    }
749
750
3.88k
    dst_y += p->linesize[0];
751
3.88k
    dst_u += p->linesize[1];
752
3.88k
    dst_v += p->linesize[2];
753
754
4.64M
    for (y = 1; y < avctx->height; y++) {
755
4.63M
        if (get_bits1(gb)) {
756
236k
            for (x = 0; x < avctx->width; x += 2) {
757
188k
                dst_y[x    ] = get_bits(gb, 8);
758
188k
                dst_u[x / 2] = get_bits(gb, 8) + 128;
759
188k
                dst_y[x + 1] = get_bits(gb, 8);
760
188k
                dst_v[x / 2] = get_bits(gb, 8) + 128;
761
188k
            }
762
4.59M
        } else {
763
4.59M
            int pred_TL[4], pred_L[4], pred_T[4];
764
4.59M
            int y1, y2, u, v;
765
766
4.59M
            pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
767
4.59M
            pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
768
4.59M
            pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
769
770
20.2M
            for (x = 0; x < avctx->width; x += 2) {
771
15.6M
                pred_T[0] = dst_y[-p->linesize[0] + x];
772
15.6M
                pred_T[3] = dst_y[-p->linesize[0] + x + 1];
773
15.6M
                pred_T[1] = dst_u[-p->linesize[1] + x / 2];
774
15.6M
                pred_T[2] = dst_v[-p->linesize[2] + x / 2];
775
776
15.6M
                y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
777
15.6M
                u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
778
15.6M
                y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
779
15.6M
                v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
780
781
15.6M
                dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
782
15.6M
                dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
783
15.6M
                dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
784
15.6M
                dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
785
786
15.6M
                pred_TL[0] = pred_T[3];
787
15.6M
                pred_TL[1] = pred_T[1];
788
15.6M
                pred_TL[2] = pred_T[2];
789
15.6M
            }
790
4.59M
        }
791
792
4.63M
        dst_y += p->linesize[0];
793
4.63M
        dst_u += p->linesize[1];
794
4.63M
        dst_v += p->linesize[2];
795
4.63M
    }
796
3.88k
}
797
798
static void decode_byryi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
799
3.81k
{
800
3.81k
    SheerVideoContext *s = avctx->priv_data;
801
3.81k
    uint8_t *dst_y, *dst_u, *dst_v;
802
3.81k
    int x, y;
803
804
3.81k
    dst_y = p->data[0];
805
3.81k
    dst_u = p->data[1];
806
3.81k
    dst_v = p->data[2];
807
808
3.81k
    if (get_bits1(gb)) {
809
835k
        for (x = 0; x < avctx->width; x += 2) {
810
835k
            dst_y[x    ] = get_bits(gb, 8);
811
835k
            dst_u[x / 2] = get_bits(gb, 8);
812
835k
            dst_y[x + 1] = get_bits(gb, 8);
813
835k
            dst_v[x / 2] = get_bits(gb, 8);
814
835k
        }
815
3.46k
    } else {
816
3.46k
        int pred[4] = { 125, -128, -128, 0 };
817
818
1.78M
        for (x = 0; x < avctx->width; x += 2) {
819
1.78M
            int y1, y2, u, v;
820
821
1.78M
            y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
822
1.78M
            u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
823
1.78M
            y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
824
1.78M
            v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
825
826
1.78M
            dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
827
1.78M
            dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
828
1.78M
            dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
829
1.78M
            dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
830
1.78M
        }
831
3.46k
    }
832
833
3.81k
    dst_y += p->linesize[0];
834
3.81k
    dst_u += p->linesize[1];
835
3.81k
    dst_v += p->linesize[2];
836
837
1.36M
    for (y = 1; y < avctx->height; y++) {
838
1.35M
        if (get_bits1(gb)) {
839
256k
            for (x = 0; x < avctx->width; x += 2) {
840
235k
                dst_y[x    ] = get_bits(gb, 8);
841
235k
                dst_u[x / 2] = get_bits(gb, 8);
842
235k
                dst_y[x + 1] = get_bits(gb, 8);
843
235k
                dst_v[x / 2] = get_bits(gb, 8);
844
235k
            }
845
1.33M
        } else {
846
1.33M
            int pred_L[4];
847
1.33M
            int y1, y2, u, v;
848
849
1.33M
            pred_L[0] = dst_y[-p->linesize[0]];
850
1.33M
            pred_L[1] = dst_u[-p->linesize[1]];
851
1.33M
            pred_L[2] = dst_v[-p->linesize[2]];
852
853
18.5M
            for (x = 0; x < avctx->width; x += 2) {
854
17.1M
                y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
855
17.1M
                u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
856
17.1M
                y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
857
17.1M
                v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
858
859
17.1M
                dst_y[x    ] = pred_L[0] = (y1 + pred_L[0]) & 0xff;
860
17.1M
                dst_u[x / 2] = pred_L[1] = (u  + pred_L[1]) & 0xff;
861
17.1M
                dst_y[x + 1] = pred_L[0] = (y2 + pred_L[0]) & 0xff;
862
17.1M
                dst_v[x / 2] = pred_L[2] = (v +  pred_L[2]) & 0xff;
863
17.1M
            }
864
1.33M
        }
865
866
1.35M
        dst_y += p->linesize[0];
867
1.35M
        dst_u += p->linesize[1];
868
1.35M
        dst_v += p->linesize[2];
869
1.35M
    }
870
3.81k
}
871
872
static void decode_byry(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
873
4.21k
{
874
4.21k
    SheerVideoContext *s = avctx->priv_data;
875
4.21k
    uint8_t *dst_y, *dst_u, *dst_v;
876
4.21k
    int x, y;
877
878
4.21k
    dst_y = p->data[0];
879
4.21k
    dst_u = p->data[1];
880
4.21k
    dst_v = p->data[2];
881
882
4.21k
    if (get_bits1(gb)) {
883
1.25M
        for (x = 0; x < avctx->width; x += 2) {
884
1.25M
            dst_y[x    ] = get_bits(gb, 8);
885
1.25M
            dst_u[x / 2] = get_bits(gb, 8);
886
1.25M
            dst_y[x + 1] = get_bits(gb, 8);
887
1.25M
            dst_v[x / 2] = get_bits(gb, 8);
888
1.25M
        }
889
3.28k
    } else {
890
3.28k
        int pred[4] = { 125, -128, -128, 0 };
891
892
5.87M
        for (x = 0; x < avctx->width; x += 2) {
893
5.87M
            int y1, y2, u, v;
894
895
5.87M
            y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
896
5.87M
            u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
897
5.87M
            y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
898
5.87M
            v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
899
900
5.87M
            dst_y[x    ] = pred[0] = (y1 + pred[0]) & 0xff;
901
5.87M
            dst_u[x / 2] = pred[1] = (u  + pred[1]) & 0xff;
902
5.87M
            dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
903
5.87M
            dst_v[x / 2] = pred[2] = (v  + pred[2]) & 0xff;
904
5.87M
        }
905
3.28k
    }
906
907
4.21k
    dst_y += p->linesize[0];
908
4.21k
    dst_u += p->linesize[1];
909
4.21k
    dst_v += p->linesize[2];
910
911
7.00M
    for (y = 1; y < avctx->height; y++) {
912
7.00M
        if (get_bits1(gb)) {
913
683k
            for (x = 0; x < avctx->width; x += 2) {
914
634k
                dst_y[x    ] = get_bits(gb, 8);
915
634k
                dst_u[x / 2] = get_bits(gb, 8);
916
634k
                dst_y[x + 1] = get_bits(gb, 8);
917
634k
                dst_v[x / 2] = get_bits(gb, 8);
918
634k
            }
919
6.95M
        } else {
920
6.95M
            int pred_TL[4], pred_L[4], pred_T[4];
921
6.95M
            int y1, y2, u, v;
922
923
6.95M
            pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
924
6.95M
            pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
925
6.95M
            pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
926
927
37.1M
            for (x = 0; x < avctx->width; x += 2) {
928
30.1M
                pred_T[0] = dst_y[-p->linesize[0] + x];
929
30.1M
                pred_T[3] = dst_y[-p->linesize[0] + x + 1];
930
30.1M
                pred_T[1] = dst_u[-p->linesize[1] + x / 2];
931
30.1M
                pred_T[2] = dst_v[-p->linesize[2] + x / 2];
932
933
30.1M
                y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
934
30.1M
                u  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
935
30.1M
                y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
936
30.1M
                v  = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
937
938
30.1M
                dst_y[x    ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
939
30.1M
                dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
940
30.1M
                dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
941
30.1M
                dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
942
943
30.1M
                pred_TL[0] = pred_T[3];
944
30.1M
                pred_TL[1] = pred_T[1];
945
30.1M
                pred_TL[2] = pred_T[2];
946
30.1M
            }
947
6.95M
        }
948
949
7.00M
        dst_y += p->linesize[0];
950
7.00M
        dst_u += p->linesize[1];
951
7.00M
        dst_v += p->linesize[2];
952
7.00M
    }
953
4.21k
}
954
955
static void decode_ybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
956
2.97k
{
957
2.97k
    SheerVideoContext *s = avctx->priv_data;
958
2.97k
    uint8_t *dst_y, *dst_u, *dst_v;
959
2.97k
    int x, y;
960
961
2.97k
    dst_y = p->data[0];
962
2.97k
    dst_u = p->data[1];
963
2.97k
    dst_v = p->data[2];
964
965
2.97k
    if (get_bits1(gb)) {
966
2.23M
        for (x = 0; x < avctx->width; x++) {
967
2.23M
            dst_y[x] = get_bits(gb, 8);
968
2.23M
            dst_u[x] = get_bits(gb, 8);
969
2.23M
            dst_v[x] = get_bits(gb, 8);
970
2.23M
        }
971
2.39k
    } else {
972
2.39k
        int pred[4] = { s->alt ? 125 : -146, -128, -128, -128 };
973
974
7.14M
        for (x = 0; x < avctx->width; x++) {
975
7.14M
            int y, u, v;
976
977
7.14M
            y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
978
7.14M
            u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
979
7.14M
            v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
980
981
7.14M
            dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
982
7.14M
            dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
983
7.14M
            dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
984
7.14M
        }
985
2.39k
    }
986
987
2.97k
    dst_y += p->linesize[0];
988
2.97k
    dst_u += p->linesize[1];
989
2.97k
    dst_v += p->linesize[2];
990
991
4.98M
    for (y = 1; y < avctx->height; y++) {
992
4.97M
        if (get_bits1(gb)) {
993
363k
            for (x = 0; x < avctx->width; x++) {
994
341k
                dst_y[x] = get_bits(gb, 8);
995
341k
                dst_u[x] = get_bits(gb, 8);
996
341k
                dst_v[x] = get_bits(gb, 8);
997
341k
            }
998
4.95M
        } else {
999
4.95M
            int pred_L[4];
1000
4.95M
            int y, u, v;
1001
1002
4.95M
            pred_L[0] = dst_y[-p->linesize[0]];
1003
4.95M
            pred_L[1] = dst_u[-p->linesize[1]];
1004
4.95M
            pred_L[2] = dst_v[-p->linesize[2]];
1005
1006
34.1M
            for (x = 0; x < avctx->width; x++) {
1007
29.2M
                y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1008
29.2M
                u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1009
29.2M
                v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1010
1011
29.2M
                dst_y[x] = pred_L[0] = (y + pred_L[0]) & 0xff;
1012
29.2M
                dst_u[x] = pred_L[1] = (u + pred_L[1]) & 0xff;
1013
29.2M
                dst_v[x] = pred_L[2] = (v + pred_L[2]) & 0xff;
1014
29.2M
            }
1015
4.95M
        }
1016
1017
4.97M
        dst_y += p->linesize[0];
1018
4.97M
        dst_u += p->linesize[1];
1019
4.97M
        dst_v += p->linesize[2];
1020
4.97M
    }
1021
2.97k
}
1022
1023
static void decode_ybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1024
2.59k
{
1025
2.59k
    SheerVideoContext *s = avctx->priv_data;
1026
2.59k
    uint8_t *dst_y, *dst_u, *dst_v;
1027
2.59k
    int x, y;
1028
1029
2.59k
    dst_y = p->data[0];
1030
2.59k
    dst_u = p->data[1];
1031
2.59k
    dst_v = p->data[2];
1032
1033
2.59k
    if (get_bits1(gb)) {
1034
190k
        for (x = 0; x < avctx->width; x++) {
1035
189k
            dst_y[x] = get_bits(gb, 8);
1036
189k
            dst_u[x] = get_bits(gb, 8);
1037
189k
            dst_v[x] = get_bits(gb, 8);
1038
189k
        }
1039
2.08k
    } else {
1040
2.08k
        int pred[4] = { s->alt ? 125 : -146, -128, -128, -128 };
1041
1042
8.08M
        for (x = 0; x < avctx->width; x++) {
1043
8.08M
            int y, u, v;
1044
1045
8.08M
            y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1046
8.08M
            u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1047
8.08M
            v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1048
1049
8.08M
            dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
1050
8.08M
            dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
1051
8.08M
            dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
1052
8.08M
        }
1053
2.08k
    }
1054
1055
2.59k
    dst_y += p->linesize[0];
1056
2.59k
    dst_u += p->linesize[1];
1057
2.59k
    dst_v += p->linesize[2];
1058
1059
1.11M
    for (y = 1; y < avctx->height; y++) {
1060
1.11M
        if (get_bits1(gb)) {
1061
381k
            for (x = 0; x < avctx->width; x++) {
1062
360k
                dst_y[x] = get_bits(gb, 8);
1063
360k
                dst_u[x] = get_bits(gb, 8);
1064
360k
                dst_v[x] = get_bits(gb, 8);
1065
360k
            }
1066
1.09M
        } else {
1067
1.09M
            int pred_TL[4], pred_L[4], pred_T[4];
1068
1.09M
            int y, u, v;
1069
1070
1.09M
            pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1071
1.09M
            pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1072
1.09M
            pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1073
1074
32.9M
            for (x = 0; x < avctx->width; x++) {
1075
31.8M
                pred_T[0] = dst_y[-p->linesize[0] + x];
1076
31.8M
                pred_T[1] = dst_u[-p->linesize[1] + x];
1077
31.8M
                pred_T[2] = dst_v[-p->linesize[2] + x];
1078
1079
31.8M
                y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1080
31.8M
                u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1081
31.8M
                v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1082
1083
31.8M
                dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1084
31.8M
                dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1085
31.8M
                dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1086
1087
31.8M
                pred_TL[0] = pred_T[0];
1088
31.8M
                pred_TL[1] = pred_T[1];
1089
31.8M
                pred_TL[2] = pred_T[2];
1090
31.8M
            }
1091
1.09M
        }
1092
1093
1.11M
        dst_y += p->linesize[0];
1094
1.11M
        dst_u += p->linesize[1];
1095
1.11M
        dst_v += p->linesize[2];
1096
1.11M
    }
1097
2.59k
}
1098
1099
static void decode_aybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1100
3.23k
{
1101
3.23k
    SheerVideoContext *s = avctx->priv_data;
1102
3.23k
    uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
1103
3.23k
    int x, y;
1104
1105
3.23k
    dst_a = p->data[3];
1106
3.23k
    dst_y = p->data[0];
1107
3.23k
    dst_u = p->data[1];
1108
3.23k
    dst_v = p->data[2];
1109
1110
3.23k
    if (get_bits1(gb)) {
1111
19.7k
        for (x = 0; x < avctx->width; x++) {
1112
19.1k
            dst_a[x] = get_bits(gb, 8);
1113
19.1k
            dst_y[x] = get_bits(gb, 8);
1114
19.1k
            dst_u[x] = get_bits(gb, 8);
1115
19.1k
            dst_v[x] = get_bits(gb, 8);
1116
19.1k
        }
1117
2.56k
    } else {
1118
2.56k
        int pred[4] = { 125, s->alt ? 125 : -146, -128, -128 };
1119
1120
11.8M
        for (x = 0; x < avctx->width; x++) {
1121
11.8M
            int a, y, u, v;
1122
1123
11.8M
            a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1124
11.8M
            y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1125
11.8M
            u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1126
11.8M
            v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1127
1128
11.8M
            dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
1129
11.8M
            dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
1130
11.8M
            dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
1131
11.8M
            dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
1132
11.8M
        }
1133
2.56k
    }
1134
1135
3.23k
    dst_a += p->linesize[3];
1136
3.23k
    dst_y += p->linesize[0];
1137
3.23k
    dst_u += p->linesize[1];
1138
3.23k
    dst_v += p->linesize[2];
1139
1140
1.34M
    for (y = 1; y < avctx->height; y++) {
1141
1.34M
        if (get_bits1(gb)) {
1142
392k
            for (x = 0; x < avctx->width; x++) {
1143
378k
                dst_a[x] = get_bits(gb, 8);
1144
378k
                dst_y[x] = get_bits(gb, 8);
1145
378k
                dst_u[x] = get_bits(gb, 8);
1146
378k
                dst_v[x] = get_bits(gb, 8);
1147
378k
            }
1148
1.33M
        } else {
1149
1.33M
            int pred_L[4];
1150
1.33M
            int a, y, u, v;
1151
1152
1.33M
            pred_L[0] = dst_a[-p->linesize[3]];
1153
1.33M
            pred_L[1] = dst_y[-p->linesize[0]];
1154
1.33M
            pred_L[2] = dst_u[-p->linesize[1]];
1155
1.33M
            pred_L[3] = dst_v[-p->linesize[2]];
1156
1157
37.3M
            for (x = 0; x < avctx->width; x++) {
1158
36.0M
                a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1159
36.0M
                y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1160
36.0M
                u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1161
36.0M
                v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1162
1163
36.0M
                dst_a[x] = pred_L[0] = (a + pred_L[0]) & 0xff;
1164
36.0M
                dst_y[x] = pred_L[1] = (y + pred_L[1]) & 0xff;
1165
36.0M
                dst_u[x] = pred_L[2] = (u + pred_L[2]) & 0xff;
1166
36.0M
                dst_v[x] = pred_L[3] = (v + pred_L[3]) & 0xff;
1167
36.0M
            }
1168
1.33M
        }
1169
1170
1.34M
        dst_a += p->linesize[3];
1171
1.34M
        dst_y += p->linesize[0];
1172
1.34M
        dst_u += p->linesize[1];
1173
1.34M
        dst_v += p->linesize[2];
1174
1.34M
    }
1175
3.23k
}
1176
1177
static void decode_aybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1178
4.39k
{
1179
4.39k
    SheerVideoContext *s = avctx->priv_data;
1180
4.39k
    uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
1181
4.39k
    int x, y;
1182
1183
4.39k
    dst_a = p->data[3];
1184
4.39k
    dst_y = p->data[0];
1185
4.39k
    dst_u = p->data[1];
1186
4.39k
    dst_v = p->data[2];
1187
1188
4.39k
    if (get_bits1(gb)) {
1189
120k
        for (x = 0; x < avctx->width; x++) {
1190
120k
            dst_a[x] = get_bits(gb, 8);
1191
120k
            dst_y[x] = get_bits(gb, 8);
1192
120k
            dst_u[x] = get_bits(gb, 8);
1193
120k
            dst_v[x] = get_bits(gb, 8);
1194
120k
        }
1195
3.94k
    } else {
1196
3.94k
        int pred[4] = { 125, s->alt ? 125 : -146, -128, -128 };
1197
1198
7.09M
        for (x = 0; x < avctx->width; x++) {
1199
7.09M
            int a, y, u, v;
1200
1201
7.09M
            a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1202
7.09M
            y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1203
7.09M
            u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1204
7.09M
            v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1205
1206
7.09M
            dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
1207
7.09M
            dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
1208
7.09M
            dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
1209
7.09M
            dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
1210
7.09M
        }
1211
3.94k
    }
1212
1213
4.39k
    dst_a += p->linesize[3];
1214
4.39k
    dst_y += p->linesize[0];
1215
4.39k
    dst_u += p->linesize[1];
1216
4.39k
    dst_v += p->linesize[2];
1217
1218
1.76M
    for (y = 1; y < avctx->height; y++) {
1219
1.75M
        if (get_bits1(gb)) {
1220
293k
            for (x = 0; x < avctx->width; x++) {
1221
276k
                dst_a[x] = get_bits(gb, 8);
1222
276k
                dst_y[x] = get_bits(gb, 8);
1223
276k
                dst_u[x] = get_bits(gb, 8);
1224
276k
                dst_v[x] = get_bits(gb, 8);
1225
276k
            }
1226
1.73M
        } else {
1227
1.73M
            int pred_TL[4], pred_L[4], pred_T[4];
1228
1.73M
            int a, y, u, v;
1229
1230
1.73M
            pred_TL[0] = pred_L[0] = dst_a[-p->linesize[3]];
1231
1.73M
            pred_TL[1] = pred_L[1] = dst_y[-p->linesize[0]];
1232
1.73M
            pred_TL[2] = pred_L[2] = dst_u[-p->linesize[1]];
1233
1.73M
            pred_TL[3] = pred_L[3] = dst_v[-p->linesize[2]];
1234
1235
31.1M
            for (x = 0; x < avctx->width; x++) {
1236
29.4M
                pred_T[0] = dst_a[-p->linesize[3] + x];
1237
29.4M
                pred_T[1] = dst_y[-p->linesize[0] + x];
1238
29.4M
                pred_T[2] = dst_u[-p->linesize[1] + x];
1239
29.4M
                pred_T[3] = dst_v[-p->linesize[2] + x];
1240
1241
29.4M
                a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1242
29.4M
                y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1243
29.4M
                u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1244
29.4M
                v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1245
1246
29.4M
                dst_a[x] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1247
29.4M
                dst_y[x] = pred_L[1] = (y + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1248
29.4M
                dst_u[x] = pred_L[2] = (u + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1249
29.4M
                dst_v[x] = pred_L[3] = (v + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
1250
1251
29.4M
                pred_TL[0] = pred_T[0];
1252
29.4M
                pred_TL[1] = pred_T[1];
1253
29.4M
                pred_TL[2] = pred_T[2];
1254
29.4M
                pred_TL[3] = pred_T[3];
1255
29.4M
            }
1256
1.73M
        }
1257
1258
1.75M
        dst_a += p->linesize[3];
1259
1.75M
        dst_y += p->linesize[0];
1260
1.75M
        dst_u += p->linesize[1];
1261
1.75M
        dst_v += p->linesize[2];
1262
1.75M
    }
1263
4.39k
}
1264
1265
static void decode_argxi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1266
1.93k
{
1267
1.93k
    SheerVideoContext *s = avctx->priv_data;
1268
1.93k
    uint16_t *dst_r, *dst_g, *dst_b, *dst_a;
1269
1.93k
    int x, y;
1270
1271
1.93k
    dst_r = (uint16_t *)p->data[2];
1272
1.93k
    dst_g = (uint16_t *)p->data[0];
1273
1.93k
    dst_b = (uint16_t *)p->data[1];
1274
1.93k
    dst_a = (uint16_t *)p->data[3];
1275
1276
1.75M
    for (y = 0; y < avctx->height; y++) {
1277
1.75M
        if (get_bits1(gb)) {
1278
590k
            for (x = 0; x < avctx->width; x++) {
1279
576k
                dst_a[x] = get_bits(gb, 10);
1280
576k
                dst_r[x] = get_bits(gb, 10);
1281
576k
                dst_g[x] = get_bits(gb, 10);
1282
576k
                dst_b[x] = get_bits(gb, 10);
1283
576k
            }
1284
1.74M
        } else {
1285
1.74M
            int pred[4] = { 512, 512, 512, 512 };
1286
1287
39.9M
            for (x = 0; x < avctx->width; x++) {
1288
38.1M
                int r, g, b, a;
1289
1290
38.1M
                a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1291
38.1M
                r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1292
38.1M
                g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1293
38.1M
                b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1294
1295
38.1M
                dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
1296
38.1M
                dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1297
38.1M
                dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1298
38.1M
                dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1299
38.1M
            }
1300
1.74M
        }
1301
1302
1.75M
        dst_r += p->linesize[2] / 2;
1303
1.75M
        dst_g += p->linesize[0] / 2;
1304
1.75M
        dst_b += p->linesize[1] / 2;
1305
1.75M
        dst_a += p->linesize[3] / 2;
1306
1.75M
    }
1307
1.93k
}
1308
1309
static void decode_argx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1310
3.78k
{
1311
3.78k
    SheerVideoContext *s = avctx->priv_data;
1312
3.78k
    uint16_t *dst_r, *dst_g, *dst_b, *dst_a;
1313
3.78k
    int x, y;
1314
1315
3.78k
    dst_r = (uint16_t *)p->data[2];
1316
3.78k
    dst_g = (uint16_t *)p->data[0];
1317
3.78k
    dst_b = (uint16_t *)p->data[1];
1318
3.78k
    dst_a = (uint16_t *)p->data[3];
1319
1320
3.78k
    if (get_bits1(gb)) {
1321
1.26M
        for (x = 0; x < avctx->width; x++) {
1322
1.26M
            dst_a[x] = get_bits(gb, 10);
1323
1.26M
            dst_r[x] = get_bits(gb, 10);
1324
1.26M
            dst_g[x] = get_bits(gb, 10);
1325
1.26M
            dst_b[x] = get_bits(gb, 10);
1326
1.26M
        }
1327
3.30k
    } else {
1328
3.30k
        int pred[4] = { 512, 512, 512, 512 };
1329
1330
10.5M
        for (x = 0; x < avctx->width; x++) {
1331
10.5M
            int r, g, b, a;
1332
1333
10.5M
            a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1334
10.5M
            r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1335
10.5M
            g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1336
10.5M
            b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1337
1338
10.5M
            dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
1339
10.5M
            dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1340
10.5M
            dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1341
10.5M
            dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1342
10.5M
        }
1343
3.30k
    }
1344
1345
3.78k
    dst_r += p->linesize[2] / 2;
1346
3.78k
    dst_g += p->linesize[0] / 2;
1347
3.78k
    dst_b += p->linesize[1] / 2;
1348
3.78k
    dst_a += p->linesize[3] / 2;
1349
1350
815k
    for (y = 1; y < avctx->height; y++) {
1351
812k
        if (get_bits1(gb)) {
1352
221k
            for (x = 0; x < avctx->width; x++) {
1353
215k
                dst_a[x] = get_bits(gb, 10);
1354
215k
                dst_r[x] = get_bits(gb, 10);
1355
215k
                dst_g[x] = get_bits(gb, 10);
1356
215k
                dst_b[x] = get_bits(gb, 10);
1357
215k
            }
1358
806k
        } else {
1359
806k
            int pred_TL[4], pred_L[4], pred_T[4];
1360
806k
            int r, g, b, a;
1361
1362
806k
            pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
1363
806k
            pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
1364
806k
            pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
1365
806k
            pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
1366
1367
46.4M
            for (x = 0; x < avctx->width; x++) {
1368
45.6M
                pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
1369
45.6M
                pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
1370
45.6M
                pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
1371
45.6M
                pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
1372
1373
45.6M
                a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1374
45.6M
                r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1375
45.6M
                g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1376
45.6M
                b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1377
1378
45.6M
                dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
1379
45.6M
                dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1380
45.6M
                dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1381
45.6M
                dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1382
1383
45.6M
                pred_TL[0] = pred_T[0];
1384
45.6M
                pred_TL[1] = pred_T[1];
1385
45.6M
                pred_TL[2] = pred_T[2];
1386
45.6M
                pred_TL[3] = pred_T[3];
1387
45.6M
            }
1388
806k
        }
1389
1390
812k
        dst_r += p->linesize[2] / 2;
1391
812k
        dst_g += p->linesize[0] / 2;
1392
812k
        dst_b += p->linesize[1] / 2;
1393
812k
        dst_a += p->linesize[3] / 2;
1394
812k
    }
1395
3.78k
}
1396
1397
static void decode_rgbxi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1398
1.32k
{
1399
1.32k
    SheerVideoContext *s = avctx->priv_data;
1400
1.32k
    uint16_t *dst_r, *dst_g, *dst_b;
1401
1.32k
    int x, y;
1402
1403
1.32k
    dst_r = (uint16_t *)p->data[2];
1404
1.32k
    dst_g = (uint16_t *)p->data[0];
1405
1.32k
    dst_b = (uint16_t *)p->data[1];
1406
1407
1.08M
    for (y = 0; y < avctx->height; y++) {
1408
1.08M
        if (get_bits1(gb)) {
1409
3.59M
            for (x = 0; x < avctx->width; x++) {
1410
3.58M
                dst_r[x] = get_bits(gb, 10);
1411
3.58M
                dst_g[x] = get_bits(gb, 10);
1412
3.58M
                dst_b[x] = get_bits(gb, 10);
1413
3.58M
            }
1414
1.06M
        } else {
1415
1.06M
            int pred[4] = { 512, 512, 512, 0 };
1416
1417
41.1M
            for (x = 0; x < avctx->width; x++) {
1418
40.0M
                int r, g, b;
1419
1420
40.0M
                r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1421
40.0M
                g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1422
40.0M
                b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1423
1424
40.0M
                dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1425
40.0M
                dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1426
40.0M
                dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1427
40.0M
            }
1428
1.06M
        }
1429
1430
1.08M
        dst_r += p->linesize[2] / 2;
1431
1.08M
        dst_g += p->linesize[0] / 2;
1432
1.08M
        dst_b += p->linesize[1] / 2;
1433
1.08M
    }
1434
1.32k
}
1435
1436
static void decode_rgbx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1437
3.20k
{
1438
3.20k
    SheerVideoContext *s = avctx->priv_data;
1439
3.20k
    uint16_t *dst_r, *dst_g, *dst_b;
1440
3.20k
    int x, y;
1441
1442
3.20k
    dst_r = (uint16_t *)p->data[2];
1443
3.20k
    dst_g = (uint16_t *)p->data[0];
1444
3.20k
    dst_b = (uint16_t *)p->data[1];
1445
1446
3.20k
    if (get_bits1(gb)) {
1447
135k
        for (x = 0; x < avctx->width; x++) {
1448
134k
            dst_r[x] = get_bits(gb, 10);
1449
134k
            dst_g[x] = get_bits(gb, 10);
1450
134k
            dst_b[x] = get_bits(gb, 10);
1451
134k
        }
1452
1.91k
    } else {
1453
1.91k
        int pred[4] = { 512, 512, 512, 0 };
1454
1455
5.13M
        for (x = 0; x < avctx->width; x++) {
1456
5.13M
            int r, g, b;
1457
1458
5.13M
            r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1459
5.13M
            g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1460
5.13M
            b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1461
1462
5.13M
            dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1463
5.13M
            dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1464
5.13M
            dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1465
5.13M
        }
1466
1.91k
    }
1467
1468
3.20k
    dst_r += p->linesize[2] / 2;
1469
3.20k
    dst_g += p->linesize[0] / 2;
1470
3.20k
    dst_b += p->linesize[1] / 2;
1471
1472
1.54M
    for (y = 1; y < avctx->height; y++) {
1473
1.54M
        if (get_bits1(gb)) {
1474
216k
            for (x = 0; x < avctx->width; x++) {
1475
201k
                dst_r[x] = get_bits(gb, 10);
1476
201k
                dst_g[x] = get_bits(gb, 10);
1477
201k
                dst_b[x] = get_bits(gb, 10);
1478
201k
            }
1479
1.52M
        } else {
1480
1.52M
            int pred_TL[4], pred_L[4], pred_T[4];
1481
1.52M
            int r, g, b;
1482
1483
1.52M
            pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
1484
1.52M
            pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
1485
1.52M
            pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
1486
1487
23.0M
            for (x = 0; x < avctx->width; x++) {
1488
21.4M
                pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
1489
21.4M
                pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
1490
21.4M
                pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
1491
1492
21.4M
                r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1493
21.4M
                g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1494
21.4M
                b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1495
1496
21.4M
                dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1497
21.4M
                dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1498
21.4M
                dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1499
1500
21.4M
                pred_TL[0] = pred_T[0];
1501
21.4M
                pred_TL[1] = pred_T[1];
1502
21.4M
                pred_TL[2] = pred_T[2];
1503
21.4M
            }
1504
1.52M
        }
1505
1506
1.54M
        dst_r += p->linesize[2] / 2;
1507
1.54M
        dst_g += p->linesize[0] / 2;
1508
1.54M
        dst_b += p->linesize[1] / 2;
1509
1.54M
    }
1510
3.20k
}
1511
1512
static void decode_argbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1513
3.38k
{
1514
3.38k
    SheerVideoContext *s = avctx->priv_data;
1515
3.38k
    uint8_t *dst;
1516
3.38k
    int x, y;
1517
1518
3.38k
    dst = p->data[0];
1519
3.38k
    if (get_bits1(gb)) {
1520
520k
        for (x = 0; x < avctx->width; x++) {
1521
519k
            dst[x * 4 + 0] = get_bits(gb, 8);
1522
519k
            dst[x * 4 + 1] = get_bits(gb, 8);
1523
519k
            dst[x * 4 + 2] = get_bits(gb, 8);
1524
519k
            dst[x * 4 + 3] = get_bits(gb, 8);
1525
519k
        }
1526
2.55k
    } else {
1527
2.55k
        int pred[4] = { -128, -128, -128, -128 };
1528
1529
10.7M
        for (x = 0; x < avctx->width; x++) {
1530
10.7M
            int a, r, g, b;
1531
1532
10.7M
            a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1533
10.7M
            r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1534
10.7M
            g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1535
10.7M
            b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1536
1537
10.7M
            dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
1538
10.7M
            dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
1539
10.7M
            dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
1540
10.7M
            dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
1541
10.7M
        }
1542
2.55k
    }
1543
1544
3.38k
    dst += p->linesize[0];
1545
1.62M
    for (y = 1; y < avctx->height; y++) {
1546
1.62M
        if (get_bits1(gb)) {
1547
514k
            for (x = 0; x < avctx->width; x++) {
1548
495k
                dst[x * 4 + 0] = get_bits(gb, 8);
1549
495k
                dst[x * 4 + 1] = get_bits(gb, 8);
1550
495k
                dst[x * 4 + 2] = get_bits(gb, 8);
1551
495k
                dst[x * 4 + 3] = get_bits(gb, 8);
1552
495k
            }
1553
1.60M
        } else {
1554
1.60M
            int pred_L[4];
1555
1.60M
            int a, r, g, b;
1556
1557
1.60M
            pred_L[0] = dst[-p->linesize[0] + 0];
1558
1.60M
            pred_L[1] = dst[-p->linesize[0] + 1];
1559
1.60M
            pred_L[2] = dst[-p->linesize[0] + 2];
1560
1.60M
            pred_L[3] = dst[-p->linesize[0] + 3];
1561
1562
54.9M
            for (x = 0; x < avctx->width; x++) {
1563
53.3M
                a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1564
53.3M
                r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1565
53.3M
                g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1566
53.3M
                b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1567
1568
53.3M
                dst[4 * x + 0] = pred_L[0] = (a + pred_L[0]) & 0xff;
1569
53.3M
                dst[4 * x + 1] = pred_L[1] = (r + pred_L[1]) & 0xff;
1570
53.3M
                dst[4 * x + 2] = pred_L[2] = (r + g + pred_L[2]) & 0xff;
1571
53.3M
                dst[4 * x + 3] = pred_L[3] = (r + g + b + pred_L[3]) & 0xff;
1572
53.3M
            }
1573
1.60M
        }
1574
1.62M
        dst += p->linesize[0];
1575
1.62M
    }
1576
3.38k
}
1577
1578
static void decode_argb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1579
3.75k
{
1580
3.75k
    SheerVideoContext *s = avctx->priv_data;
1581
3.75k
    uint8_t *dst;
1582
3.75k
    int x, y;
1583
1584
3.75k
    dst = p->data[0];
1585
3.75k
    if (get_bits1(gb)) {
1586
3.60M
        for (x = 0; x < avctx->width; x++) {
1587
3.60M
            dst[x * 4 + 0] = get_bits(gb, 8);
1588
3.60M
            dst[x * 4 + 1] = get_bits(gb, 8);
1589
3.60M
            dst[x * 4 + 2] = get_bits(gb, 8);
1590
3.60M
            dst[x * 4 + 3] = get_bits(gb, 8);
1591
3.60M
        }
1592
2.66k
    } else {
1593
2.66k
        int pred[4] = { -128, -128, -128, -128 };
1594
1595
8.45M
        for (x = 0; x < avctx->width; x++) {
1596
8.45M
            int a, r, g, b;
1597
1598
8.45M
            a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1599
8.45M
            r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1600
8.45M
            g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1601
8.45M
            b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1602
1603
8.45M
            dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
1604
8.45M
            dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
1605
8.45M
            dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
1606
8.45M
            dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
1607
8.45M
        }
1608
2.66k
    }
1609
1610
3.75k
    dst += p->linesize[0];
1611
2.35M
    for (y = 1; y < avctx->height; y++) {
1612
2.35M
        if (get_bits1(gb)) {
1613
123k
            for (x = 0; x < avctx->width; x++) {
1614
101k
                dst[x * 4 + 0] = get_bits(gb, 8);
1615
101k
                dst[x * 4 + 1] = get_bits(gb, 8);
1616
101k
                dst[x * 4 + 2] = get_bits(gb, 8);
1617
101k
                dst[x * 4 + 3] = get_bits(gb, 8);
1618
101k
            }
1619
2.33M
        } else {
1620
2.33M
            int pred_TL[4], pred_L[4], pred_T[4];
1621
2.33M
            int a, r, g, b;
1622
1623
2.33M
            pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
1624
2.33M
            pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
1625
2.33M
            pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
1626
2.33M
            pred_TL[3] = pred_L[3] = dst[-p->linesize[0] + 3];
1627
1628
29.9M
            for (x = 0; x < avctx->width; x++) {
1629
27.6M
                pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
1630
27.6M
                pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
1631
27.6M
                pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
1632
27.6M
                pred_T[3] = dst[-p->linesize[0] + 4 * x + 3];
1633
1634
27.6M
                a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1635
27.6M
                r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1636
27.6M
                g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1637
27.6M
                b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1638
1639
27.6M
                dst[4 * x + 0] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1640
27.6M
                dst[4 * x + 1] = pred_L[1] = (r + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1641
27.6M
                dst[4 * x + 2] = pred_L[2] = (r + g + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1642
27.6M
                dst[4 * x + 3] = pred_L[3] = (r + g + b + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
1643
1644
27.6M
                pred_TL[0] = pred_T[0];
1645
27.6M
                pred_TL[1] = pred_T[1];
1646
27.6M
                pred_TL[2] = pred_T[2];
1647
27.6M
                pred_TL[3] = pred_T[3];
1648
27.6M
            }
1649
2.33M
        }
1650
2.35M
        dst += p->linesize[0];
1651
2.35M
    }
1652
3.75k
}
1653
1654
static void decode_rgbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1655
2.91k
{
1656
2.91k
    SheerVideoContext *s = avctx->priv_data;
1657
2.91k
    uint8_t *dst;
1658
2.91k
    int x, y;
1659
1660
2.91k
    dst = p->data[0];
1661
2.91k
    if (get_bits1(gb)) {
1662
1.14M
        for (x = 0; x < avctx->width; x++) {
1663
1.14M
            dst[x * 4 + 0] = get_bits(gb, 8);
1664
1.14M
            dst[x * 4 + 1] = get_bits(gb, 8);
1665
1.14M
            dst[x * 4 + 2] = get_bits(gb, 8);
1666
1.14M
        }
1667
1.62k
    } else {
1668
1.62k
        int pred[4] = { -128, -128, -128, -128 };
1669
1670
6.47M
        for (x = 0; x < avctx->width; x++) {
1671
6.47M
            int r, g, b;
1672
1673
6.47M
            r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1674
6.47M
            g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1675
6.47M
            b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1676
1677
6.47M
            dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
1678
6.47M
            dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
1679
6.47M
            dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
1680
6.47M
        }
1681
1.62k
    }
1682
1683
2.91k
    dst += p->linesize[0];
1684
1.74M
    for (y = 1; y < avctx->height; y++) {
1685
1.73M
        if (get_bits1(gb)) {
1686
255k
            for (x = 0; x < avctx->width; x++) {
1687
231k
                dst[x * 4 + 0] = get_bits(gb, 8);
1688
231k
                dst[x * 4 + 1] = get_bits(gb, 8);
1689
231k
                dst[x * 4 + 2] = get_bits(gb, 8);
1690
231k
            }
1691
1.71M
        } else {
1692
1.71M
            int pred_L[4];
1693
1.71M
            int r, g, b;
1694
1695
1.71M
            pred_L[0] = dst[-p->linesize[0] + 0];
1696
1.71M
            pred_L[1] = dst[-p->linesize[0] + 1];
1697
1.71M
            pred_L[2] = dst[-p->linesize[0] + 2];
1698
1699
21.6M
            for (x = 0; x < avctx->width; x++) {
1700
19.9M
                r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1701
19.9M
                g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1702
19.9M
                b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1703
1704
19.9M
                dst[4 * x + 0] = pred_L[0] = (r + pred_L[0]) & 0xff;
1705
19.9M
                dst[4 * x + 1] = pred_L[1] = (r + g + pred_L[1]) & 0xff;
1706
19.9M
                dst[4 * x + 2] = pred_L[2] = (r + g + b + pred_L[2]) & 0xff;
1707
19.9M
            }
1708
1.71M
        }
1709
1.73M
        dst += p->linesize[0];
1710
1.73M
    }
1711
2.91k
}
1712
1713
static void decode_rgb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1714
3.01k
{
1715
3.01k
    SheerVideoContext *s = avctx->priv_data;
1716
3.01k
    uint8_t *dst;
1717
3.01k
    int x, y;
1718
1719
3.01k
    dst = p->data[0];
1720
3.01k
    if (get_bits1(gb)) {
1721
64.5k
        for (x = 0; x < avctx->width; x++) {
1722
63.9k
            dst[x * 4 + 0] = get_bits(gb, 8);
1723
63.9k
            dst[x * 4 + 1] = get_bits(gb, 8);
1724
63.9k
            dst[x * 4 + 2] = get_bits(gb, 8);
1725
63.9k
        }
1726
2.44k
    } else {
1727
2.44k
        int pred[4] = { -128, -128, -128, -128 };
1728
1729
7.59M
        for (x = 0; x < avctx->width; x++) {
1730
7.59M
            int r, g, b;
1731
1732
7.59M
            r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1733
7.59M
            g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1734
7.59M
            b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1735
1736
7.59M
            dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
1737
7.59M
            dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
1738
7.59M
            dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
1739
7.59M
        }
1740
2.44k
    }
1741
1742
3.01k
    dst += p->linesize[0];
1743
589k
    for (y = 1; y < avctx->height; y++) {
1744
586k
        if (get_bits1(gb)) {
1745
310k
            for (x = 0; x < avctx->width; x++) {
1746
291k
                dst[x * 4 + 0] = get_bits(gb, 8);
1747
291k
                dst[x * 4 + 1] = get_bits(gb, 8);
1748
291k
                dst[x * 4 + 2] = get_bits(gb, 8);
1749
291k
            }
1750
567k
        } else {
1751
567k
            int pred_TL[4], pred_L[4], pred_T[4];
1752
567k
            int r, g, b;
1753
1754
567k
            pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
1755
567k
            pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
1756
567k
            pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
1757
1758
35.8M
            for (x = 0; x < avctx->width; x++) {
1759
35.3M
                pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
1760
35.3M
                pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
1761
35.3M
                pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
1762
1763
35.3M
                r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1764
35.3M
                g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1765
35.3M
                b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1766
1767
35.3M
                dst[4 * x + 0] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1768
35.3M
                dst[4 * x + 1] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1769
35.3M
                dst[4 * x + 2] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1770
1771
35.3M
                pred_TL[0] = pred_T[0];
1772
35.3M
                pred_TL[1] = pred_T[1];
1773
35.3M
                pred_TL[2] = pred_T[2];
1774
35.3M
            }
1775
567k
        }
1776
586k
        dst += p->linesize[0];
1777
586k
    }
1778
3.01k
}
1779
1780
static av_cold int build_vlc(VLC *vlc, const SheerTable *table)
1781
34.5k
{
1782
34.5k
    const uint8_t *cur = table->lens;
1783
34.5k
    uint8_t  lens[1024];
1784
34.5k
    unsigned count = 0;
1785
1786
1.10M
    for (int step = 1, len = 1; len > 0; len += step) {
1787
1.07M
        unsigned new_count = count;
1788
1789
1.07M
        if (len == 16) {
1790
34.5k
            new_count += table->nb_16s;
1791
34.5k
            step       = -1;
1792
34.5k
        } else
1793
1.03M
            new_count += *cur++;
1794
1795
22.3M
        for (; count < new_count; count++)
1796
21.2M
            lens[count]  = len;
1797
1.07M
    }
1798
1799
34.5k
    ff_vlc_free(vlc);
1800
34.5k
    return ff_vlc_init_from_lengths(vlc, SHEER_VLC_BITS, count,
1801
34.5k
                                    lens, sizeof(*lens), NULL, 0, 0, 0, 0, NULL);
1802
34.5k
}
1803
1804
static int decode_frame(AVCodecContext *avctx, AVFrame *p,
1805
                        int *got_frame, AVPacket *avpkt)
1806
285k
{
1807
285k
    SheerVideoContext *s = avctx->priv_data;
1808
285k
    const SheerTable *table;
1809
285k
    GetBitContext gb;
1810
285k
    unsigned format;
1811
285k
    int ret;
1812
1813
285k
    if (avpkt->size <= 20)
1814
97.6k
        return AVERROR_INVALIDDATA;
1815
1816
187k
    if (AV_RL32(avpkt->data) != MKTAG('S','h','i','r') &&
1817
185k
        AV_RL32(avpkt->data) != MKTAG('Z','w','a','k'))
1818
21.9k
        return AVERROR_INVALIDDATA;
1819
1820
165k
    s->alt = 0;
1821
165k
    format = AV_RL32(avpkt->data + 16);
1822
165k
    av_log(avctx, AV_LOG_DEBUG, "format: %s\n", av_fourcc2str(format));
1823
165k
    switch (format) {
1824
3.69k
    case MKTAG(' ', 'R', 'G', 'B'):
1825
3.69k
        avctx->pix_fmt = AV_PIX_FMT_RGB0;
1826
3.69k
        s->decode_frame = decode_rgb;
1827
3.69k
        table           = rgb;
1828
3.69k
        break;
1829
3.81k
    case MKTAG(' ', 'r', 'G', 'B'):
1830
3.81k
        avctx->pix_fmt = AV_PIX_FMT_RGB0;
1831
3.81k
        s->decode_frame = decode_rgbi;
1832
3.81k
        table           = rgbi;
1833
3.81k
        break;
1834
4.34k
    case MKTAG('A', 'R', 'G', 'X'):
1835
4.34k
        avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
1836
4.34k
        s->decode_frame = decode_argx;
1837
4.34k
        table           = rgbx;
1838
4.34k
        break;
1839
2.29k
    case MKTAG('A', 'r', 'G', 'X'):
1840
2.29k
        avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
1841
2.29k
        s->decode_frame = decode_argxi;
1842
2.29k
        table           = rgbxi;
1843
2.29k
        break;
1844
3.93k
    case MKTAG('R', 'G', 'B', 'X'):
1845
3.93k
        avctx->pix_fmt = AV_PIX_FMT_GBRP10;
1846
3.93k
        s->decode_frame = decode_rgbx;
1847
3.93k
        table           = rgbx;
1848
3.93k
        break;
1849
1.69k
    case MKTAG('r', 'G', 'B', 'X'):
1850
1.69k
        avctx->pix_fmt = AV_PIX_FMT_GBRP10;
1851
1.69k
        s->decode_frame = decode_rgbxi;
1852
1.69k
        table           = rgbxi;
1853
1.69k
        break;
1854
4.25k
    case MKTAG('A', 'R', 'G', 'B'):
1855
4.25k
        avctx->pix_fmt = AV_PIX_FMT_ARGB;
1856
4.25k
        s->decode_frame = decode_argb;
1857
4.25k
        table           = rgb;
1858
4.25k
        break;
1859
4.00k
    case MKTAG('A', 'r', 'G', 'B'):
1860
4.00k
        avctx->pix_fmt = AV_PIX_FMT_ARGB;
1861
4.00k
        s->decode_frame = decode_argbi;
1862
4.00k
        table           = rgbi;
1863
4.00k
        break;
1864
1.01k
    case MKTAG('A', 'Y', 'B', 'R'):
1865
1.01k
        s->alt = 1;
1866
6.39k
    case MKTAG('A', 'Y', 'b', 'R'):
1867
6.39k
        avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
1868
6.39k
        s->decode_frame = decode_aybr;
1869
6.39k
        table           = ybr;
1870
6.39k
        break;
1871
2.33k
    case MKTAG('A', 'y', 'B', 'R'):
1872
2.33k
        s->alt = 1;
1873
3.83k
    case MKTAG('A', 'y', 'b', 'R'):
1874
3.83k
        avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
1875
3.83k
        s->decode_frame = decode_aybri;
1876
3.83k
        table           = ybri;
1877
3.83k
        break;
1878
1.89k
    case MKTAG(' ', 'Y', 'B', 'R'):
1879
1.89k
        s->alt = 1;
1880
3.35k
    case MKTAG(' ', 'Y', 'b', 'R'):
1881
3.35k
        avctx->pix_fmt = AV_PIX_FMT_YUV444P;
1882
3.35k
        s->decode_frame = decode_ybr;
1883
3.35k
        table           = ybr;
1884
3.35k
        break;
1885
2.36k
    case MKTAG(' ', 'y', 'B', 'R'):
1886
2.36k
        s->alt = 1;
1887
4.46k
    case MKTAG(' ', 'y', 'b', 'R'):
1888
4.46k
        avctx->pix_fmt = AV_PIX_FMT_YUV444P;
1889
4.46k
        s->decode_frame = decode_ybri;
1890
4.46k
        table           = ybri;
1891
4.46k
        break;
1892
3.03k
    case MKTAG('Y', 'B', 'R', 0x0a):
1893
3.03k
        avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
1894
3.03k
        s->decode_frame = decode_ybr10;
1895
3.03k
        table           = ybr10;
1896
3.03k
        break;
1897
2.49k
    case MKTAG('y', 'B', 'R', 0x0a):
1898
2.49k
        avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
1899
2.49k
        s->decode_frame = decode_ybr10i;
1900
2.49k
        table           = ybr10i;
1901
2.49k
        break;
1902
7.62k
    case MKTAG('C', 'A', '4', 'p'):
1903
7.62k
        avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
1904
7.62k
        s->decode_frame = decode_ca4p;
1905
7.62k
        table           = ybr10;
1906
7.62k
        break;
1907
2.66k
    case MKTAG('C', 'A', '4', 'i'):
1908
2.66k
        avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
1909
2.66k
        s->decode_frame = decode_ca4i;
1910
2.66k
        table           = ybr10i;
1911
2.66k
        break;
1912
5.14k
    case MKTAG('B', 'Y', 'R', 'Y'):
1913
5.14k
        avctx->pix_fmt = AV_PIX_FMT_YUV422P;
1914
5.14k
        s->decode_frame = decode_byry;
1915
5.14k
        table           = byry;
1916
5.14k
        break;
1917
4.45k
    case MKTAG('B', 'Y', 'R', 'y'):
1918
4.45k
        avctx->pix_fmt = AV_PIX_FMT_YUV422P;
1919
4.45k
        s->decode_frame = decode_byryi;
1920
4.45k
        table           = byryi;
1921
4.45k
        break;
1922
4.64k
    case MKTAG('Y', 'b', 'Y', 'r'):
1923
4.64k
        avctx->pix_fmt = AV_PIX_FMT_YUV422P;
1924
4.64k
        s->decode_frame = decode_ybyr;
1925
4.64k
        table           = ybyr;
1926
4.64k
        break;
1927
5.56k
    case MKTAG('C', '8', '2', 'p'):
1928
5.56k
        avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
1929
5.56k
        s->decode_frame = decode_c82p;
1930
5.56k
        table           = byry;
1931
5.56k
        break;
1932
3.38k
    case MKTAG('C', '8', '2', 'i'):
1933
3.38k
        avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
1934
3.38k
        s->decode_frame = decode_c82i;
1935
3.38k
        table           = byryi;
1936
3.38k
        break;
1937
5.67k
    case MKTAG(0xa2, 'Y', 'R', 'Y'):
1938
5.67k
        avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
1939
5.67k
        s->decode_frame = decode_yry10;
1940
5.67k
        table           = yry10;
1941
5.67k
        break;
1942
38.6k
    case MKTAG(0xa2, 'Y', 'R', 'y'):
1943
38.6k
        avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
1944
38.6k
        s->decode_frame = decode_yry10i;
1945
38.6k
        table           = yry10i;
1946
38.6k
        break;
1947
7.35k
    case MKTAG('C', 'A', '2', 'p'):
1948
7.35k
        avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
1949
7.35k
        s->decode_frame = decode_ca2p;
1950
7.35k
        table           = yry10;
1951
7.35k
        break;
1952
2.95k
    case MKTAG('C', 'A', '2', 'i'):
1953
2.95k
        avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
1954
2.95k
        s->decode_frame = decode_ca2i;
1955
2.95k
        table           = yry10i;
1956
2.95k
        break;
1957
26.0k
    default:
1958
26.0k
        avpriv_request_sample(avctx, "unsupported format: 0x%X", format);
1959
26.0k
        return AVERROR_PATCHWELCOME;
1960
165k
    }
1961
1962
139k
    if (s->format != format) {
1963
17.2k
        if ((ret = build_vlc(&s->vlc[0], &table[0])) < 0 ||
1964
17.2k
            (ret = build_vlc(&s->vlc[1], &table[1])) < 0) {
1965
0
            s->format = 0;
1966
0
            return ret;
1967
0
        }
1968
17.2k
        s->format = format;
1969
17.2k
    }
1970
139k
    if (avpkt->size < 20 + avctx->width * avctx->height / 16) {
1971
16.1k
        av_log(avctx, AV_LOG_ERROR, "Input packet too small\n");
1972
16.1k
        return AVERROR_INVALIDDATA;
1973
16.1k
    }
1974
1975
123k
    if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0)
1976
8.22k
        return ret;
1977
1978
115k
    if ((ret = init_get_bits8(&gb, avpkt->data + 20, avpkt->size - 20)) < 0)
1979
0
        return ret;
1980
1981
115k
    s->decode_frame(avctx, p, &gb);
1982
1983
115k
    *got_frame = 1;
1984
1985
115k
    return avpkt->size;
1986
115k
}
1987
1988
static av_cold int decode_end(AVCodecContext *avctx)
1989
6.84k
{
1990
6.84k
    SheerVideoContext *s = avctx->priv_data;
1991
1992
6.84k
    ff_vlc_free(&s->vlc[0]);
1993
6.84k
    ff_vlc_free(&s->vlc[1]);
1994
1995
6.84k
    return 0;
1996
6.84k
}
1997
1998
const FFCodec ff_sheervideo_decoder = {
1999
    .p.name           = "sheervideo",
2000
    CODEC_LONG_NAME("BitJazz SheerVideo"),
2001
    .p.type           = AVMEDIA_TYPE_VIDEO,
2002
    .p.id             = AV_CODEC_ID_SHEERVIDEO,
2003
    .p.capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,
2004
    .priv_data_size   = sizeof(SheerVideoContext),
2005
    .close            = decode_end,
2006
    FF_CODEC_DECODE_CB(decode_frame),
2007
};