FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/sheervideo.c
Date: 2024-04-17 23:49:55
Exec Total Coverage
Lines: 0 1312 0.0%
Functions: 0 28 0.0%
Branches: 0 370 0.0%

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