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