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