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
28 #include "libavutil/intreadwrite.h"
33 #include "sheervideodata.h"
35 typedef struct SheerVideoContext {
39 void (*decode_frame)(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb);
42 static void decode_ca4i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
44 SheerVideoContext *s = avctx->priv_data;
45 uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
48 dst_a = (uint16_t *)p->data[3];
49 dst_y = (uint16_t *)p->data[0];
50 dst_u = (uint16_t *)p->data[1];
51 dst_v = (uint16_t *)p->data[2];
53 for (y = 0; y < avctx->height; y++) {
55 for (x = 0; x < avctx->width; x++) {
56 dst_a[x] = get_bits(gb, 10);
57 dst_y[x] = get_bits(gb, 10);
58 dst_u[x] = get_bits(gb, 10);
59 dst_v[x] = get_bits(gb, 10);
62 int pred[4] = { 502, 512, 512, 502 };
64 for (x = 0; x < avctx->width; x++) {
67 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
68 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
69 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
70 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
72 dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
73 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
74 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
75 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
79 dst_y += p->linesize[0] / 2;
80 dst_u += p->linesize[1] / 2;
81 dst_v += p->linesize[2] / 2;
82 dst_a += p->linesize[3] / 2;
86 static void decode_ca4p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
88 SheerVideoContext *s = avctx->priv_data;
89 uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
92 dst_a = (uint16_t *)p->data[3];
93 dst_y = (uint16_t *)p->data[0];
94 dst_u = (uint16_t *)p->data[1];
95 dst_v = (uint16_t *)p->data[2];
98 for (x = 0; x < avctx->width; x++) {
99 dst_a[x] = get_bits(gb, 10);
100 dst_y[x] = get_bits(gb, 10);
101 dst_u[x] = get_bits(gb, 10);
102 dst_v[x] = get_bits(gb, 10);
105 int pred[4] = { 502, 512, 512, 502 };
107 for (x = 0; x < avctx->width; x++) {
110 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
111 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
112 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
113 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
115 dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
116 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
117 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
118 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
122 dst_y += p->linesize[0] / 2;
123 dst_u += p->linesize[1] / 2;
124 dst_v += p->linesize[2] / 2;
125 dst_a += p->linesize[3] / 2;
127 for (y = 1; y < avctx->height; y++) {
129 for (x = 0; x < avctx->width; x++) {
130 dst_a[x] = get_bits(gb, 10);
131 dst_y[x] = get_bits(gb, 10);
132 dst_u[x] = get_bits(gb, 10);
133 dst_v[x] = get_bits(gb, 10);
136 int pred_TL[4], pred_L[4], pred_T[4];
139 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
140 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
141 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
142 pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
144 for (x = 0; x < avctx->width; x++) {
145 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
146 pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
147 pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
148 pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
150 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
151 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
152 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
153 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
155 dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
156 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
157 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
158 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
160 pred_TL[0] = pred_T[0];
161 pred_TL[1] = pred_T[1];
162 pred_TL[2] = pred_T[2];
163 pred_TL[3] = pred_T[3];
167 dst_y += p->linesize[0] / 2;
168 dst_u += p->linesize[1] / 2;
169 dst_v += p->linesize[2] / 2;
170 dst_a += p->linesize[3] / 2;
174 static void decode_ybr10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
176 SheerVideoContext *s = avctx->priv_data;
177 uint16_t *dst_y, *dst_u, *dst_v;
180 dst_y = (uint16_t *)p->data[0];
181 dst_u = (uint16_t *)p->data[1];
182 dst_v = (uint16_t *)p->data[2];
184 for (y = 0; y < avctx->height; y++) {
186 for (x = 0; x < avctx->width; x++) {
187 dst_y[x] = get_bits(gb, 10);
188 dst_u[x] = get_bits(gb, 10);
189 dst_v[x] = get_bits(gb, 10);
192 int pred[4] = { 502, 512, 512, 512 };
194 for (x = 0; x < avctx->width; x++) {
197 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
198 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
199 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
201 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
202 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
203 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
207 dst_y += p->linesize[0] / 2;
208 dst_u += p->linesize[1] / 2;
209 dst_v += p->linesize[2] / 2;
213 static void decode_ybr10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
215 SheerVideoContext *s = avctx->priv_data;
216 uint16_t *dst_y, *dst_u, *dst_v;
219 dst_y = (uint16_t *)p->data[0];
220 dst_u = (uint16_t *)p->data[1];
221 dst_v = (uint16_t *)p->data[2];
224 for (x = 0; x < avctx->width; x++) {
225 dst_y[x] = get_bits(gb, 10);
226 dst_u[x] = get_bits(gb, 10);
227 dst_v[x] = get_bits(gb, 10);
230 int pred[4] = { 502, 512, 512, 512 };
232 for (x = 0; x < avctx->width; x++) {
235 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
236 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
237 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
239 dst_y[x] = pred[0] = (y + pred[0]) & 0x3ff;
240 dst_u[x] = pred[1] = (u + pred[1]) & 0x3ff;
241 dst_v[x] = pred[2] = (v + pred[2]) & 0x3ff;
245 dst_y += p->linesize[0] / 2;
246 dst_u += p->linesize[1] / 2;
247 dst_v += p->linesize[2] / 2;
249 for (y = 1; y < avctx->height; y++) {
251 for (x = 0; x < avctx->width; x++) {
252 dst_y[x] = get_bits(gb, 10);
253 dst_u[x] = get_bits(gb, 10);
254 dst_v[x] = get_bits(gb, 10);
257 int pred_TL[4], pred_L[4], pred_T[4];
260 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
261 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
262 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
264 for (x = 0; x < avctx->width; x++) {
265 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
266 pred_T[1] = dst_u[-p->linesize[1] / 2 + x];
267 pred_T[2] = dst_v[-p->linesize[2] / 2 + x];
269 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
270 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
271 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
273 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
274 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
275 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
277 pred_TL[0] = pred_T[0];
278 pred_TL[1] = pred_T[1];
279 pred_TL[2] = pred_T[2];
283 dst_y += p->linesize[0] / 2;
284 dst_u += p->linesize[1] / 2;
285 dst_v += p->linesize[2] / 2;
289 static void decode_yry10i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
291 SheerVideoContext *s = avctx->priv_data;
292 uint16_t *dst_y, *dst_u, *dst_v;
295 dst_y = (uint16_t *)p->data[0];
296 dst_u = (uint16_t *)p->data[1];
297 dst_v = (uint16_t *)p->data[2];
299 for (y = 0; y < avctx->height; y++) {
301 for (x = 0; x < avctx->width; x += 2) {
302 dst_y[x ] = get_bits(gb, 10);
303 dst_u[x / 2] = get_bits(gb, 10);
304 dst_y[x + 1] = get_bits(gb, 10);
305 dst_v[x / 2] = get_bits(gb, 10);
308 int pred[4] = { 502, 512, 512, 0 };
310 for (x = 0; x < avctx->width; x += 2) {
313 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
314 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
315 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
316 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
318 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff;
319 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff;
320 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
321 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff;
325 dst_y += p->linesize[0] / 2;
326 dst_u += p->linesize[1] / 2;
327 dst_v += p->linesize[2] / 2;
331 static void decode_yry10(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
333 SheerVideoContext *s = avctx->priv_data;
334 uint16_t *dst_y, *dst_u, *dst_v;
337 dst_y = (uint16_t *)p->data[0];
338 dst_u = (uint16_t *)p->data[1];
339 dst_v = (uint16_t *)p->data[2];
342 for (x = 0; x < avctx->width; x += 2) {
343 dst_y[x ] = get_bits(gb, 10);
344 dst_u[x / 2] = get_bits(gb, 10);
345 dst_y[x + 1] = get_bits(gb, 10);
346 dst_v[x / 2] = get_bits(gb, 10);
349 int pred[4] = { 502, 512, 512, 0 };
351 for (x = 0; x < avctx->width; x += 2) {
354 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
355 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
356 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
357 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
359 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff;
360 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff;
361 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
362 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff;
366 dst_y += p->linesize[0] / 2;
367 dst_u += p->linesize[1] / 2;
368 dst_v += p->linesize[2] / 2;
370 for (y = 1; y < avctx->height; y++) {
372 for (x = 0; x < avctx->width; x += 2) {
373 dst_y[x ] = get_bits(gb, 10);
374 dst_u[x / 2] = get_bits(gb, 10);
375 dst_y[x + 1] = get_bits(gb, 10);
376 dst_v[x / 2] = get_bits(gb, 10);
379 int pred_TL[6], pred_L[6], pred_T[6];
382 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
383 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
384 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
386 for (x = 0; x < avctx->width; x += 2) {
387 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
388 pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
389 pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
390 pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
392 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
393 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
394 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
395 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
397 dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
398 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
399 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
400 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
402 pred_TL[0] = pred_T[3];
403 pred_TL[1] = pred_T[1];
404 pred_TL[2] = pred_T[2];
408 dst_y += p->linesize[0] / 2;
409 dst_u += p->linesize[1] / 2;
410 dst_v += p->linesize[2] / 2;
414 static void decode_ca2i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
416 SheerVideoContext *s = avctx->priv_data;
417 uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
420 dst_y = (uint16_t *)p->data[0];
421 dst_u = (uint16_t *)p->data[1];
422 dst_v = (uint16_t *)p->data[2];
423 dst_a = (uint16_t *)p->data[3];
425 for (y = 0; y < avctx->height; y++) {
427 for (x = 0; x < avctx->width; x += 2) {
428 dst_a[x ] = get_bits(gb, 10);
429 dst_y[x ] = get_bits(gb, 10);
430 dst_u[x / 2] = get_bits(gb, 10);
431 dst_a[x + 1] = get_bits(gb, 10);
432 dst_y[x + 1] = get_bits(gb, 10);
433 dst_v[x / 2] = get_bits(gb, 10);
436 int pred[4] = { 502, 512, 512, 502 };
438 for (x = 0; x < avctx->width; x += 2) {
439 int y1, y2, u, v, a1, a2;
441 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
442 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
443 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
444 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
445 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
446 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
448 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff;
449 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff;
450 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
451 dst_a[x ] = pred[3] = (a1 + pred[3]) & 0x3ff;
452 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff;
453 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff;
457 dst_y += p->linesize[0] / 2;
458 dst_u += p->linesize[1] / 2;
459 dst_v += p->linesize[2] / 2;
460 dst_a += p->linesize[3] / 2;
464 static void decode_ca2p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
466 SheerVideoContext *s = avctx->priv_data;
467 uint16_t *dst_y, *dst_u, *dst_v, *dst_a;
470 dst_y = (uint16_t *)p->data[0];
471 dst_u = (uint16_t *)p->data[1];
472 dst_v = (uint16_t *)p->data[2];
473 dst_a = (uint16_t *)p->data[3];
476 for (x = 0; x < avctx->width; x += 2) {
477 dst_a[x ] = get_bits(gb, 10);
478 dst_y[x ] = get_bits(gb, 10);
479 dst_u[x / 2] = get_bits(gb, 10);
480 dst_a[x + 1] = get_bits(gb, 10);
481 dst_y[x + 1] = get_bits(gb, 10);
482 dst_v[x / 2] = get_bits(gb, 10);
485 int pred[4] = { 502, 512, 512, 502 };
487 for (x = 0; x < avctx->width; x += 2) {
488 int y1, y2, u, v, a1, a2;
490 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
491 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
492 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
493 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
494 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
495 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
497 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0x3ff;
498 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0x3ff;
499 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0x3ff;
500 dst_a[x ] = pred[3] = (a1 + pred[3]) & 0x3ff;
501 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0x3ff;
502 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0x3ff;
506 dst_y += p->linesize[0] / 2;
507 dst_u += p->linesize[1] / 2;
508 dst_v += p->linesize[2] / 2;
509 dst_a += p->linesize[3] / 2;
511 for (y = 1; y < avctx->height; y++) {
513 for (x = 0; x < avctx->width; x += 2) {
514 dst_a[x ] = get_bits(gb, 10);
515 dst_y[x ] = get_bits(gb, 10);
516 dst_u[x / 2] = get_bits(gb, 10);
517 dst_a[x + 1] = get_bits(gb, 10);
518 dst_y[x + 1] = get_bits(gb, 10);
519 dst_v[x / 2] = get_bits(gb, 10);
522 int pred_TL[6], pred_L[6], pred_T[6];
523 int y1, y2, u, v, a1, a2;
525 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0] / 2];
526 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1] / 2];
527 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2] / 2];
528 pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3] / 2];
530 for (x = 0; x < avctx->width; x += 2) {
531 pred_T[0] = dst_y[-p->linesize[0] / 2 + x];
532 pred_T[3] = dst_y[-p->linesize[0] / 2 + x + 1];
533 pred_T[1] = dst_u[-p->linesize[1] / 2 + x / 2];
534 pred_T[2] = dst_v[-p->linesize[2] / 2 + x / 2];
535 pred_T[4] = dst_a[-p->linesize[3] / 2 + x];
536 pred_T[5] = dst_a[-p->linesize[3] / 2 + x + 1];
538 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
539 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
540 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
541 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
542 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
543 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
545 dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
546 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0x3ff;
547 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0x3ff;
548 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0x3ff;
549 dst_a[x ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0x3ff;
550 dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0x3ff;
552 pred_TL[0] = pred_T[3];
553 pred_TL[1] = pred_T[1];
554 pred_TL[2] = pred_T[2];
555 pred_TL[4] = pred_T[5];
559 dst_y += p->linesize[0] / 2;
560 dst_u += p->linesize[1] / 2;
561 dst_v += p->linesize[2] / 2;
562 dst_a += p->linesize[3] / 2;
566 static void decode_c82i(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
568 SheerVideoContext *s = avctx->priv_data;
569 uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
577 for (y = 0; y < avctx->height; y += 1) {
579 for (x = 0; x < avctx->width; x += 2) {
580 dst_a[x ] = get_bits(gb, 8);
581 dst_y[x ] = get_bits(gb, 8);
582 dst_u[x / 2] = get_bits(gb, 8);
583 dst_a[x + 1] = get_bits(gb, 8);
584 dst_y[x + 1] = get_bits(gb, 8);
585 dst_v[x / 2] = get_bits(gb, 8);
588 int pred[4] = { 125, -128, -128, 125 };
590 for (x = 0; x < avctx->width; x += 2) {
591 int y1, y2, u, v, a1, a2;
593 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
594 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
595 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
596 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
597 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
598 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
600 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff;
601 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
602 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff;
603 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff;
604 dst_a[x ] = pred[3] = (a1 + pred[3]) & 0xff;
605 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
609 dst_y += p->linesize[0];
610 dst_u += p->linesize[1];
611 dst_v += p->linesize[2];
612 dst_a += p->linesize[3];
616 static void decode_c82p(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
618 SheerVideoContext *s = avctx->priv_data;
619 uint8_t *dst_y, *dst_u, *dst_v, *dst_a;
628 for (x = 0; x < avctx->width; x += 2) {
629 dst_a[x ] = get_bits(gb, 8);
630 dst_y[x ] = get_bits(gb, 8);
631 dst_u[x / 2] = get_bits(gb, 8);
632 dst_a[x + 1] = get_bits(gb, 8);
633 dst_y[x + 1] = get_bits(gb, 8);
634 dst_v[x / 2] = get_bits(gb, 8);
637 int pred[4] = { 125, -128, -128, 125 };
639 for (x = 0; x < avctx->width; x += 2) {
640 int y1, y2, u, v, a1, a2;
642 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
643 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
644 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
645 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
646 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
647 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
649 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff;
650 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff;
651 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
652 dst_a[x ] = pred[3] = (a1 + pred[3]) & 0xff;
653 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff;
654 dst_a[x + 1] = pred[3] = (a2 + pred[3]) & 0xff;
658 dst_y += p->linesize[0];
659 dst_u += p->linesize[1];
660 dst_v += p->linesize[2];
661 dst_a += p->linesize[3];
663 for (y = 1; y < avctx->height; y++) {
665 for (x = 0; x < avctx->width; x += 2) {
666 dst_a[x ] = get_bits(gb, 8);
667 dst_y[x ] = get_bits(gb, 8);
668 dst_u[x / 2] = get_bits(gb, 8);
669 dst_a[x + 1] = get_bits(gb, 8);
670 dst_y[x + 1] = get_bits(gb, 8);
671 dst_v[x / 2] = get_bits(gb, 8);
674 int pred_TL[6], pred_L[6], pred_T[6];
675 int y1, y2, u, v, a1, a2;
677 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
678 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
679 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
680 pred_TL[4] = pred_L[4] = dst_a[-p->linesize[3]];
682 for (x = 0; x < avctx->width; x += 2) {
683 pred_T[0] = dst_y[-p->linesize[0] + x];
684 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
685 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
686 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
687 pred_T[4] = dst_a[-p->linesize[3] + x];
688 pred_T[5] = dst_a[-p->linesize[3] + x + 1];
690 a1 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
691 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
692 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
693 a2 = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
694 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
695 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
697 dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
698 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
699 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
700 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
701 dst_a[x ] = pred_L[4] = (a1 + ((3 * (pred_T[4] + pred_L[4]) - 2 * pred_TL[4]) >> 2)) & 0xff;
702 dst_a[x + 1] = pred_L[4] = (a2 + ((3 * (pred_T[5] + pred_L[4]) - 2 * pred_T[4]) >> 2)) & 0xff;
704 pred_TL[0] = pred_T[3];
705 pred_TL[1] = pred_T[1];
706 pred_TL[2] = pred_T[2];
707 pred_TL[4] = pred_T[5];
711 dst_y += p->linesize[0];
712 dst_u += p->linesize[1];
713 dst_v += p->linesize[2];
714 dst_a += p->linesize[3];
718 static void decode_ybyr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
720 SheerVideoContext *s = avctx->priv_data;
721 uint8_t *dst_y, *dst_u, *dst_v;
729 for (x = 0; x < avctx->width; x += 2) {
730 dst_y[x ] = get_bits(gb, 8);
731 dst_u[x / 2] = get_bits(gb, 8) + 128;
732 dst_y[x + 1] = get_bits(gb, 8);
733 dst_v[x / 2] = get_bits(gb, 8) + 128;
736 int pred[4] = { -128, 128, 128, 0 };
738 for (x = 0; x < avctx->width; x += 2) {
741 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
742 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
743 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
744 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
746 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff;
747 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff;
748 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
749 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff;
753 dst_y += p->linesize[0];
754 dst_u += p->linesize[1];
755 dst_v += p->linesize[2];
757 for (y = 1; y < avctx->height; y++) {
759 for (x = 0; x < avctx->width; x += 2) {
760 dst_y[x ] = get_bits(gb, 8);
761 dst_u[x / 2] = get_bits(gb, 8) + 128;
762 dst_y[x + 1] = get_bits(gb, 8);
763 dst_v[x / 2] = get_bits(gb, 8) + 128;
766 int pred_TL[4], pred_L[4], pred_T[4];
769 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
770 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
771 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
773 for (x = 0; x < avctx->width; x += 2) {
774 pred_T[0] = dst_y[-p->linesize[0] + x];
775 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
776 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
777 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
779 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
780 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
781 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
782 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
784 dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
785 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
786 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
787 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
789 pred_TL[0] = pred_T[3];
790 pred_TL[1] = pred_T[1];
791 pred_TL[2] = pred_T[2];
795 dst_y += p->linesize[0];
796 dst_u += p->linesize[1];
797 dst_v += p->linesize[2];
801 static void decode_byryi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
803 SheerVideoContext *s = avctx->priv_data;
804 uint8_t *dst_y, *dst_u, *dst_v;
812 for (x = 0; x < avctx->width; x += 2) {
813 dst_y[x ] = get_bits(gb, 8);
814 dst_u[x / 2] = get_bits(gb, 8);
815 dst_y[x + 1] = get_bits(gb, 8);
816 dst_v[x / 2] = get_bits(gb, 8);
819 int pred[4] = { 125, -128, -128, 0 };
821 for (x = 0; x < avctx->width; x += 2) {
824 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
825 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
826 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
827 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
829 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff;
830 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff;
831 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
832 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff;
836 dst_y += p->linesize[0];
837 dst_u += p->linesize[1];
838 dst_v += p->linesize[2];
840 for (y = 1; y < avctx->height; y++) {
842 for (x = 0; x < avctx->width; x += 2) {
843 dst_y[x ] = get_bits(gb, 8);
844 dst_u[x / 2] = get_bits(gb, 8);
845 dst_y[x + 1] = get_bits(gb, 8);
846 dst_v[x / 2] = get_bits(gb, 8);
852 pred_L[0] = dst_y[-p->linesize[0]];
853 pred_L[1] = dst_u[-p->linesize[1]];
854 pred_L[2] = dst_v[-p->linesize[2]];
856 for (x = 0; x < avctx->width; x += 2) {
857 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
858 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
859 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
860 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
862 dst_y[x ] = pred_L[0] = (y1 + pred_L[0]) & 0xff;
863 dst_u[x / 2] = pred_L[1] = (u + pred_L[1]) & 0xff;
864 dst_y[x + 1] = pred_L[0] = (y2 + pred_L[0]) & 0xff;
865 dst_v[x / 2] = pred_L[2] = (v + pred_L[2]) & 0xff;
869 dst_y += p->linesize[0];
870 dst_u += p->linesize[1];
871 dst_v += p->linesize[2];
875 static void decode_byry(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
877 SheerVideoContext *s = avctx->priv_data;
878 uint8_t *dst_y, *dst_u, *dst_v;
886 for (x = 0; x < avctx->width; x += 2) {
887 dst_y[x ] = get_bits(gb, 8);
888 dst_u[x / 2] = get_bits(gb, 8);
889 dst_y[x + 1] = get_bits(gb, 8);
890 dst_v[x / 2] = get_bits(gb, 8);
893 int pred[4] = { 125, -128, -128, 0 };
895 for (x = 0; x < avctx->width; x += 2) {
898 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
899 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
900 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
901 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
903 dst_y[x ] = pred[0] = (y1 + pred[0]) & 0xff;
904 dst_u[x / 2] = pred[1] = (u + pred[1]) & 0xff;
905 dst_y[x + 1] = pred[0] = (y2 + pred[0]) & 0xff;
906 dst_v[x / 2] = pred[2] = (v + pred[2]) & 0xff;
910 dst_y += p->linesize[0];
911 dst_u += p->linesize[1];
912 dst_v += p->linesize[2];
914 for (y = 1; y < avctx->height; y++) {
916 for (x = 0; x < avctx->width; x += 2) {
917 dst_y[x ] = get_bits(gb, 8);
918 dst_u[x / 2] = get_bits(gb, 8);
919 dst_y[x + 1] = get_bits(gb, 8);
920 dst_v[x / 2] = get_bits(gb, 8);
923 int pred_TL[4], pred_L[4], pred_T[4];
926 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
927 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
928 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
930 for (x = 0; x < avctx->width; x += 2) {
931 pred_T[0] = dst_y[-p->linesize[0] + x];
932 pred_T[3] = dst_y[-p->linesize[0] + x + 1];
933 pred_T[1] = dst_u[-p->linesize[1] + x / 2];
934 pred_T[2] = dst_v[-p->linesize[2] + x / 2];
936 y1 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
937 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
938 y2 = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
939 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
941 dst_y[x ] = pred_L[0] = (y1 + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
942 dst_u[x / 2] = pred_L[1] = (u + (((pred_L[1] - pred_TL[1]) >> 1) + pred_T[1])) & 0xff;
943 dst_y[x + 1] = pred_L[0] = (y2 + ((3 * (pred_T[3] + pred_L[0]) - 2 * pred_T[0]) >> 2)) & 0xff;
944 dst_v[x / 2] = pred_L[2] = (v + (((pred_L[2] - pred_TL[2]) >> 1) + pred_T[2])) & 0xff;
946 pred_TL[0] = pred_T[3];
947 pred_TL[1] = pred_T[1];
948 pred_TL[2] = pred_T[2];
952 dst_y += p->linesize[0];
953 dst_u += p->linesize[1];
954 dst_v += p->linesize[2];
958 static void decode_ybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
960 SheerVideoContext *s = avctx->priv_data;
961 uint8_t *dst_y, *dst_u, *dst_v;
969 for (x = 0; x < avctx->width; x++) {
970 dst_y[x] = get_bits(gb, 8);
971 dst_u[x] = get_bits(gb, 8);
972 dst_v[x] = get_bits(gb, 8);
975 int pred[4] = { s->alt ? 125 : -146, -128, -128, -128 };
977 for (x = 0; x < avctx->width; x++) {
980 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
981 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
982 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
984 dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
985 dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
986 dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
990 dst_y += p->linesize[0];
991 dst_u += p->linesize[1];
992 dst_v += p->linesize[2];
994 for (y = 1; y < avctx->height; y++) {
996 for (x = 0; x < avctx->width; x++) {
997 dst_y[x] = get_bits(gb, 8);
998 dst_u[x] = get_bits(gb, 8);
999 dst_v[x] = get_bits(gb, 8);
1005 pred_L[0] = dst_y[-p->linesize[0]];
1006 pred_L[1] = dst_u[-p->linesize[1]];
1007 pred_L[2] = dst_v[-p->linesize[2]];
1009 for (x = 0; x < avctx->width; x++) {
1010 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1011 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1012 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1014 dst_y[x] = pred_L[0] = (y + pred_L[0]) & 0xff;
1015 dst_u[x] = pred_L[1] = (u + pred_L[1]) & 0xff;
1016 dst_v[x] = pred_L[2] = (v + pred_L[2]) & 0xff;
1020 dst_y += p->linesize[0];
1021 dst_u += p->linesize[1];
1022 dst_v += p->linesize[2];
1026 static void decode_ybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1028 SheerVideoContext *s = avctx->priv_data;
1029 uint8_t *dst_y, *dst_u, *dst_v;
1036 if (get_bits1(gb)) {
1037 for (x = 0; x < avctx->width; x++) {
1038 dst_y[x] = get_bits(gb, 8);
1039 dst_u[x] = get_bits(gb, 8);
1040 dst_v[x] = get_bits(gb, 8);
1043 int pred[4] = { s->alt ? 125 : -146, -128, -128, -128 };
1045 for (x = 0; x < avctx->width; x++) {
1048 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1049 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1050 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1052 dst_y[x] = pred[0] = (y + pred[0]) & 0xff;
1053 dst_u[x] = pred[1] = (u + pred[1]) & 0xff;
1054 dst_v[x] = pred[2] = (v + pred[2]) & 0xff;
1058 dst_y += p->linesize[0];
1059 dst_u += p->linesize[1];
1060 dst_v += p->linesize[2];
1062 for (y = 1; y < avctx->height; y++) {
1063 if (get_bits1(gb)) {
1064 for (x = 0; x < avctx->width; x++) {
1065 dst_y[x] = get_bits(gb, 8);
1066 dst_u[x] = get_bits(gb, 8);
1067 dst_v[x] = get_bits(gb, 8);
1070 int pred_TL[4], pred_L[4], pred_T[4];
1073 pred_TL[0] = pred_L[0] = dst_y[-p->linesize[0]];
1074 pred_TL[1] = pred_L[1] = dst_u[-p->linesize[1]];
1075 pred_TL[2] = pred_L[2] = dst_v[-p->linesize[2]];
1077 for (x = 0; x < avctx->width; x++) {
1078 pred_T[0] = dst_y[-p->linesize[0] + x];
1079 pred_T[1] = dst_u[-p->linesize[1] + x];
1080 pred_T[2] = dst_v[-p->linesize[2] + x];
1082 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1083 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1084 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1086 dst_y[x] = pred_L[0] = (y + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1087 dst_u[x] = pred_L[1] = (u + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1088 dst_v[x] = pred_L[2] = (v + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1090 pred_TL[0] = pred_T[0];
1091 pred_TL[1] = pred_T[1];
1092 pred_TL[2] = pred_T[2];
1096 dst_y += p->linesize[0];
1097 dst_u += p->linesize[1];
1098 dst_v += p->linesize[2];
1102 static void decode_aybri(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1104 SheerVideoContext *s = avctx->priv_data;
1105 uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
1113 if (get_bits1(gb)) {
1114 for (x = 0; x < avctx->width; x++) {
1115 dst_a[x] = get_bits(gb, 8);
1116 dst_y[x] = get_bits(gb, 8);
1117 dst_u[x] = get_bits(gb, 8);
1118 dst_v[x] = get_bits(gb, 8);
1121 int pred[4] = { 125, s->alt ? 125 : -146, -128, -128 };
1123 for (x = 0; x < avctx->width; x++) {
1126 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1127 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1128 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1129 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1131 dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
1132 dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
1133 dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
1134 dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
1138 dst_a += p->linesize[3];
1139 dst_y += p->linesize[0];
1140 dst_u += p->linesize[1];
1141 dst_v += p->linesize[2];
1143 for (y = 1; y < avctx->height; y++) {
1144 if (get_bits1(gb)) {
1145 for (x = 0; x < avctx->width; x++) {
1146 dst_a[x] = get_bits(gb, 8);
1147 dst_y[x] = get_bits(gb, 8);
1148 dst_u[x] = get_bits(gb, 8);
1149 dst_v[x] = get_bits(gb, 8);
1155 pred_L[0] = dst_a[-p->linesize[3]];
1156 pred_L[1] = dst_y[-p->linesize[0]];
1157 pred_L[2] = dst_u[-p->linesize[1]];
1158 pred_L[3] = dst_v[-p->linesize[2]];
1160 for (x = 0; x < avctx->width; x++) {
1161 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1162 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1163 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1164 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1166 dst_a[x] = pred_L[0] = (a + pred_L[0]) & 0xff;
1167 dst_y[x] = pred_L[1] = (y + pred_L[1]) & 0xff;
1168 dst_u[x] = pred_L[2] = (u + pred_L[2]) & 0xff;
1169 dst_v[x] = pred_L[3] = (v + pred_L[3]) & 0xff;
1173 dst_a += p->linesize[3];
1174 dst_y += p->linesize[0];
1175 dst_u += p->linesize[1];
1176 dst_v += p->linesize[2];
1180 static void decode_aybr(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1182 SheerVideoContext *s = avctx->priv_data;
1183 uint8_t *dst_a, *dst_y, *dst_u, *dst_v;
1191 if (get_bits1(gb)) {
1192 for (x = 0; x < avctx->width; x++) {
1193 dst_a[x] = get_bits(gb, 8);
1194 dst_y[x] = get_bits(gb, 8);
1195 dst_u[x] = get_bits(gb, 8);
1196 dst_v[x] = get_bits(gb, 8);
1199 int pred[4] = { 125, s->alt ? 125 : -146, -128, -128 };
1201 for (x = 0; x < avctx->width; x++) {
1204 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1205 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1206 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1207 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1209 dst_a[x] = pred[0] = (a + pred[0]) & 0xff;
1210 dst_y[x] = pred[1] = (y + pred[1]) & 0xff;
1211 dst_u[x] = pred[2] = (u + pred[2]) & 0xff;
1212 dst_v[x] = pred[3] = (v + pred[3]) & 0xff;
1216 dst_a += p->linesize[3];
1217 dst_y += p->linesize[0];
1218 dst_u += p->linesize[1];
1219 dst_v += p->linesize[2];
1221 for (y = 1; y < avctx->height; y++) {
1222 if (get_bits1(gb)) {
1223 for (x = 0; x < avctx->width; x++) {
1224 dst_a[x] = get_bits(gb, 8);
1225 dst_y[x] = get_bits(gb, 8);
1226 dst_u[x] = get_bits(gb, 8);
1227 dst_v[x] = get_bits(gb, 8);
1230 int pred_TL[4], pred_L[4], pred_T[4];
1233 pred_TL[0] = pred_L[0] = dst_a[-p->linesize[3]];
1234 pred_TL[1] = pred_L[1] = dst_y[-p->linesize[0]];
1235 pred_TL[2] = pred_L[2] = dst_u[-p->linesize[1]];
1236 pred_TL[3] = pred_L[3] = dst_v[-p->linesize[2]];
1238 for (x = 0; x < avctx->width; x++) {
1239 pred_T[0] = dst_a[-p->linesize[3] + x];
1240 pred_T[1] = dst_y[-p->linesize[0] + x];
1241 pred_T[2] = dst_u[-p->linesize[1] + x];
1242 pred_T[3] = dst_v[-p->linesize[2] + x];
1244 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1245 y = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1246 u = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1247 v = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1249 dst_a[x] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1250 dst_y[x] = pred_L[1] = (y + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1251 dst_u[x] = pred_L[2] = (u + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1252 dst_v[x] = pred_L[3] = (v + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
1254 pred_TL[0] = pred_T[0];
1255 pred_TL[1] = pred_T[1];
1256 pred_TL[2] = pred_T[2];
1257 pred_TL[3] = pred_T[3];
1261 dst_a += p->linesize[3];
1262 dst_y += p->linesize[0];
1263 dst_u += p->linesize[1];
1264 dst_v += p->linesize[2];
1268 static void decode_argxi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1270 SheerVideoContext *s = avctx->priv_data;
1271 uint16_t *dst_r, *dst_g, *dst_b, *dst_a;
1274 dst_r = (uint16_t *)p->data[2];
1275 dst_g = (uint16_t *)p->data[0];
1276 dst_b = (uint16_t *)p->data[1];
1277 dst_a = (uint16_t *)p->data[3];
1279 for (y = 0; y < avctx->height; y++) {
1280 if (get_bits1(gb)) {
1281 for (x = 0; x < avctx->width; x++) {
1282 dst_a[x] = get_bits(gb, 10);
1283 dst_r[x] = get_bits(gb, 10);
1284 dst_g[x] = get_bits(gb, 10);
1285 dst_b[x] = get_bits(gb, 10);
1288 int pred[4] = { 512, 512, 512, 512 };
1290 for (x = 0; x < avctx->width; x++) {
1293 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1294 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1295 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1296 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1298 dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
1299 dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1300 dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1301 dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1305 dst_r += p->linesize[2] / 2;
1306 dst_g += p->linesize[0] / 2;
1307 dst_b += p->linesize[1] / 2;
1308 dst_a += p->linesize[3] / 2;
1312 static void decode_argx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1314 SheerVideoContext *s = avctx->priv_data;
1315 uint16_t *dst_r, *dst_g, *dst_b, *dst_a;
1318 dst_r = (uint16_t *)p->data[2];
1319 dst_g = (uint16_t *)p->data[0];
1320 dst_b = (uint16_t *)p->data[1];
1321 dst_a = (uint16_t *)p->data[3];
1323 if (get_bits1(gb)) {
1324 for (x = 0; x < avctx->width; x++) {
1325 dst_a[x] = get_bits(gb, 10);
1326 dst_r[x] = get_bits(gb, 10);
1327 dst_g[x] = get_bits(gb, 10);
1328 dst_b[x] = get_bits(gb, 10);
1331 int pred[4] = { 512, 512, 512, 512 };
1333 for (x = 0; x < avctx->width; x++) {
1336 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1337 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1338 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1339 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1341 dst_a[x] = pred[3] = (a + pred[3]) & 0x3ff;
1342 dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1343 dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1344 dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1348 dst_r += p->linesize[2] / 2;
1349 dst_g += p->linesize[0] / 2;
1350 dst_b += p->linesize[1] / 2;
1351 dst_a += p->linesize[3] / 2;
1353 for (y = 1; y < avctx->height; y++) {
1354 if (get_bits1(gb)) {
1355 for (x = 0; x < avctx->width; x++) {
1356 dst_a[x] = get_bits(gb, 10);
1357 dst_r[x] = get_bits(gb, 10);
1358 dst_g[x] = get_bits(gb, 10);
1359 dst_b[x] = get_bits(gb, 10);
1362 int pred_TL[4], pred_L[4], pred_T[4];
1365 pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
1366 pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
1367 pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
1368 pred_TL[3] = pred_L[3] = dst_a[-p->linesize[3] / 2];
1370 for (x = 0; x < avctx->width; x++) {
1371 pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
1372 pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
1373 pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
1374 pred_T[3] = dst_a[-p->linesize[3] / 2 + x];
1376 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1377 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1378 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1379 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1381 dst_a[x] = pred_L[3] = (a + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0x3ff;
1382 dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1383 dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1384 dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1386 pred_TL[0] = pred_T[0];
1387 pred_TL[1] = pred_T[1];
1388 pred_TL[2] = pred_T[2];
1389 pred_TL[3] = pred_T[3];
1393 dst_r += p->linesize[2] / 2;
1394 dst_g += p->linesize[0] / 2;
1395 dst_b += p->linesize[1] / 2;
1396 dst_a += p->linesize[3] / 2;
1400 static void decode_rgbxi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1402 SheerVideoContext *s = avctx->priv_data;
1403 uint16_t *dst_r, *dst_g, *dst_b;
1406 dst_r = (uint16_t *)p->data[2];
1407 dst_g = (uint16_t *)p->data[0];
1408 dst_b = (uint16_t *)p->data[1];
1410 for (y = 0; y < avctx->height; y++) {
1411 if (get_bits1(gb)) {
1412 for (x = 0; x < avctx->width; x++) {
1413 dst_r[x] = get_bits(gb, 10);
1414 dst_g[x] = get_bits(gb, 10);
1415 dst_b[x] = get_bits(gb, 10);
1418 int pred[4] = { 512, 512, 512, 0 };
1420 for (x = 0; x < avctx->width; x++) {
1423 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1424 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1425 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1427 dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1428 dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1429 dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1433 dst_r += p->linesize[2] / 2;
1434 dst_g += p->linesize[0] / 2;
1435 dst_b += p->linesize[1] / 2;
1439 static void decode_rgbx(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1441 SheerVideoContext *s = avctx->priv_data;
1442 uint16_t *dst_r, *dst_g, *dst_b;
1445 dst_r = (uint16_t *)p->data[2];
1446 dst_g = (uint16_t *)p->data[0];
1447 dst_b = (uint16_t *)p->data[1];
1449 if (get_bits1(gb)) {
1450 for (x = 0; x < avctx->width; x++) {
1451 dst_r[x] = get_bits(gb, 10);
1452 dst_g[x] = get_bits(gb, 10);
1453 dst_b[x] = get_bits(gb, 10);
1456 int pred[4] = { 512, 512, 512, 0 };
1458 for (x = 0; x < avctx->width; x++) {
1461 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1462 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1463 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1465 dst_r[x] = pred[0] = (r + pred[0]) & 0x3ff;
1466 dst_g[x] = pred[1] = (r + g + pred[1]) & 0x3ff;
1467 dst_b[x] = pred[2] = (r + g + b + pred[2]) & 0x3ff;
1471 dst_r += p->linesize[2] / 2;
1472 dst_g += p->linesize[0] / 2;
1473 dst_b += p->linesize[1] / 2;
1475 for (y = 1; y < avctx->height; y++) {
1476 if (get_bits1(gb)) {
1477 for (x = 0; x < avctx->width; x++) {
1478 dst_r[x] = get_bits(gb, 10);
1479 dst_g[x] = get_bits(gb, 10);
1480 dst_b[x] = get_bits(gb, 10);
1483 int pred_TL[4], pred_L[4], pred_T[4];
1486 pred_TL[0] = pred_L[0] = dst_r[-p->linesize[2] / 2];
1487 pred_TL[1] = pred_L[1] = dst_g[-p->linesize[0] / 2];
1488 pred_TL[2] = pred_L[2] = dst_b[-p->linesize[1] / 2];
1490 for (x = 0; x < avctx->width; x++) {
1491 pred_T[0] = dst_r[-p->linesize[2] / 2 + x];
1492 pred_T[1] = dst_g[-p->linesize[0] / 2 + x];
1493 pred_T[2] = dst_b[-p->linesize[1] / 2 + x];
1495 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1496 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1497 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1499 dst_r[x] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0x3ff;
1500 dst_g[x] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0x3ff;
1501 dst_b[x] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0x3ff;
1503 pred_TL[0] = pred_T[0];
1504 pred_TL[1] = pred_T[1];
1505 pred_TL[2] = pred_T[2];
1509 dst_r += p->linesize[2] / 2;
1510 dst_g += p->linesize[0] / 2;
1511 dst_b += p->linesize[1] / 2;
1515 static void decode_argbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1517 SheerVideoContext *s = avctx->priv_data;
1522 if (get_bits1(gb)) {
1523 for (x = 0; x < avctx->width; x++) {
1524 dst[x * 4 + 0] = get_bits(gb, 8);
1525 dst[x * 4 + 1] = get_bits(gb, 8);
1526 dst[x * 4 + 2] = get_bits(gb, 8);
1527 dst[x * 4 + 3] = get_bits(gb, 8);
1530 int pred[4] = { -128, -128, -128, -128 };
1532 for (x = 0; x < avctx->width; x++) {
1535 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1536 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1537 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1538 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1540 dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
1541 dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
1542 dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
1543 dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
1547 dst += p->linesize[0];
1548 for (y = 1; y < avctx->height; y++) {
1549 if (get_bits1(gb)) {
1550 for (x = 0; x < avctx->width; x++) {
1551 dst[x * 4 + 0] = get_bits(gb, 8);
1552 dst[x * 4 + 1] = get_bits(gb, 8);
1553 dst[x * 4 + 2] = get_bits(gb, 8);
1554 dst[x * 4 + 3] = get_bits(gb, 8);
1560 pred_L[0] = dst[-p->linesize[0] + 0];
1561 pred_L[1] = dst[-p->linesize[0] + 1];
1562 pred_L[2] = dst[-p->linesize[0] + 2];
1563 pred_L[3] = dst[-p->linesize[0] + 3];
1565 for (x = 0; x < avctx->width; x++) {
1566 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1567 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1568 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1569 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1571 dst[4 * x + 0] = pred_L[0] = (a + pred_L[0]) & 0xff;
1572 dst[4 * x + 1] = pred_L[1] = (r + pred_L[1]) & 0xff;
1573 dst[4 * x + 2] = pred_L[2] = (r + g + pred_L[2]) & 0xff;
1574 dst[4 * x + 3] = pred_L[3] = (r + g + b + pred_L[3]) & 0xff;
1577 dst += p->linesize[0];
1581 static void decode_argb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1583 SheerVideoContext *s = avctx->priv_data;
1588 if (get_bits1(gb)) {
1589 for (x = 0; x < avctx->width; x++) {
1590 dst[x * 4 + 0] = get_bits(gb, 8);
1591 dst[x * 4 + 1] = get_bits(gb, 8);
1592 dst[x * 4 + 2] = get_bits(gb, 8);
1593 dst[x * 4 + 3] = get_bits(gb, 8);
1596 int pred[4] = { -128, -128, -128, -128 };
1598 for (x = 0; x < avctx->width; x++) {
1601 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1602 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1603 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1604 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1606 dst[4 * x + 0] = pred[0] = (a + pred[0]) & 0xff;
1607 dst[4 * x + 1] = pred[1] = (r + pred[1]) & 0xff;
1608 dst[4 * x + 2] = pred[2] = (r + g + pred[2]) & 0xff;
1609 dst[4 * x + 3] = pred[3] = (r + g + b + pred[3]) & 0xff;
1613 dst += p->linesize[0];
1614 for (y = 1; y < avctx->height; y++) {
1615 if (get_bits1(gb)) {
1616 for (x = 0; x < avctx->width; x++) {
1617 dst[x * 4 + 0] = get_bits(gb, 8);
1618 dst[x * 4 + 1] = get_bits(gb, 8);
1619 dst[x * 4 + 2] = get_bits(gb, 8);
1620 dst[x * 4 + 3] = get_bits(gb, 8);
1623 int pred_TL[4], pred_L[4], pred_T[4];
1626 pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
1627 pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
1628 pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
1629 pred_TL[3] = pred_L[3] = dst[-p->linesize[0] + 3];
1631 for (x = 0; x < avctx->width; x++) {
1632 pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
1633 pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
1634 pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
1635 pred_T[3] = dst[-p->linesize[0] + 4 * x + 3];
1637 a = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1638 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1639 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1640 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1642 dst[4 * x + 0] = pred_L[0] = (a + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1643 dst[4 * x + 1] = pred_L[1] = (r + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1644 dst[4 * x + 2] = pred_L[2] = (r + g + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1645 dst[4 * x + 3] = pred_L[3] = (r + g + b + ((3 * (pred_T[3] + pred_L[3]) - 2 * pred_TL[3]) >> 2)) & 0xff;
1647 pred_TL[0] = pred_T[0];
1648 pred_TL[1] = pred_T[1];
1649 pred_TL[2] = pred_T[2];
1650 pred_TL[3] = pred_T[3];
1653 dst += p->linesize[0];
1657 static void decode_rgbi(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1659 SheerVideoContext *s = avctx->priv_data;
1664 if (get_bits1(gb)) {
1665 for (x = 0; x < avctx->width; x++) {
1666 dst[x * 4 + 0] = get_bits(gb, 8);
1667 dst[x * 4 + 1] = get_bits(gb, 8);
1668 dst[x * 4 + 2] = get_bits(gb, 8);
1671 int pred[4] = { -128, -128, -128, -128 };
1673 for (x = 0; x < avctx->width; x++) {
1676 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1677 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1678 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1680 dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
1681 dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
1682 dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
1686 dst += p->linesize[0];
1687 for (y = 1; y < avctx->height; y++) {
1688 if (get_bits1(gb)) {
1689 for (x = 0; x < avctx->width; x++) {
1690 dst[x * 4 + 0] = get_bits(gb, 8);
1691 dst[x * 4 + 1] = get_bits(gb, 8);
1692 dst[x * 4 + 2] = get_bits(gb, 8);
1698 pred_L[0] = dst[-p->linesize[0] + 0];
1699 pred_L[1] = dst[-p->linesize[0] + 1];
1700 pred_L[2] = dst[-p->linesize[0] + 2];
1702 for (x = 0; x < avctx->width; x++) {
1703 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1704 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1705 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1707 dst[4 * x + 0] = pred_L[0] = (r + pred_L[0]) & 0xff;
1708 dst[4 * x + 1] = pred_L[1] = (r + g + pred_L[1]) & 0xff;
1709 dst[4 * x + 2] = pred_L[2] = (r + g + b + pred_L[2]) & 0xff;
1712 dst += p->linesize[0];
1716 static void decode_rgb(AVCodecContext *avctx, AVFrame *p, GetBitContext *gb)
1718 SheerVideoContext *s = avctx->priv_data;
1723 if (get_bits1(gb)) {
1724 for (x = 0; x < avctx->width; x++) {
1725 dst[x * 4 + 0] = get_bits(gb, 8);
1726 dst[x * 4 + 1] = get_bits(gb, 8);
1727 dst[x * 4 + 2] = get_bits(gb, 8);
1730 int pred[4] = { -128, -128, -128, -128 };
1732 for (x = 0; x < avctx->width; x++) {
1735 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1736 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1737 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1739 dst[4 * x + 0] = pred[0] = (r + pred[0]) & 0xff;
1740 dst[4 * x + 1] = pred[1] = (r + g + pred[1]) & 0xff;
1741 dst[4 * x + 2] = pred[2] = (r + g + b + pred[2]) & 0xff;
1745 dst += p->linesize[0];
1746 for (y = 1; y < avctx->height; y++) {
1747 if (get_bits1(gb)) {
1748 for (x = 0; x < avctx->width; x++) {
1749 dst[x * 4 + 0] = get_bits(gb, 8);
1750 dst[x * 4 + 1] = get_bits(gb, 8);
1751 dst[x * 4 + 2] = get_bits(gb, 8);
1754 int pred_TL[4], pred_L[4], pred_T[4];
1757 pred_TL[0] = pred_L[0] = dst[-p->linesize[0] + 0];
1758 pred_TL[1] = pred_L[1] = dst[-p->linesize[0] + 1];
1759 pred_TL[2] = pred_L[2] = dst[-p->linesize[0] + 2];
1761 for (x = 0; x < avctx->width; x++) {
1762 pred_T[0] = dst[-p->linesize[0] + 4 * x + 0];
1763 pred_T[1] = dst[-p->linesize[0] + 4 * x + 1];
1764 pred_T[2] = dst[-p->linesize[0] + 4 * x + 2];
1766 r = get_vlc2(gb, s->vlc[0].table, s->vlc[0].bits, 2);
1767 g = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1768 b = get_vlc2(gb, s->vlc[1].table, s->vlc[1].bits, 2);
1770 dst[4 * x + 0] = pred_L[0] = (r + ((3 * (pred_T[0] + pred_L[0]) - 2 * pred_TL[0]) >> 2)) & 0xff;
1771 dst[4 * x + 1] = pred_L[1] = (r + g + ((3 * (pred_T[1] + pred_L[1]) - 2 * pred_TL[1]) >> 2)) & 0xff;
1772 dst[4 * x + 2] = pred_L[2] = (r + g + b + ((3 * (pred_T[2] + pred_L[2]) - 2 * pred_TL[2]) >> 2)) & 0xff;
1774 pred_TL[0] = pred_T[0];
1775 pred_TL[1] = pred_T[1];
1776 pred_TL[2] = pred_T[2];
1779 dst += p->linesize[0];
1783 static int build_vlc(VLC *vlc, const uint8_t *len, int count)
1785 uint32_t codes[1024];
1787 uint16_t syms[1024];
1792 for (i = 0; i < count; i++) {
1793 codes[i] = index >> (32 - len[i]);
1796 index += 1ULL << (32 - len[i]);
1800 return ff_init_vlc_sparse(vlc, 12, count,
1801 bits, sizeof(*bits), sizeof(*bits),
1802 codes, sizeof(*codes), sizeof(*codes),
1803 syms, sizeof(*syms), sizeof(*syms), 0);
1806 static int decode_frame(AVCodecContext *avctx,
1807 void *data, int *got_frame,
1810 SheerVideoContext *s = avctx->priv_data;
1811 ThreadFrame frame = { .f = data };
1817 if (avpkt->size <= 20)
1818 return AVERROR_INVALIDDATA;
1820 if (AV_RL32(avpkt->data) != MKTAG('S','h','i','r') &&
1821 AV_RL32(avpkt->data) != MKTAG('Z','w','a','k'))
1822 return AVERROR_INVALIDDATA;
1825 format = AV_RL32(avpkt->data + 16);
1826 av_log(avctx, AV_LOG_DEBUG, "format: %s\n", av_fourcc2str(format));
1828 case MKTAG(' ', 'R', 'G', 'B'):
1829 avctx->pix_fmt = AV_PIX_FMT_RGB0;
1830 s->decode_frame = decode_rgb;
1831 if (s->format != format) {
1832 ret = build_vlc(&s->vlc[0], l_r_rgb, 256);
1833 ret |= build_vlc(&s->vlc[1], l_g_rgb, 256);
1836 case MKTAG(' ', 'r', 'G', 'B'):
1837 avctx->pix_fmt = AV_PIX_FMT_RGB0;
1838 s->decode_frame = decode_rgbi;
1839 if (s->format != format) {
1840 ret = build_vlc(&s->vlc[0], l_r_rgbi, 256);
1841 ret |= build_vlc(&s->vlc[1], l_g_rgbi, 256);
1844 case MKTAG('A', 'R', 'G', 'X'):
1845 avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
1846 s->decode_frame = decode_argx;
1847 if (s->format != format) {
1848 ret = build_vlc(&s->vlc[0], l_r_rgbx, 1024);
1849 ret |= build_vlc(&s->vlc[1], l_g_rgbx, 1024);
1852 case MKTAG('A', 'r', 'G', 'X'):
1853 avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
1854 s->decode_frame = decode_argxi;
1855 if (s->format != format) {
1856 ret = build_vlc(&s->vlc[0], l_r_rgbxi, 1024);
1857 ret |= build_vlc(&s->vlc[1], l_g_rgbxi, 1024);
1860 case MKTAG('R', 'G', 'B', 'X'):
1861 avctx->pix_fmt = AV_PIX_FMT_GBRP10;
1862 s->decode_frame = decode_rgbx;
1863 if (s->format != format) {
1864 ret = build_vlc(&s->vlc[0], l_r_rgbx, 1024);
1865 ret |= build_vlc(&s->vlc[1], l_g_rgbx, 1024);
1868 case MKTAG('r', 'G', 'B', 'X'):
1869 avctx->pix_fmt = AV_PIX_FMT_GBRP10;
1870 s->decode_frame = decode_rgbxi;
1871 if (s->format != format) {
1872 ret = build_vlc(&s->vlc[0], l_r_rgbxi, 1024);
1873 ret |= build_vlc(&s->vlc[1], l_g_rgbxi, 1024);
1876 case MKTAG('A', 'R', 'G', 'B'):
1877 avctx->pix_fmt = AV_PIX_FMT_ARGB;
1878 s->decode_frame = decode_argb;
1879 if (s->format != format) {
1880 ret = build_vlc(&s->vlc[0], l_r_rgb, 256);
1881 ret |= build_vlc(&s->vlc[1], l_g_rgb, 256);
1884 case MKTAG('A', 'r', 'G', 'B'):
1885 avctx->pix_fmt = AV_PIX_FMT_ARGB;
1886 s->decode_frame = decode_argbi;
1887 if (s->format != format) {
1888 ret = build_vlc(&s->vlc[0], l_r_rgbi, 256);
1889 ret |= build_vlc(&s->vlc[1], l_g_rgbi, 256);
1892 case MKTAG('A', 'Y', 'B', 'R'):
1894 case MKTAG('A', 'Y', 'b', 'R'):
1895 avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
1896 s->decode_frame = decode_aybr;
1897 if (s->format != format) {
1898 ret = build_vlc(&s->vlc[0], l_y_ybr, 256);
1899 ret |= build_vlc(&s->vlc[1], l_u_ybr, 256);
1902 case MKTAG('A', 'y', 'B', 'R'):
1904 case MKTAG('A', 'y', 'b', 'R'):
1905 avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
1906 s->decode_frame = decode_aybri;
1907 if (s->format != format) {
1908 ret = build_vlc(&s->vlc[0], l_y_ybri, 256);
1909 ret |= build_vlc(&s->vlc[1], l_u_ybri, 256);
1912 case MKTAG(' ', 'Y', 'B', 'R'):
1914 case MKTAG(' ', 'Y', 'b', 'R'):
1915 avctx->pix_fmt = AV_PIX_FMT_YUV444P;
1916 s->decode_frame = decode_ybr;
1917 if (s->format != format) {
1918 ret = build_vlc(&s->vlc[0], l_y_ybr, 256);
1919 ret |= build_vlc(&s->vlc[1], l_u_ybr, 256);
1922 case MKTAG(' ', 'y', 'B', 'R'):
1924 case MKTAG(' ', 'y', 'b', 'R'):
1925 avctx->pix_fmt = AV_PIX_FMT_YUV444P;
1926 s->decode_frame = decode_ybri;
1927 if (s->format != format) {
1928 ret = build_vlc(&s->vlc[0], l_y_ybri, 256);
1929 ret |= build_vlc(&s->vlc[1], l_u_ybri, 256);
1932 case MKTAG('Y', 'B', 'R', 0x0a):
1933 avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
1934 s->decode_frame = decode_ybr10;
1935 if (s->format != format) {
1936 ret = build_vlc(&s->vlc[0], l_y_ybr10, 1024);
1937 ret |= build_vlc(&s->vlc[1], l_u_ybr10, 1024);
1940 case MKTAG('y', 'B', 'R', 0x0a):
1941 avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
1942 s->decode_frame = decode_ybr10i;
1943 if (s->format != format) {
1944 ret = build_vlc(&s->vlc[0], l_y_ybr10i, 1024);
1945 ret |= build_vlc(&s->vlc[1], l_u_ybr10i, 1024);
1948 case MKTAG('C', 'A', '4', 'p'):
1949 avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
1950 s->decode_frame = decode_ca4p;
1951 if (s->format != format) {
1952 ret = build_vlc(&s->vlc[0], l_y_ybr10, 1024);
1953 ret |= build_vlc(&s->vlc[1], l_u_ybr10, 1024);
1956 case MKTAG('C', 'A', '4', 'i'):
1957 avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
1958 s->decode_frame = decode_ca4i;
1959 if (s->format != format) {
1960 ret = build_vlc(&s->vlc[0], l_y_ybr10i, 1024);
1961 ret |= build_vlc(&s->vlc[1], l_u_ybr10i, 1024);
1964 case MKTAG('B', 'Y', 'R', 'Y'):
1965 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
1966 s->decode_frame = decode_byry;
1967 if (s->format != format) {
1968 ret = build_vlc(&s->vlc[0], l_y_byry, 256);
1969 ret |= build_vlc(&s->vlc[1], l_u_byry, 256);
1972 case MKTAG('B', 'Y', 'R', 'y'):
1973 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
1974 s->decode_frame = decode_byryi;
1975 if (s->format != format) {
1976 ret = build_vlc(&s->vlc[0], l_y_byryi, 256);
1977 ret |= build_vlc(&s->vlc[1], l_u_byryi, 256);
1980 case MKTAG('Y', 'b', 'Y', 'r'):
1981 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
1982 s->decode_frame = decode_ybyr;
1983 if (s->format != format) {
1984 ret = build_vlc(&s->vlc[0], l_y_ybyr, 256);
1985 ret |= build_vlc(&s->vlc[1], l_u_ybyr, 256);
1988 case MKTAG('C', '8', '2', 'p'):
1989 avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
1990 s->decode_frame = decode_c82p;
1991 if (s->format != format) {
1992 ret = build_vlc(&s->vlc[0], l_y_byry, 256);
1993 ret |= build_vlc(&s->vlc[1], l_u_byry, 256);
1996 case MKTAG('C', '8', '2', 'i'):
1997 avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
1998 s->decode_frame = decode_c82i;
1999 if (s->format != format) {
2000 ret = build_vlc(&s->vlc[0], l_y_byryi, 256);
2001 ret |= build_vlc(&s->vlc[1], l_u_byryi, 256);
2004 case MKTAG(0xa2, 'Y', 'R', 'Y'):
2005 avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
2006 s->decode_frame = decode_yry10;
2007 if (s->format != format) {
2008 ret = build_vlc(&s->vlc[0], l_y_yry10, 1024);
2009 ret |= build_vlc(&s->vlc[1], l_u_yry10, 1024);
2012 case MKTAG(0xa2, 'Y', 'R', 'y'):
2013 avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
2014 s->decode_frame = decode_yry10i;
2015 if (s->format != format) {
2016 ret = build_vlc(&s->vlc[0], l_y_yry10i, 1024);
2017 ret |= build_vlc(&s->vlc[1], l_u_yry10i, 1024);
2020 case MKTAG('C', 'A', '2', 'p'):
2021 avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
2022 s->decode_frame = decode_ca2p;
2023 if (s->format != format) {
2024 ret = build_vlc(&s->vlc[0], l_y_yry10, 1024);
2025 ret |= build_vlc(&s->vlc[1], l_u_yry10, 1024);
2028 case MKTAG('C', 'A', '2', 'i'):
2029 avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
2030 s->decode_frame = decode_ca2i;
2031 if (s->format != format) {
2032 ret = build_vlc(&s->vlc[0], l_y_yry10i, 1024);
2033 ret |= build_vlc(&s->vlc[1], l_u_yry10i, 1024);
2037 avpriv_request_sample(avctx, "unsupported format: 0x%X", format);
2038 return AVERROR_PATCHWELCOME;
2041 if (avpkt->size < 20 + avctx->width * avctx->height / 16) {
2042 av_log(avctx, AV_LOG_ERROR, "Input packet too small\n");
2043 return AVERROR_INVALIDDATA;
2046 if (s->format != format) {
2052 p->pict_type = AV_PICTURE_TYPE_I;
2055 if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
2058 if ((ret = init_get_bits8(&gb, avpkt->data + 20, avpkt->size - 20)) < 0)
2061 s->decode_frame(avctx, p, &gb);
2068 static av_cold int decode_end(AVCodecContext *avctx)
2070 SheerVideoContext *s = avctx->priv_data;
2072 ff_free_vlc(&s->vlc[0]);
2073 ff_free_vlc(&s->vlc[1]);
2078 AVCodec ff_sheervideo_decoder = {
2079 .name = "sheervideo",
2080 .long_name = NULL_IF_CONFIG_SMALL("BitJazz SheerVideo"),
2081 .type = AVMEDIA_TYPE_VIDEO,
2082 .id = AV_CODEC_ID_SHEERVIDEO,
2083 .priv_data_size = sizeof(SheerVideoContext),
2084 .close = decode_end,
2085 .decode = decode_frame,
2086 .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS,