2 * BitJazz SheerVideo decoder
3 * Copyright (c) 2016 Paul B Mahol
5 * This file is part of FFmpeg.
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.
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.
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
26 #define CACHED_BITSTREAM_READER !ARCH_X86_32
27 #define SHEER_VLC_BITS 12
29 #include "libavutil/intreadwrite.h"
34 #include "sheervideodata.h"
36 typedef struct SheerVideoContext {
40 void (*decode_frame)(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb);
43 static void decode_ca4i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
45 SheerVideoContext *s = avctx->priv_data;
46 uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
49 dst_a = (uint16_t *)p->data[3];
50 dst_y = (uint16_t *)p->data[0];
51 dst_u = (uint16_t *)p->data[1];
52 dst_v = (uint16_t *)p->data[2];
54 for (y = 0; y < avctx->height; y++) {
56 for (x = 0; x < avctx->width; x++) {
57 dst_a[x] = get_bits(gb, 10);
58 dst_y[x] = get_bits(gb, 10);
59 dst_u[x] = get_bits(gb, 10);
60 dst_v[x] = get_bits(gb, 10);
63 int pred[4] = { 502, 512, 512, 502 };
65 for (x = 0; x < avctx->width; x++) {
68 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
69 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
70 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
71 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
73 dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
74 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
75 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
76 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
80 dst_y += p->linesize[0] / 2;
81 dst_u += p->linesize[1] / 2;
82 dst_v += p->linesize[2] / 2;
83 dst_a += p->linesize[3] / 2;
87 static void decode_ca4p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
89 SheerVideoContext *s = avctx->priv_data;
90 uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
93 dst_a = (uint16_t *)p->data[3];
94 dst_y = (uint16_t *)p->data[0];
95 dst_u = (uint16_t *)p->data[1];
96 dst_v = (uint16_t *)p->data[2];
99 for (x = 0; x < avctx->width; x++) {
100 dst_a[x] = get_bits(gb, 10);
101 dst_y[x] = get_bits(gb, 10);
102 dst_u[x] = get_bits(gb, 10);
103 dst_v[x] = get_bits(gb, 10);
106 int pred[4] = { 502, 512, 512, 502 };
108 for (x = 0; x < avctx->width; x++) {
111 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
112 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
113 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
114 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
116 dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
117 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
118 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
119 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
123 dst_y += p->linesize[0] / 2;
124 dst_u += p->linesize[1] / 2;
125 dst_v += p->linesize[2] / 2;
126 dst_a += p->linesize[3] / 2;
128 for (y = 1; y < avctx->height; y++) {
130 for (x = 0; x < avctx->width; x++) {
131 dst_a[x] = get_bits(gb, 10);
132 dst_y[x] = get_bits(gb, 10);
133 dst_u[x] = get_bits(gb, 10);
134 dst_v[x] = get_bits(gb, 10);
137 int pred_TL[4], pred_L[4], pred_T[4];
140 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
141 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
142 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
143 pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
145 for (x = 0; x < avctx->width; x++) {
146 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
147 pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
148 pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
149 pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
151 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
152 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
153 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
154 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
156 dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
157 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
158 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
159 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
161 pred_TL[0] = pred_T[0];
162 pred_TL[1] = pred_T[1];
163 pred_TL[2] = pred_T[2];
164 pred_TL[3] = pred_T[3];
168 dst_y += p->linesize[0] / 2;
169 dst_u += p->linesize[1] / 2;
170 dst_v += p->linesize[2] / 2;
171 dst_a += p->linesize[3] / 2;
175 static void decode_ybr10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
177 SheerVideoContext *s = avctx->priv_data;
178 uint16_t *dst_y, *dst_u, *dst_v;
181 dst_y = (uint16_t *)p->data[0];
182 dst_u = (uint16_t *)p->data[1];
183 dst_v = (uint16_t *)p->data[2];
185 for (y = 0; y < avctx->height; y++) {
187 for (x = 0; x < avctx->width; x++) {
188 dst_y[x] = get_bits(gb, 10);
189 dst_u[x] = get_bits(gb, 10);
190 dst_v[x] = get_bits(gb, 10);
193 int pred[4] = { 502, 512, 512, 512 };
195 for (x = 0; x < avctx->width; x++) {
198 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
199 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
200 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
202 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
203 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
204 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
208 dst_y += p->linesize[0] / 2;
209 dst_u += p->linesize[1] / 2;
210 dst_v += p->linesize[2] / 2;
214 static void decode_ybr10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
216 SheerVideoContext *s = avctx->priv_data;
217 uint16_t *dst_y, *dst_u, *dst_v;
220 dst_y = (uint16_t *)p->data[0];
221 dst_u = (uint16_t *)p->data[1];
222 dst_v = (uint16_t *)p->data[2];
225 for (x = 0; x < avctx->width; x++) {
226 dst_y[x] = get_bits(gb, 10);
227 dst_u[x] = get_bits(gb, 10);
228 dst_v[x] = get_bits(gb, 10);
231 int pred[4] = { 502, 512, 512, 512 };
233 for (x = 0; x < avctx->width; x++) {
236 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
237 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
238 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
240 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
241 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
242 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
246 dst_y += p->linesize[0] / 2;
247 dst_u += p->linesize[1] / 2;
248 dst_v += p->linesize[2] / 2;
250 for (y = 1; y < avctx->height; y++) {
252 for (x = 0; x < avctx->width; x++) {
253 dst_y[x] = get_bits(gb, 10);
254 dst_u[x] = get_bits(gb, 10);
255 dst_v[x] = get_bits(gb, 10);
258 int pred_TL[4], pred_L[4], pred_T[4];
261 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
262 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
263 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
265 for (x = 0; x < avctx->width; x++) {
266 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
267 pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
268 pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
270 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
271 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
272 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
274 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
275 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
276 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
278 pred_TL[0] = pred_T[0];
279 pred_TL[1] = pred_T[1];
280 pred_TL[2] = pred_T[2];
284 dst_y += p->linesize[0] / 2;
285 dst_u += p->linesize[1] / 2;
286 dst_v += p->linesize[2] / 2;
290 static void decode_yry10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
292 SheerVideoContext *s = avctx->priv_data;
293 uint16_t *dst_y, *dst_u, *dst_v;
296 dst_y = (uint16_t *)p->data[0];
297 dst_u = (uint16_t *)p->data[1];
298 dst_v = (uint16_t *)p->data[2];
300 for (y = 0; y < avctx->height; y++) {
302 for (x = 0; x < avctx->width; x += 2) {
303 dst_y[x ] = get_bits(gb, 10);
304 dst_u[x / 2] = get_bits(gb, 10);
305 dst_y[x + 1] = get_bits(gb, 10);
306 dst_v[x / 2] = get_bits(gb, 10);
309 int pred[4] = { 502, 512, 512, 0 };
311 for (x = 0; x < avctx->width; x += 2) {
314 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
315 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
316 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
317 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
319 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff;
320 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff;
321 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
322 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff;
326 dst_y += p->linesize[0] / 2;
327 dst_u += p->linesize[1] / 2;
328 dst_v += p->linesize[2] / 2;
332 static void decode_yry10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
334 SheerVideoContext *s = avctx->priv_data;
335 uint16_t *dst_y, *dst_u, *dst_v;
338 dst_y = (uint16_t *)p->data[0];
339 dst_u = (uint16_t *)p->data[1];
340 dst_v = (uint16_t *)p->data[2];
343 for (x = 0; x < avctx->width; x += 2) {
344 dst_y[x ] = get_bits(gb, 10);
345 dst_u[x / 2] = get_bits(gb, 10);
346 dst_y[x + 1] = get_bits(gb, 10);
347 dst_v[x / 2] = get_bits(gb, 10);
350 int pred[4] = { 502, 512, 512, 0 };
352 for (x = 0; x < avctx->width; x += 2) {
355 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
356 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
357 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
358 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
360 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff;
361 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff;
362 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
363 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff;
367 dst_y += p->linesize[0] / 2;
368 dst_u += p->linesize[1] / 2;
369 dst_v += p->linesize[2] / 2;
371 for (y = 1; y < avctx->height; y++) {
373 for (x = 0; x < avctx->width; x += 2) {
374 dst_y[x ] = get_bits(gb, 10);
375 dst_u[x / 2] = get_bits(gb, 10);
376 dst_y[x + 1] = get_bits(gb, 10);
377 dst_v[x / 2] = get_bits(gb, 10);
380 int pred_TL[6], pred_L[6], pred_T[6];
383 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
384 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
385 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
387 for (x = 0; x < avctx->width; x += 2) {
388 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
389 pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
390 pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
391 pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
393 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
394 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
395 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
396 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
398 dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
399 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
400 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
401 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
403 pred_TL[0] = pred_T[3];
404 pred_TL[1] = pred_T[1];
405 pred_TL[2] = pred_T[2];
409 dst_y += p->linesize[0] / 2;
410 dst_u += p->linesize[1] / 2;
411 dst_v += p->linesize[2] / 2;
415 static void decode_ca2i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
417 SheerVideoContext *s = avctx->priv_data;
418 uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
421 dst_y = (uint16_t *)p->data[0];
422 dst_u = (uint16_t *)p->data[1];
423 dst_v = (uint16_t *)p->data[2];
424 dst_a = (uint16_t *)p->data[3];
426 for (y = 0; y < avctx->height; y++) {
428 for (x = 0; x < avctx->width; x += 2) {
429 dst_a[x ] = get_bits(gb, 10);
430 dst_y[x ] = get_bits(gb, 10);
431 dst_u[x / 2] = get_bits(gb, 10);
432 dst_a[x + 1] = get_bits(gb, 10);
433 dst_y[x + 1] = get_bits(gb, 10);
434 dst_v[x / 2] = get_bits(gb, 10);
437 int pred[4] = { 502, 512, 512, 502 };
439 for (x = 0; x < avctx->width; x += 2) {
440 int y1, y2, u, v, a1, a2;
442 a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
443 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
444 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
445 a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
446 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
447 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
449 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff;
450 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff;
451 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
452 dst_a[x ] = pred[3] = (a1 + pred[3]) & 0x3ff;
453 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff;
454 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff;
458 dst_y += p->linesize[0] / 2;
459 dst_u += p->linesize[1] / 2;
460 dst_v += p->linesize[2] / 2;
461 dst_a += p->linesize[3] / 2;
465 static void decode_ca2p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
467 SheerVideoContext *s = avctx->priv_data;
468 uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
471 dst_y = (uint16_t *)p->data[0];
472 dst_u = (uint16_t *)p->data[1];
473 dst_v = (uint16_t *)p->data[2];
474 dst_a = (uint16_t *)p->data[3];
477 for (x = 0; x < avctx->width; x += 2) {
478 dst_a[x ] = get_bits(gb, 10);
479 dst_y[x ] = get_bits(gb, 10);
480 dst_u[x / 2] = get_bits(gb, 10);
481 dst_a[x + 1] = get_bits(gb, 10);
482 dst_y[x + 1] = get_bits(gb, 10);
483 dst_v[x / 2] = get_bits(gb, 10);
486 int pred[4] = { 502, 512, 512, 502 };
488 for (x = 0; x < avctx->width; x += 2) {
489 int y1, y2, u, v, a1, a2;
491 a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
492 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
493 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
494 a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
495 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
496 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
498 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff;
499 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff;
500 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
501 dst_a[x ] = pred[3] = (a1 + pred[3]) & 0x3ff;
502 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff;
503 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff;
507 dst_y += p->linesize[0] / 2;
508 dst_u += p->linesize[1] / 2;
509 dst_v += p->linesize[2] / 2;
510 dst_a += p->linesize[3] / 2;
512 for (y = 1; y < avctx->height; y++) {
514 for (x = 0; x < avctx->width; x += 2) {
515 dst_a[x ] = get_bits(gb, 10);
516 dst_y[x ] = get_bits(gb, 10);
517 dst_u[x / 2] = get_bits(gb, 10);
518 dst_a[x + 1] = get_bits(gb, 10);
519 dst_y[x + 1] = get_bits(gb, 10);
520 dst_v[x / 2] = get_bits(gb, 10);
523 int pred_TL[6], pred_L[6], pred_T[6];
524 int y1, y2, u, v, a1, a2;
526 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
527 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
528 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
529 pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3] / 2];
531 for (x = 0; x < avctx->width; x += 2) {
532 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
533 pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
534 pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
535 pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
536 pred_T[4] = dst_a[-p->linesize[3] / 2 + x];
537 pred_T[5] = dst_a[-p->linesize[3] / 2 + x + 1];
539 a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
540 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
541 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
542 a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
543 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
544 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
546 dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
547 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
548 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
549 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
550 dst_a[x ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0x3ff;
551 dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0x3ff;
553 pred_TL[0] = pred_T[3];
554 pred_TL[1] = pred_T[1];
555 pred_TL[2] = pred_T[2];
556 pred_TL[4] = pred_T[5];
560 dst_y += p->linesize[0] / 2;
561 dst_u += p->linesize[1] / 2;
562 dst_v += p->linesize[2] / 2;
563 dst_a += p->linesize[3] / 2;
567 static void decode_c82i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
569 SheerVideoContext *s = avctx->priv_data;
570 uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
578 for (y = 0; y < avctx->height; y += 1) {
580 for (x = 0; x < avctx->width; x += 2) {
581 dst_a[x ] = get_bits(gb, 8);
582 dst_y[x ] = get_bits(gb, 8);
583 dst_u[x / 2] = get_bits(gb, 8);
584 dst_a[x + 1] = get_bits(gb, 8);
585 dst_y[x + 1] = get_bits(gb, 8);
586 dst_v[x / 2] = get_bits(gb, 8);
589 int pred[4] = { 125, -128, -128, 125 };
591 for (x = 0; x < avctx->width; x += 2) {
592 int y1, y2, u, v, a1, a2;
594 a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
595 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
596 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
597 a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
598 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
599 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
601 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff;
602 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
603 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff;
604 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff;
605 dst_a[x ] = pred[3] = (a1 + pred[3]) & 0xff;
606 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
610 dst_y += p->linesize[0];
611 dst_u += p->linesize[1];
612 dst_v += p->linesize[2];
613 dst_a += p->linesize[3];
617 static void decode_c82p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
619 SheerVideoContext *s = avctx->priv_data;
620 uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
629 for (x = 0; x < avctx->width; x += 2) {
630 dst_a[x ] = get_bits(gb, 8);
631 dst_y[x ] = get_bits(gb, 8);
632 dst_u[x / 2] = get_bits(gb, 8);
633 dst_a[x + 1] = get_bits(gb, 8);
634 dst_y[x + 1] = get_bits(gb, 8);
635 dst_v[x / 2] = get_bits(gb, 8);
638 int pred[4] = { 125, -128, -128, 125 };
640 for (x = 0; x < avctx->width; x += 2) {
641 int y1, y2, u, v, a1, a2;
643 a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
644 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
645 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
646 a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
647 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
648 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
650 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff;
651 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff;
652 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
653 dst_a[x ] = pred[3] = (a1 + pred[3]) & 0xff;
654 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff;
655 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
659 dst_y += p->linesize[0];
660 dst_u += p->linesize[1];
661 dst_v += p->linesize[2];
662 dst_a += p->linesize[3];
664 for (y = 1; y < avctx->height; y++) {
666 for (x = 0; x < avctx->width; x += 2) {
667 dst_a[x ] = get_bits(gb, 8);
668 dst_y[x ] = get_bits(gb, 8);
669 dst_u[x / 2] = get_bits(gb, 8);
670 dst_a[x + 1] = get_bits(gb, 8);
671 dst_y[x + 1] = get_bits(gb, 8);
672 dst_v[x / 2] = get_bits(gb, 8);
675 int pred_TL[6], pred_L[6], pred_T[6];
676 int y1, y2, u, v, a1, a2;
678 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
679 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
680 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
681 pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3]];
683 for (x = 0; x < avctx->width; x += 2) {
684 pred_T[0] = dst_y[-p->linesize[0] + x];
685 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
686 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
687 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
688 pred_T[4] = dst_a[-p->linesize[3] + x];
689 pred_T[5] = dst_a[-p->linesize[3] + x + 1];
691 a1 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
692 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
693 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
694 a2 = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
695 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
696 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
698 dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
699 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
700 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
701 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
702 dst_a[x ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0xff;
703 dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0xff;
705 pred_TL[0] = pred_T[3];
706 pred_TL[1] = pred_T[1];
707 pred_TL[2] = pred_T[2];
708 pred_TL[4] = pred_T[5];
712 dst_y += p->linesize[0];
713 dst_u += p->linesize[1];
714 dst_v += p->linesize[2];
715 dst_a += p->linesize[3];
719 static void decode_ybyr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
721 SheerVideoContext *s = avctx->priv_data;
722 uint8_t *dst_y, *dst_u, *dst_v;
730 for (x = 0; x < avctx->width; x += 2) {
731 dst_y[x ] = get_bits(gb, 8);
732 dst_u[x / 2] = get_bits(gb, 8) + 128;
733 dst_y[x + 1] = get_bits(gb, 8);
734 dst_v[x / 2] = get_bits(gb, 8) + 128;
737 int pred[4] = { -128, 128, 128, 0 };
739 for (x = 0; x < avctx->width; x += 2) {
742 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
743 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
744 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
745 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
747 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff;
748 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff;
749 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
750 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff;
754 dst_y += p->linesize[0];
755 dst_u += p->linesize[1];
756 dst_v += p->linesize[2];
758 for (y = 1; y < avctx->height; y++) {
760 for (x = 0; x < avctx->width; x += 2) {
761 dst_y[x ] = get_bits(gb, 8);
762 dst_u[x / 2] = get_bits(gb, 8) + 128;
763 dst_y[x + 1] = get_bits(gb, 8);
764 dst_v[x / 2] = get_bits(gb, 8) + 128;
767 int pred_TL[4], pred_L[4], pred_T[4];
770 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
771 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
772 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
774 for (x = 0; x < avctx->width; x += 2) {
775 pred_T[0] = dst_y[-p->linesize[0] + x];
776 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
777 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
778 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
780 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
781 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
782 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
783 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
785 dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
786 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
787 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
788 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
790 pred_TL[0] = pred_T[3];
791 pred_TL[1] = pred_T[1];
792 pred_TL[2] = pred_T[2];
796 dst_y += p->linesize[0];
797 dst_u += p->linesize[1];
798 dst_v += p->linesize[2];
802 static void decode_byryi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
804 SheerVideoContext *s = avctx->priv_data;
805 uint8_t *dst_y, *dst_u, *dst_v;
813 for (x = 0; x < avctx->width; x += 2) {
814 dst_y[x ] = get_bits(gb, 8);
815 dst_u[x / 2] = get_bits(gb, 8);
816 dst_y[x + 1] = get_bits(gb, 8);
817 dst_v[x / 2] = get_bits(gb, 8);
820 int pred[4] = { 125, -128, -128, 0 };
822 for (x = 0; x < avctx->width; x += 2) {
825 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
826 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
827 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
828 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
830 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff;
831 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff;
832 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
833 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff;
837 dst_y += p->linesize[0];
838 dst_u += p->linesize[1];
839 dst_v += p->linesize[2];
841 for (y = 1; y < avctx->height; y++) {
843 for (x = 0; x < avctx->width; x += 2) {
844 dst_y[x ] = get_bits(gb, 8);
845 dst_u[x / 2] = get_bits(gb, 8);
846 dst_y[x + 1] = get_bits(gb, 8);
847 dst_v[x / 2] = get_bits(gb, 8);
853 pred_L[0] = dst_y[-p->linesize[0]];
854 pred_L[1] = dst_u[-p->linesize[1]];
855 pred_L[2] = dst_v[-p->linesize[2]];
857 for (x = 0; x < avctx->width; x += 2) {
858 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
859 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
860 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
861 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
863 dst_y[x ] = pred_L[0] = (y1 + pred_L[0]) & 0xff;
864 dst_u[x / 2] = pred_L[1] = (u + pred_L[1]) & 0xff;
865 dst_y[x + 1] = pred_L[0] = (y2 + pred_L[0]) & 0xff;
866 dst_v[x / 2] = pred_L[2] = (v + pred_L[2]) & 0xff;
870 dst_y += p->linesize[0];
871 dst_u += p->linesize[1];
872 dst_v += p->linesize[2];
876 static void decode_byry(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
878 SheerVideoContext *s = avctx->priv_data;
879 uint8_t *dst_y, *dst_u, *dst_v;
887 for (x = 0; x < avctx->width; x += 2) {
888 dst_y[x ] = get_bits(gb, 8);
889 dst_u[x / 2] = get_bits(gb, 8);
890 dst_y[x + 1] = get_bits(gb, 8);
891 dst_v[x / 2] = get_bits(gb, 8);
894 int pred[4] = { 125, -128, -128, 0 };
896 for (x = 0; x < avctx->width; x += 2) {
899 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
900 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
901 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
902 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
904 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff;
905 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff;
906 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
907 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff;
911 dst_y += p->linesize[0];
912 dst_u += p->linesize[1];
913 dst_v += p->linesize[2];
915 for (y = 1; y < avctx->height; y++) {
917 for (x = 0; x < avctx->width; x += 2) {
918 dst_y[x ] = get_bits(gb, 8);
919 dst_u[x / 2] = get_bits(gb, 8);
920 dst_y[x + 1] = get_bits(gb, 8);
921 dst_v[x / 2] = get_bits(gb, 8);
924 int pred_TL[4], pred_L[4], pred_T[4];
927 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
928 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
929 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
931 for (x = 0; x < avctx->width; x += 2) {
932 pred_T[0] = dst_y[-p->linesize[0] + x];
933 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
934 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
935 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
937 y1 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
938 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
939 y2 = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
940 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
942 dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
943 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
944 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
945 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
947 pred_TL[0] = pred_T[3];
948 pred_TL[1] = pred_T[1];
949 pred_TL[2] = pred_T[2];
953 dst_y += p->linesize[0];
954 dst_u += p->linesize[1];
955 dst_v += p->linesize[2];
959 static void decode_ybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
961 SheerVideoContext *s = avctx->priv_data;
962 uint8_t *dst_y, *dst_u, *dst_v;
970 for (x = 0; x < avctx->width; x++) {
971 dst_y[x] = get_bits(gb, 8);
972 dst_u[x] = get_bits(gb, 8);
973 dst_v[x] = get_bits(gb, 8);
976 int pred[4] = { s->alt ? 125 : -146, -128, -128, -128 };
978 for (x = 0; x < avctx->width; x++) {
981 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
982 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
983 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
985 dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
986 dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
987 dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
991 dst_y += p->linesize[0];
992 dst_u += p->linesize[1];
993 dst_v += p->linesize[2];
995 for (y = 1; y < avctx->height; y++) {
997 for (x = 0; x < avctx->width; x++) {
998 dst_y[x] = get_bits(gb, 8);
999 dst_u[x] = get_bits(gb, 8);
1000 dst_v[x] = get_bits(gb, 8);
1006 pred_L[0] = dst_y[-p->linesize[0]];
1007 pred_L[1] = dst_u[-p->linesize[1]];
1008 pred_L[2] = dst_v[-p->linesize[2]];
1010 for (x = 0; x < avctx->width; x++) {
1011 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1012 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1013 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1015 dst_y[x] = pred_L[0] = (y + pred_L[0]) & 0xff;
1016 dst_u[x] = pred_L[1] = (u + pred_L[1]) & 0xff;
1017 dst_v[x] = pred_L[2] = (v + pred_L[2]) & 0xff;
1021 dst_y += p->linesize[0];
1022 dst_u += p->linesize[1];
1023 dst_v += p->linesize[2];
1027 static void decode_ybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1029 SheerVideoContext *s = avctx->priv_data;
1030 uint8_t *dst_y, *dst_u, *dst_v;
1037 if (get_bits1(gb)) {
1038 for (x = 0; x < avctx->width; x++) {
1039 dst_y[x] = get_bits(gb, 8);
1040 dst_u[x] = get_bits(gb, 8);
1041 dst_v[x] = get_bits(gb, 8);
1044 int pred[4] = { s->alt ? 125 : -146, -128, -128, -128 };
1046 for (x = 0; x < avctx->width; x++) {
1049 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1050 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1051 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1053 dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
1054 dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
1055 dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
1059 dst_y += p->linesize[0];
1060 dst_u += p->linesize[1];
1061 dst_v += p->linesize[2];
1063 for (y = 1; y < avctx->height; y++) {
1064 if (get_bits1(gb)) {
1065 for (x = 0; x < avctx->width; x++) {
1066 dst_y[x] = get_bits(gb, 8);
1067 dst_u[x] = get_bits(gb, 8);
1068 dst_v[x] = get_bits(gb, 8);
1071 int pred_TL[4], pred_L[4], pred_T[4];
1074 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1075 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1076 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1078 for (x = 0; x < avctx->width; x++) {
1079 pred_T[0] = dst_y[-p->linesize[0] + x];
1080 pred_T[1] = dst_u[-p->linesize[1] + x];
1081 pred_T[2] = dst_v[-p->linesize[2] + x];
1083 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1084 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1085 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1087 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1088 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1089 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1091 pred_TL[0] = pred_T[0];
1092 pred_TL[1] = pred_T[1];
1093 pred_TL[2] = pred_T[2];
1097 dst_y += p->linesize[0];
1098 dst_u += p->linesize[1];
1099 dst_v += p->linesize[2];
1103 static void decode_aybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1105 SheerVideoContext *s = avctx->priv_data;
1106 uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
1114 if (get_bits1(gb)) {
1115 for (x = 0; x < avctx->width; x++) {
1116 dst_a[x] = get_bits(gb, 8);
1117 dst_y[x] = get_bits(gb, 8);
1118 dst_u[x] = get_bits(gb, 8);
1119 dst_v[x] = get_bits(gb, 8);
1122 int pred[4] = { 125, s->alt ? 125 : -146, -128, -128 };
1124 for (x = 0; x < avctx->width; x++) {
1127 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1128 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1129 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1130 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1132 dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
1133 dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
1134 dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
1135 dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
1139 dst_a += p->linesize[3];
1140 dst_y += p->linesize[0];
1141 dst_u += p->linesize[1];
1142 dst_v += p->linesize[2];
1144 for (y = 1; y < avctx->height; y++) {
1145 if (get_bits1(gb)) {
1146 for (x = 0; x < avctx->width; x++) {
1147 dst_a[x] = get_bits(gb, 8);
1148 dst_y[x] = get_bits(gb, 8);
1149 dst_u[x] = get_bits(gb, 8);
1150 dst_v[x] = get_bits(gb, 8);
1156 pred_L[0] = dst_a[-p->linesize[3]];
1157 pred_L[1] = dst_y[-p->linesize[0]];
1158 pred_L[2] = dst_u[-p->linesize[1]];
1159 pred_L[3] = dst_v[-p->linesize[2]];
1161 for (x = 0; x < avctx->width; x++) {
1162 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1163 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1164 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1165 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1167 dst_a[x] = pred_L[0] = (a + pred_L[0]) & 0xff;
1168 dst_y[x] = pred_L[1] = (y + pred_L[1]) & 0xff;
1169 dst_u[x] = pred_L[2] = (u + pred_L[2]) & 0xff;
1170 dst_v[x] = pred_L[3] = (v + pred_L[3]) & 0xff;
1174 dst_a += p->linesize[3];
1175 dst_y += p->linesize[0];
1176 dst_u += p->linesize[1];
1177 dst_v += p->linesize[2];
1181 static void decode_aybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1183 SheerVideoContext *s = avctx->priv_data;
1184 uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
1192 if (get_bits1(gb)) {
1193 for (x = 0; x < avctx->width; x++) {
1194 dst_a[x] = get_bits(gb, 8);
1195 dst_y[x] = get_bits(gb, 8);
1196 dst_u[x] = get_bits(gb, 8);
1197 dst_v[x] = get_bits(gb, 8);
1200 int pred[4] = { 125, s->alt ? 125 : -146, -128, -128 };
1202 for (x = 0; x < avctx->width; x++) {
1205 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1206 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1207 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1208 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1210 dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
1211 dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
1212 dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
1213 dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
1217 dst_a += p->linesize[3];
1218 dst_y += p->linesize[0];
1219 dst_u += p->linesize[1];
1220 dst_v += p->linesize[2];
1222 for (y = 1; y < avctx->height; y++) {
1223 if (get_bits1(gb)) {
1224 for (x = 0; x < avctx->width; x++) {
1225 dst_a[x] = get_bits(gb, 8);
1226 dst_y[x] = get_bits(gb, 8);
1227 dst_u[x] = get_bits(gb, 8);
1228 dst_v[x] = get_bits(gb, 8);
1231 int pred_TL[4], pred_L[4], pred_T[4];
1234 pred_TL[0] = pred_L[0] = dst_a[-p->linesize[3]];
1235 pred_TL[1] = pred_L[1] = dst_y[-p->linesize[0]];
1236 pred_TL[2] = pred_L[2] = dst_u[-p->linesize[1]];
1237 pred_TL[3] = pred_L[3] = dst_v[-p->linesize[2]];
1239 for (x = 0; x < avctx->width; x++) {
1240 pred_T[0] = dst_a[-p->linesize[3] + x];
1241 pred_T[1] = dst_y[-p->linesize[0] + x];
1242 pred_T[2] = dst_u[-p->linesize[1] + x];
1243 pred_T[3] = dst_v[-p->linesize[2] + x];
1245 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1246 y = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1247 u = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1248 v = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1250 dst_a[x] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1251 dst_y[x] = pred_L[1] = (y + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1252 dst_u[x] = pred_L[2] = (u + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1253 dst_v[x] = pred_L[3] = (v + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
1255 pred_TL[0] = pred_T[0];
1256 pred_TL[1] = pred_T[1];
1257 pred_TL[2] = pred_T[2];
1258 pred_TL[3] = pred_T[3];
1262 dst_a += p->linesize[3];
1263 dst_y += p->linesize[0];
1264 dst_u += p->linesize[1];
1265 dst_v += p->linesize[2];
1269 static void decode_argxi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1271 SheerVideoContext *s = avctx->priv_data;
1272 uint16_t *dst_r, *dst_g, *dst_b, *dst_a;
1275 dst_r = (uint16_t *)p->data[2];
1276 dst_g = (uint16_t *)p->data[0];
1277 dst_b = (uint16_t *)p->data[1];
1278 dst_a = (uint16_t *)p->data[3];
1280 for (y = 0; y < avctx->height; y++) {
1281 if (get_bits1(gb)) {
1282 for (x = 0; x < avctx->width; x++) {
1283 dst_a[x] = get_bits(gb, 10);
1284 dst_r[x] = get_bits(gb, 10);
1285 dst_g[x] = get_bits(gb, 10);
1286 dst_b[x] = get_bits(gb, 10);
1289 int pred[4] = { 512, 512, 512, 512 };
1291 for (x = 0; x < avctx->width; x++) {
1294 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1295 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1296 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1297 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1299 dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
1300 dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1301 dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1302 dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1306 dst_r += p->linesize[2] / 2;
1307 dst_g += p->linesize[0] / 2;
1308 dst_b += p->linesize[1] / 2;
1309 dst_a += p->linesize[3] / 2;
1313 static void decode_argx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1315 SheerVideoContext *s = avctx->priv_data;
1316 uint16_t *dst_r, *dst_g, *dst_b, *dst_a;
1319 dst_r = (uint16_t *)p->data[2];
1320 dst_g = (uint16_t *)p->data[0];
1321 dst_b = (uint16_t *)p->data[1];
1322 dst_a = (uint16_t *)p->data[3];
1324 if (get_bits1(gb)) {
1325 for (x = 0; x < avctx->width; x++) {
1326 dst_a[x] = get_bits(gb, 10);
1327 dst_r[x] = get_bits(gb, 10);
1328 dst_g[x] = get_bits(gb, 10);
1329 dst_b[x] = get_bits(gb, 10);
1332 int pred[4] = { 512, 512, 512, 512 };
1334 for (x = 0; x < avctx->width; x++) {
1337 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1338 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1339 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1340 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1342 dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
1343 dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1344 dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1345 dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1349 dst_r += p->linesize[2] / 2;
1350 dst_g += p->linesize[0] / 2;
1351 dst_b += p->linesize[1] / 2;
1352 dst_a += p->linesize[3] / 2;
1354 for (y = 1; y < avctx->height; y++) {
1355 if (get_bits1(gb)) {
1356 for (x = 0; x < avctx->width; x++) {
1357 dst_a[x] = get_bits(gb, 10);
1358 dst_r[x] = get_bits(gb, 10);
1359 dst_g[x] = get_bits(gb, 10);
1360 dst_b[x] = get_bits(gb, 10);
1363 int pred_TL[4], pred_L[4], pred_T[4];
1366 pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
1367 pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
1368 pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
1369 pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
1371 for (x = 0; x < avctx->width; x++) {
1372 pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
1373 pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
1374 pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
1375 pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
1377 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1378 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1379 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1380 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1382 dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
1383 dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1384 dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1385 dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1387 pred_TL[0] = pred_T[0];
1388 pred_TL[1] = pred_T[1];
1389 pred_TL[2] = pred_T[2];
1390 pred_TL[3] = pred_T[3];
1394 dst_r += p->linesize[2] / 2;
1395 dst_g += p->linesize[0] / 2;
1396 dst_b += p->linesize[1] / 2;
1397 dst_a += p->linesize[3] / 2;
1401 static void decode_rgbxi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1403 SheerVideoContext *s = avctx->priv_data;
1404 uint16_t *dst_r, *dst_g, *dst_b;
1407 dst_r = (uint16_t *)p->data[2];
1408 dst_g = (uint16_t *)p->data[0];
1409 dst_b = (uint16_t *)p->data[1];
1411 for (y = 0; y < avctx->height; y++) {
1412 if (get_bits1(gb)) {
1413 for (x = 0; x < avctx->width; x++) {
1414 dst_r[x] = get_bits(gb, 10);
1415 dst_g[x] = get_bits(gb, 10);
1416 dst_b[x] = get_bits(gb, 10);
1419 int pred[4] = { 512, 512, 512, 0 };
1421 for (x = 0; x < avctx->width; x++) {
1424 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1425 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1426 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1428 dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1429 dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1430 dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1434 dst_r += p->linesize[2] / 2;
1435 dst_g += p->linesize[0] / 2;
1436 dst_b += p->linesize[1] / 2;
1440 static void decode_rgbx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1442 SheerVideoContext *s = avctx->priv_data;
1443 uint16_t *dst_r, *dst_g, *dst_b;
1446 dst_r = (uint16_t *)p->data[2];
1447 dst_g = (uint16_t *)p->data[0];
1448 dst_b = (uint16_t *)p->data[1];
1450 if (get_bits1(gb)) {
1451 for (x = 0; x < avctx->width; x++) {
1452 dst_r[x] = get_bits(gb, 10);
1453 dst_g[x] = get_bits(gb, 10);
1454 dst_b[x] = get_bits(gb, 10);
1457 int pred[4] = { 512, 512, 512, 0 };
1459 for (x = 0; x < avctx->width; x++) {
1462 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1463 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1464 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1466 dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1467 dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1468 dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1472 dst_r += p->linesize[2] / 2;
1473 dst_g += p->linesize[0] / 2;
1474 dst_b += p->linesize[1] / 2;
1476 for (y = 1; y < avctx->height; y++) {
1477 if (get_bits1(gb)) {
1478 for (x = 0; x < avctx->width; x++) {
1479 dst_r[x] = get_bits(gb, 10);
1480 dst_g[x] = get_bits(gb, 10);
1481 dst_b[x] = get_bits(gb, 10);
1484 int pred_TL[4], pred_L[4], pred_T[4];
1487 pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
1488 pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
1489 pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
1491 for (x = 0; x < avctx->width; x++) {
1492 pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
1493 pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
1494 pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
1496 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1497 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1498 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1500 dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1501 dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1502 dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1504 pred_TL[0] = pred_T[0];
1505 pred_TL[1] = pred_T[1];
1506 pred_TL[2] = pred_T[2];
1510 dst_r += p->linesize[2] / 2;
1511 dst_g += p->linesize[0] / 2;
1512 dst_b += p->linesize[1] / 2;
1516 static void decode_argbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1518 SheerVideoContext *s = avctx->priv_data;
1523 if (get_bits1(gb)) {
1524 for (x = 0; x < avctx->width; x++) {
1525 dst[x * 4 + 0] = get_bits(gb, 8);
1526 dst[x * 4 + 1] = get_bits(gb, 8);
1527 dst[x * 4 + 2] = get_bits(gb, 8);
1528 dst[x * 4 + 3] = get_bits(gb, 8);
1531 int pred[4] = { -128, -128, -128, -128 };
1533 for (x = 0; x < avctx->width; x++) {
1536 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1537 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1538 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1539 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1541 dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
1542 dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
1543 dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
1544 dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
1548 dst += p->linesize[0];
1549 for (y = 1; y < avctx->height; y++) {
1550 if (get_bits1(gb)) {
1551 for (x = 0; x < avctx->width; x++) {
1552 dst[x * 4 + 0] = get_bits(gb, 8);
1553 dst[x * 4 + 1] = get_bits(gb, 8);
1554 dst[x * 4 + 2] = get_bits(gb, 8);
1555 dst[x * 4 + 3] = get_bits(gb, 8);
1561 pred_L[0] = dst[-p->linesize[0] + 0];
1562 pred_L[1] = dst[-p->linesize[0] + 1];
1563 pred_L[2] = dst[-p->linesize[0] + 2];
1564 pred_L[3] = dst[-p->linesize[0] + 3];
1566 for (x = 0; x < avctx->width; x++) {
1567 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1568 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1569 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1570 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1572 dst[4 * x + 0] = pred_L[0] = (a + pred_L[0]) & 0xff;
1573 dst[4 * x + 1] = pred_L[1] = (r + pred_L[1]) & 0xff;
1574 dst[4 * x + 2] = pred_L[2] = (r + g + pred_L[2]) & 0xff;
1575 dst[4 * x + 3] = pred_L[3] = (r + g + b + pred_L[3]) & 0xff;
1578 dst += p->linesize[0];
1582 static void decode_argb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1584 SheerVideoContext *s = avctx->priv_data;
1589 if (get_bits1(gb)) {
1590 for (x = 0; x < avctx->width; x++) {
1591 dst[x * 4 + 0] = get_bits(gb, 8);
1592 dst[x * 4 + 1] = get_bits(gb, 8);
1593 dst[x * 4 + 2] = get_bits(gb, 8);
1594 dst[x * 4 + 3] = get_bits(gb, 8);
1597 int pred[4] = { -128, -128, -128, -128 };
1599 for (x = 0; x < avctx->width; x++) {
1602 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1603 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1604 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1605 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1607 dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
1608 dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
1609 dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
1610 dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
1614 dst += p->linesize[0];
1615 for (y = 1; y < avctx->height; y++) {
1616 if (get_bits1(gb)) {
1617 for (x = 0; x < avctx->width; x++) {
1618 dst[x * 4 + 0] = get_bits(gb, 8);
1619 dst[x * 4 + 1] = get_bits(gb, 8);
1620 dst[x * 4 + 2] = get_bits(gb, 8);
1621 dst[x * 4 + 3] = get_bits(gb, 8);
1624 int pred_TL[4], pred_L[4], pred_T[4];
1627 pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
1628 pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
1629 pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
1630 pred_TL[3] = pred_L[3] = dst[-p->linesize[0] + 3];
1632 for (x = 0; x < avctx->width; x++) {
1633 pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
1634 pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
1635 pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
1636 pred_T[3] = dst[-p->linesize[0] + 4 * x + 3];
1638 a = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1639 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1640 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1641 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1643 dst[4 * x + 0] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1644 dst[4 * x + 1] = pred_L[1] = (r + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1645 dst[4 * x + 2] = pred_L[2] = (r + g + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1646 dst[4 * x + 3] = pred_L[3] = (r + g + b + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
1648 pred_TL[0] = pred_T[0];
1649 pred_TL[1] = pred_T[1];
1650 pred_TL[2] = pred_T[2];
1651 pred_TL[3] = pred_T[3];
1654 dst += p->linesize[0];
1658 static void decode_rgbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1660 SheerVideoContext *s = avctx->priv_data;
1665 if (get_bits1(gb)) {
1666 for (x = 0; x < avctx->width; x++) {
1667 dst[x * 4 + 0] = get_bits(gb, 8);
1668 dst[x * 4 + 1] = get_bits(gb, 8);
1669 dst[x * 4 + 2] = get_bits(gb, 8);
1672 int pred[4] = { -128, -128, -128, -128 };
1674 for (x = 0; x < avctx->width; x++) {
1677 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1678 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1679 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1681 dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
1682 dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
1683 dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
1687 dst += p->linesize[0];
1688 for (y = 1; y < avctx->height; y++) {
1689 if (get_bits1(gb)) {
1690 for (x = 0; x < avctx->width; x++) {
1691 dst[x * 4 + 0] = get_bits(gb, 8);
1692 dst[x * 4 + 1] = get_bits(gb, 8);
1693 dst[x * 4 + 2] = get_bits(gb, 8);
1699 pred_L[0] = dst[-p->linesize[0] + 0];
1700 pred_L[1] = dst[-p->linesize[0] + 1];
1701 pred_L[2] = dst[-p->linesize[0] + 2];
1703 for (x = 0; x < avctx->width; x++) {
1704 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1705 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1706 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1708 dst[4 * x + 0] = pred_L[0] = (r + pred_L[0]) & 0xff;
1709 dst[4 * x + 1] = pred_L[1] = (r + g + pred_L[1]) & 0xff;
1710 dst[4 * x + 2] = pred_L[2] = (r + g + b + pred_L[2]) & 0xff;
1713 dst += p->linesize[0];
1717 static void decode_rgb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1719 SheerVideoContext *s = avctx->priv_data;
1724 if (get_bits1(gb)) {
1725 for (x = 0; x < avctx->width; x++) {
1726 dst[x * 4 + 0] = get_bits(gb, 8);
1727 dst[x * 4 + 1] = get_bits(gb, 8);
1728 dst[x * 4 + 2] = get_bits(gb, 8);
1731 int pred[4] = { -128, -128, -128, -128 };
1733 for (x = 0; x < avctx->width; x++) {
1736 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1737 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1738 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1740 dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
1741 dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
1742 dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
1746 dst += p->linesize[0];
1747 for (y = 1; y < avctx->height; y++) {
1748 if (get_bits1(gb)) {
1749 for (x = 0; x < avctx->width; x++) {
1750 dst[x * 4 + 0] = get_bits(gb, 8);
1751 dst[x * 4 + 1] = get_bits(gb, 8);
1752 dst[x * 4 + 2] = get_bits(gb, 8);
1755 int pred_TL[4], pred_L[4], pred_T[4];
1758 pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
1759 pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
1760 pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
1762 for (x = 0; x < avctx->width; x++) {
1763 pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
1764 pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
1765 pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
1767 r = get_vlc2(gb, s->vlc[0].table, SHEER_VLC_BITS, 2);
1768 g = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1769 b = get_vlc2(gb, s->vlc[1].table, SHEER_VLC_BITS, 2);
1771 dst[4 * x + 0] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1772 dst[4 * x + 1] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1773 dst[4 * x + 2] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1775 pred_TL[0] = pred_T[0];
1776 pred_TL[1] = pred_T[1];
1777 pred_TL[2] = pred_T[2];
1780 dst += p->linesize[0];
1784 static av_cold int build_vlc(VLC *vlc, const SheerTable *table)
1786 const uint8_t *cur = table->lens;
1790 for (int step = 1, len = 1; len > 0; len += step) {
1791 unsigned new_count = count;
1794 new_count += table->nb_16s;
1797 new_count += *cur++;
1799 for (; count < new_count; count++)
1804 return ff_init_vlc_from_lengths(vlc, SHEER_VLC_BITS, count,
1805 lens, sizeof(*lens), NULL, 0, 0, 0, 0, NULL);
1808 static int decode_frame(AVCodecContext *avctx,
1809 void *data, int *got_frame,
1812 SheerVideoContext *s = avctx->priv_data;
1813 ThreadFrame frame = { .f = data };
1814 const SheerTable *table;
1820 if (avpkt->size <= 20)
1821 return AVERROR_INVALIDDATA;
1823 if (AV_RL32(avpkt->data) != MKTAG('S','h','i','r') &&
1824 AV_RL32(avpkt->data) != MKTAG('Z','w','a','k'))
1825 return AVERROR_INVALIDDATA;
1828 format = AV_RL32(avpkt->data + 16);
1829 av_log(avctx, AV_LOG_DEBUG, "format: %s\n", av_fourcc2str(format));
1831 case MKTAG(' ', 'R', 'G', 'B'):
1832 avctx->pix_fmt = AV_PIX_FMT_RGB0;
1833 s->decode_frame = decode_rgb;
1836 case MKTAG(' ', 'r', 'G', 'B'):
1837 avctx->pix_fmt = AV_PIX_FMT_RGB0;
1838 s->decode_frame = decode_rgbi;
1841 case MKTAG('A', 'R', 'G', 'X'):
1842 avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
1843 s->decode_frame = decode_argx;
1846 case MKTAG('A', 'r', 'G', 'X'):
1847 avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
1848 s->decode_frame = decode_argxi;
1851 case MKTAG('R', 'G', 'B', 'X'):
1852 avctx->pix_fmt = AV_PIX_FMT_GBRP10;
1853 s->decode_frame = decode_rgbx;
1856 case MKTAG('r', 'G', 'B', 'X'):
1857 avctx->pix_fmt = AV_PIX_FMT_GBRP10;
1858 s->decode_frame = decode_rgbxi;
1861 case MKTAG('A', 'R', 'G', 'B'):
1862 avctx->pix_fmt = AV_PIX_FMT_ARGB;
1863 s->decode_frame = decode_argb;
1866 case MKTAG('A', 'r', 'G', 'B'):
1867 avctx->pix_fmt = AV_PIX_FMT_ARGB;
1868 s->decode_frame = decode_argbi;
1871 case MKTAG('A', 'Y', 'B', 'R'):
1873 case MKTAG('A', 'Y', 'b', 'R'):
1874 avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
1875 s->decode_frame = decode_aybr;
1878 case MKTAG('A', 'y', 'B', 'R'):
1880 case MKTAG('A', 'y', 'b', 'R'):
1881 avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
1882 s->decode_frame = decode_aybri;
1885 case MKTAG(' ', 'Y', 'B', 'R'):
1887 case MKTAG(' ', 'Y', 'b', 'R'):
1888 avctx->pix_fmt = AV_PIX_FMT_YUV444P;
1889 s->decode_frame = decode_ybr;
1892 case MKTAG(' ', 'y', 'B', 'R'):
1894 case MKTAG(' ', 'y', 'b', 'R'):
1895 avctx->pix_fmt = AV_PIX_FMT_YUV444P;
1896 s->decode_frame = decode_ybri;
1899 case MKTAG('Y', 'B', 'R', 0x0a):
1900 avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
1901 s->decode_frame = decode_ybr10;
1904 case MKTAG('y', 'B', 'R', 0x0a):
1905 avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
1906 s->decode_frame = decode_ybr10i;
1909 case MKTAG('C', 'A', '4', 'p'):
1910 avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
1911 s->decode_frame = decode_ca4p;
1914 case MKTAG('C', 'A', '4', 'i'):
1915 avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
1916 s->decode_frame = decode_ca4i;
1919 case MKTAG('B', 'Y', 'R', 'Y'):
1920 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
1921 s->decode_frame = decode_byry;
1924 case MKTAG('B', 'Y', 'R', 'y'):
1925 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
1926 s->decode_frame = decode_byryi;
1929 case MKTAG('Y', 'b', 'Y', 'r'):
1930 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
1931 s->decode_frame = decode_ybyr;
1934 case MKTAG('C', '8', '2', 'p'):
1935 avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
1936 s->decode_frame = decode_c82p;
1939 case MKTAG('C', '8', '2', 'i'):
1940 avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
1941 s->decode_frame = decode_c82i;
1944 case MKTAG(0xa2, 'Y', 'R', 'Y'):
1945 avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
1946 s->decode_frame = decode_yry10;
1949 case MKTAG(0xa2, 'Y', 'R', 'y'):
1950 avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
1951 s->decode_frame = decode_yry10i;
1954 case MKTAG('C', 'A', '2', 'p'):
1955 avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
1956 s->decode_frame = decode_ca2p;
1959 case MKTAG('C', 'A', '2', 'i'):
1960 avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
1961 s->decode_frame = decode_ca2i;
1965 avpriv_request_sample(avctx, "unsupported format: 0x%X", format);
1966 return AVERROR_PATCHWELCOME;
1969 if (s->format != format) {
1970 if ((ret = build_vlc(&s->vlc[0], &table[0])) < 0 ||
1971 (ret = build_vlc(&s->vlc[1], &table[1])) < 0) {
1977 if (avpkt->size < 20 + avctx->width * avctx->height / 16) {
1978 av_log(avctx, AV_LOG_ERROR, "Input packet too small\n");
1979 return AVERROR_INVALIDDATA;
1982 p->pict_type = AV_PICTURE_TYPE_I;
1985 if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
1988 if ((ret = init_get_bits8(&gb, avpkt->data + 20, avpkt->size - 20)) < 0)
1991 s->decode_frame(avctx, p, &gb);
1998 static av_cold int decode_end(AVCodecContext *avctx)
2000 SheerVideoContext *s = avctx->priv_data;
2002 ff_free_vlc(&s->vlc[0]);
2003 ff_free_vlc(&s->vlc[1]);
2008 AVCodec ff_sheervideo_decoder = {
2009 .name = "sheervideo",
2010 .long_name = NULL_IF_CONFIG_SMALL("BitJazz SheerVideo"),
2011 .type = AVMEDIA_TYPE_VIDEO,
2012 .id = AV_CODEC_ID_SHEERVIDEO,
2013 .priv_data_size = sizeof(SheerVideoContext),
2014 .close = decode_end,
2015 .decode = decode_frame,
2016 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,