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