1 /*
2 * 4XM codec
3 * Copyright (c) 2003 Michael Niedermayer
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 /**
23 * @file
24 * 4XM codec.
25 */
26
27 #include <inttypes.h>
28
41
42
43 #define BLOCK_TYPE_VLC_BITS 5
44 #define ACDC_VLC_BITS 9
45
46 #define CFRAME_BUFFER_COUNT 100
47
49 {
50 { // { 8, 4, 2 } x { 8, 4, 2}
51 { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
52 }, { // { 8, 4 } x 1
53 { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
54 }, { // 1 x { 8, 4 }
55 { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
56 }, { // 1 x 2, 2 x 1
57 { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
58 }
59 }, {
60 { // { 8, 4, 2 } x { 8, 4, 2}
61 { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
62 }, {// { 8, 4 } x 1
63 { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
64 }, {// 1 x { 8, 4 }
65 { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
66 }, {// 1 x 2, 2 x 1
67 { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
68 }
69 }
70 };
71
73 { -1, 3, 1, 1 },
74 { 3, 0, 0, 0 },
75 { 2, 0, 0, 0 },
76 { 2, 0, 0, 0 },
77 };
78
79 static const int8_t
mv[256][2] = {
80 { 0, 0 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 0, 1 }, { -1, -1 }, { 1, -1 }, { -1, 1 },
81 { 1, 1 }, { 0, -2 }, { -2, 0 }, { 2, 0 }, { 0, 2 }, { -1, -2 }, { 1, -2 }, { -2, -1 },
82 { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 }, { -2, -2 }, { 2, -2 }, { -2, 2 },
83 { 2, 2 }, { 0, -3 }, { -3, 0 }, { 3, 0 }, { 0, 3 }, { -1, -3 }, { 1, -3 }, { -3, -1 },
84 { 3, -1 }, { -3, 1 }, { 3, 1 }, { -1, 3 }, { 1, 3 }, { -2, -3 }, { 2, -3 }, { -3, -2 },
85 { 3, -2 }, { -3, 2 }, { 3, 2 }, { -2, 3 }, { 2, 3 }, { 0, -4 }, { -4, 0 }, { 4, 0 },
86 { 0, 4 }, { -1, -4 }, { 1, -4 }, { -4, -1 }, { 4, -1 }, { 4, 1 }, { -1, 4 }, { 1, 4 },
87 { -3, -3 }, { -3, 3 }, { 3, 3 }, { -2, -4 }, { -4, -2 }, { 4, -2 }, { -4, 2 }, { -2, 4 },
88 { 2, 4 }, { -3, -4 }, { 3, -4 }, { 4, -3 }, { -5, 0 }, { -4, 3 }, { -3, 4 }, { 3, 4 },
89 { -1, -5 }, { -5, -1 }, { -5, 1 }, { -1, 5 }, { -2, -5 }, { 2, -5 }, { 5, -2 }, { 5, 2 },
90 { -4, -4 }, { -4, 4 }, { -3, -5 }, { -5, -3 }, { -5, 3 }, { 3, 5 }, { -6, 0 }, { 0, 6 },
91 { -6, -1 }, { -6, 1 }, { 1, 6 }, { 2, -6 }, { -6, 2 }, { 2, 6 }, { -5, -4 }, { 5, 4 },
92 { 4, 5 }, { -6, -3 }, { 6, 3 }, { -7, 0 }, { -1, -7 }, { 5, -5 }, { -7, 1 }, { -1, 7 },
93 { 4, -6 }, { 6, 4 }, { -2, -7 }, { -7, 2 }, { -3, -7 }, { 7, -3 }, { 3, 7 }, { 6, -5 },
94 { 0, -8 }, { -1, -8 }, { -7, -4 }, { -8, 1 }, { 4, 7 }, { 2, -8 }, { -2, 8 }, { 6, 6 },
95 { -8, 3 }, { 5, -7 }, { -5, 7 }, { 8, -4 }, { 0, -9 }, { -9, -1 }, { 1, 9 }, { 7, -6 },
96 { -7, 6 }, { -5, -8 }, { -5, 8 }, { -9, 3 }, { 9, -4 }, { 7, -7 }, { 8, -6 }, { 6, 8 },
97 { 10, 1 }, { -10, 2 }, { 9, -5 }, { 10, -3 }, { -8, -7 }, { -10, -4 }, { 6, -9 }, { -11, 0 },
98 { 11, 1 }, { -11, -2 }, { -2, 11 }, { 7, -9 }, { -7, 9 }, { 10, 6 }, { -4, 11 }, { 8, -9 },
99 { 8, 9 }, { 5, 11 }, { 7, -10 }, { 12, -3 }, { 11, 6 }, { -9, -9 }, { 8, 10 }, { 5, 12 },
100 { -11, 7 }, { 13, 2 }, { 6, -12 }, { 10, 9 }, { -11, 8 }, { -7, 12 }, { 0, 14 }, { 14, -2 },
101 { -9, 11 }, { -6, 13 }, { -14, -4 }, { -5, -14 }, { 5, 14 }, { -15, -1 }, { -14, -6 }, { 3, -15 },
102 { 11, -11 }, { -7, 14 }, { -5, 15 }, { 8, -14 }, { 15, 6 }, { 3, 16 }, { 7, -15 }, { -16, 5 },
103 { 0, 17 }, { -16, -6 }, { -10, 14 }, { -16, 7 }, { 12, 13 }, { -16, 8 }, { -17, 6 }, { -18, 3 },
104 { -7, 17 }, { 15, 11 }, { 16, 10 }, { 2, -19 }, { 3, -19 }, { -11, -16 }, { -18, 8 }, { -19, -6 },
105 { 2, -20 }, { -17, -11 }, { -10, -18 }, { 8, 19 }, { -21, -1 }, { -20, 7 }, { -4, 21 }, { 21, 5 },
106 { 15, 16 }, { 2, -22 }, { -10, -20 }, { -22, 5 }, { 20, -11 }, { -7, -22 }, { -12, 20 }, { 23, -5 },
107 { 13, -20 }, { 24, -2 }, { -15, 19 }, { -11, 22 }, { 16, 19 }, { 23, -10 }, { -18, -18 }, { -9, -24 },
108 { 24, -10 }, { -3, 26 }, { -23, 13 }, { -18, -20 }, { 17, 21 }, { -4, 27 }, { 27, 6 }, { 1, -28 },
109 { -11, 26 }, { -17, -23 }, { 7, 28 }, { 11, -27 }, { 29, 5 }, { -23, -19 }, { -28, -11 }, { -21, 22 },
110 { -30, 7 }, { -17, 26 }, { -27, 16 }, { 13, 29 }, { 19, -26 }, { 10, -31 }, { -14, -30 }, { 20, -27 },
111 { -29, 18 }, { -16, -31 }, { -28, -22 }, { 21, -30 }, { -25, 28 }, { 26, -29 }, { 25, -32 }, { -32, -32 }
112 };
113
114 /* This is simply the scaled down elementwise product of the standard JPEG
115 * quantizer table and the AAN premul table. */
117 16, 15, 13, 19, 24, 31, 28, 17,
118 17, 23, 25, 31, 36, 63, 45, 21,
119 18, 24, 27, 37, 52, 59, 49, 20,
120 16, 28, 34, 40, 60, 80, 51, 20,
121 18, 31, 48, 66, 68, 86, 56, 21,
122 19, 38, 56, 59, 64, 64, 48, 20,
123 27, 48, 55, 55, 56, 51, 35, 15,
124 20, 35, 34, 32, 31, 22, 15, 8,
125 };
126
128
129
136
156
157
158 #define FIX_1_082392200 70936
159 #define FIX_1_414213562 92682
160 #define FIX_1_847759065 121095
161 #define FIX_2_613125930 171254
162
163 #define MULTIPLY(var, const) ((int)((var) * (unsigned)(const)) >> 16)
164
166 {
167 int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
168 int tmp10, tmp11, tmp12, tmp13;
169 int z5, z10, z11, z12, z13;
172
173 for (
i = 0;
i < 8;
i++) {
176
179
180 tmp0 = tmp10 + tmp13;
181 tmp3 = tmp10 - tmp13;
182 tmp1 = tmp11 + tmp12;
183 tmp2 = tmp11 - tmp12;
184
189
190 tmp7 = z11 + z13;
192
196
197 tmp6 = tmp12 - tmp7;
198 tmp5 = tmp11 - tmp6;
199 tmp4 = tmp10 + tmp5;
200
201 temp[8 * 0 +
i] = tmp0 + tmp7;
202 temp[8 * 7 +
i] = tmp0 - tmp7;
203 temp[8 * 1 +
i] = tmp1 + tmp6;
204 temp[8 * 6 +
i] = tmp1 - tmp6;
205 temp[8 * 2 +
i] = tmp2 + tmp5;
206 temp[8 * 5 +
i] = tmp2 - tmp5;
207 temp[8 * 4 +
i] = tmp3 + tmp4;
208 temp[8 * 3 +
i] = tmp3 - tmp4;
209 }
210
211 for (
i = 0;
i < 8 * 8;
i += 8) {
214
217
218 tmp0 = tmp10 + tmp13;
219 tmp3 = tmp10 - tmp13;
220 tmp1 = tmp11 + tmp12;
221 tmp2 = tmp11 - tmp12;
222
227
228 tmp7 = z11 + z13;
230
234
235 tmp6 = tmp12 - tmp7;
236 tmp5 = tmp11 - tmp6;
237 tmp4 = tmp10 + tmp5;
238
239 block[0 +
i] = (tmp0 + tmp7) >> 6;
240 block[7 +
i] = (tmp0 - tmp7) >> 6;
241 block[1 +
i] = (tmp1 + tmp6) >> 6;
242 block[6 +
i] = (tmp1 - tmp6) >> 6;
243 block[2 +
i] = (tmp2 + tmp5) >> 6;
244 block[5 +
i] = (tmp2 - tmp5) >> 6;
245 block[4 +
i] = (tmp3 + tmp4) >> 6;
246 block[3 +
i] = (tmp3 - tmp4) >> 6;
247 }
248 }
249
251 {
254
255 for (
i = 0;
i < 2;
i++) {
256 for (j = 0; j < 4; j++) {
263 }
264 }
265 }
266
268 {
270
271 for (
i = 0;
i < 256;
i++) {
273 f->mv[
i] =
mv[
i][0] +
mv[
i][1] * linesize / 2;
274 else
275 f->mv[
i] = (
i & 15) - 8 + ((
i >> 4) - 8) * linesize / 2;
276 }
277 }
278
279 #if HAVE_BIGENDIAN
280 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
281 { \
282 unsigned tmpval = AV_RN32(src); \
283 tmpval = (tmpval << 16) | (tmpval >> 16); \
284 tmpval = tmpval * (scale) + (dc); \
285 tmpval = (tmpval << 16) | (tmpval >> 16); \
286 AV_WN32A(dst, tmpval); \
287 }
288 #else
289 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
290 { \
291 unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
292 AV_WN32A(dst, tmpval); \
293 }
294 #endif
295
296 static inline void mcdc(uint16_t *dst,
const uint16_t *
src,
int log2w,
298 {
301
302 switch (log2w) {
303 case 0:
304 for (
i = 0;
i <
h;
i++) {
309 }
310 break;
311 case 1:
312 for (
i = 0;
i <
h;
i++) {
317 }
318 break;
319 case 2:
320 for (
i = 0;
i <
h;
i++) {
326 }
327 break;
328 case 3:
329 for (
i = 0;
i <
h;
i++) {
337 }
338 break;
339 default:
341 }
342 }
343
345 int log2w,
int log2h,
int stride)
346 {
348 uint16_t *start, *end;
350
352
355
362
363 start =
f->last_frame_buffer;
364 end = start +
stride * (
f->avctx->height -
h + 1) - (1 << log2w);
365
367 log2h--;
373 }
else if (
code == 2) {
374 log2w--;
380 }
else if (
code == 6) {
384 }
385 if (log2w) {
386 dst[0] = bytestream2_get_le16u(&
f->g2);
387 dst[1] = bytestream2_get_le16u(&
f->g2);
388 } else {
389 dst[0] = bytestream2_get_le16u(&
f->g2);
390 dst[
stride] = bytestream2_get_le16u(&
f->g2);
391 }
392 return 0;
393 }
394
398 }
399
401 src +=
f->mv[bytestream2_get_byte(&
f->g)];
402 }
else if (
code == 3 &&
f->version >= 2) {
403 return 0;
404 }
else if (
code == 4) {
405 src +=
f->mv[bytestream2_get_byte(&
f->g)];
409 }
410 dc = bytestream2_get_le16(&
f->g2);
411 }
else if (
code == 5) {
415 }
418 dc = bytestream2_get_le16(&
f->g2);
419 }
420
421 if (start >
src ||
src > end) {
424 }
425
427
428 return 0;
429 }
430
432 {
433 int x, y;
434 const int width =
f->avctx->width;
435 const int height =
f->avctx->height;
436 uint16_t *dst =
f->frame_buffer;
438 unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
439 bytestream_offset, wordstream_offset;
441
442 src =
f->last_frame_buffer;
443
444 if (
f->version > 1) {
445 extra = 20;
446 if (length < extra)
448 bitstream_size =
AV_RL32(buf + 8);
449 wordstream_size =
AV_RL32(buf + 12);
450 bytestream_size =
AV_RL32(buf + 16);
451 } else {
452 extra = 0;
453 bitstream_size =
AV_RL16(buf - 4);
454 wordstream_size =
AV_RL16(buf - 2);
455 bytestream_size =
FFMAX(length - bitstream_size - wordstream_size, 0);
456 }
457
458 if (bitstream_size > length || bitstream_size >= INT_MAX/8 ||
459 bytestream_size > length - bitstream_size ||
460 wordstream_size > length - bytestream_size - bitstream_size ||
461 extra > length - bytestream_size - bitstream_size - wordstream_size) {
462 av_log(
f->avctx,
AV_LOG_ERROR,
"lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size,
463 bitstream_size+ bytestream_size+ wordstream_size - length);
465 }
466
468 bitstream_size);
469 if (!
f->bitstream_buffer)
471 f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) (buf + extra),
472 bitstream_size / 4);
474
475 wordstream_offset = extra + bitstream_size;
476 bytestream_offset = extra + bitstream_size + wordstream_size;
478 length - wordstream_offset);
480 length - bytestream_offset);
481
483
484 for (y = 0; y <
height; y += 8) {
485 for (x = 0; x <
width; x += 8)
490 }
491
492 return 0;
493 }
494
495 /**
496 * decode block and dequantize.
497 * Note this is almost identical to MJPEG.
498 */
500 {
502
506 }
507
508 /* DC coef */
513 }
514
517
520 /* AC coefs */
522 for (;;) {
524
525 /* EOB */
527 break;
532 return 0;
533 }
534 } else {
537 } else {
540 }
544 return 0;
545 }
546
551 break;
552 }
553 }
554
555 return 0;
556 }
557
559 {
560 int16_t (*
block)[64] =
f->block;
563 uint16_t *dst =
f->frame_buffer + y *
stride + x;
564
565 for (
i = 0;
i < 4;
i++) {
566 block[
i][0] += 0x80 * 8 * 8;
568 }
569
571 for (
i = 4;
i < 6;
i++)
573 }
574
575 /* Note transform is:
576 * y = ( 1b + 4g + 2r) / 14
577 * cb = ( 3b - 2g - 1r) / 14
578 * cr = (-1b - 4g + 5r) / 14 */
579 for (y = 0; y < 8; y++) {
580 for (x = 0; x < 8; x++) {
581 int16_t *
temp =
block[(x >> 2) + 2 * (y >> 2)] +
582 2 * (x & 3) + 2 * 8 * (y & 3); // FIXME optimize
585 int cg = (
cb +
cr) >> 1;
586 int y;
587
589
591 dst[0] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
593 dst[1] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
595 dst[
stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
597 dst[1 +
stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
598 dst += 2;
599 }
600 dst += 2 *
stride - 2 * 8;
601 }
602 }
603
605 {
608
609 f->bdsp.clear_blocks(
f->block[0]);
610
611 for (
i = 0;
i < 6;
i++)
614
615 return 0;
616 }
617
619 const uint8_t * const buf,
620 int buf_size)
621 {
622 int frequency[512] = { 0 };
624 int up[512];
625 uint8_t len_tab[257];
626 int bits_tab[257];
627 int start, end;
628 const uint8_t *ptr = buf;
629 const uint8_t *ptr_end = buf + buf_size;
630 int j;
631
632 memset(up, -1, sizeof(up));
633
634 start = *ptr++;
635 end = *ptr++;
636 for (;;) {
638
639 if (ptr_end - ptr <
FFMAX(end - start + 1, 0) + 1) {
642 }
643
644 for (
i = start;
i <= end;
i++)
645 frequency[
i] = *ptr++;
646 start = *ptr++;
647 if (start == 0)
648 break;
649
650 end = *ptr++;
651 }
652 frequency[256] = 1;
653
654 while ((ptr - buf) & 3)
655 ptr++; // 4byte align
656
657 if (ptr > ptr_end) {
660 }
661
662 for (j = 257; j < 512; j++) {
663 int min_freq[2] = { 256 * 256, 256 * 256 };
664 int smallest[2] = { 0, 0 };
666 for (
i = 0;
i < j;
i++) {
667 if (frequency[
i] == 0)
668 continue;
669 if (frequency[
i] < min_freq[1]) {
670 if (frequency[
i] < min_freq[0]) {
671 min_freq[1] = min_freq[0];
672 smallest[1] = smallest[0];
673 min_freq[0] = frequency[
i];
675 } else {
676 min_freq[1] = frequency[
i];
678 }
679 }
680 }
681 if (min_freq[1] == 256 * 256)
682 break;
683
684 frequency[j] = min_freq[0] + min_freq[1];
685 flag[smallest[0]] = 0;
686 flag[smallest[1]] = 1;
687 up[smallest[0]] =
688 up[smallest[1]] = j;
689 frequency[smallest[0]] = frequency[smallest[1]] = 0;
690 }
691
692 for (j = 0; j < 257; j++) {
694
695 for (node = j; up[node] != -1; node = up[node]) {
699 // can this happen at all ?
701 "vlc length overflow\n");
702 }
703
706 }
707
710 bits_tab, 4, 4, 0))
712
713 return ptr;
714 }
715
717 {
718 int blue = 2 * (c0 & 0x001F) + (
c1 & 0x001F);
719 int green = (2 * (c0 & 0x03E0) + (
c1 & 0x03E0)) >> 5;
720 int red = 2 * (c0 >> 10) + (
c1 >> 10);
721 return red / 3 * 1024 + green / 3 * 32 + blue / 3;
722 }
723
725 {
726 int x, y, x2, y2;
727 const int width =
f->avctx->width;
728 const int height =
f->avctx->height;
730 uint16_t *dst =
f->frame_buffer;
731 const uint8_t *buf_end = buf + length;
733
734 if (length < mbs * 8) {
737 }
739
740 for (y = 0; y <
height; y += 16) {
741 for (x = 0; x <
width; x += 16) {
743 if (buf_end - buf < 8)
745 // warning following is purely guessed ...
746 color[0] = bytestream2_get_le16u(&g3);
747 color[1] = bytestream2_get_le16u(&g3);
748
749 if (
color[0] & 0x8000)
751 if (
color[1] & 0x8000)
753
756
757 bits = bytestream2_get_le32u(&g3);
758 for (y2 = 0; y2 < 16; y2++) {
759 for (x2 = 0; x2 < 16; x2++) {
760 int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
762 }
763 }
764 dst += 16;
765 }
766 dst += 16 *
width - x;
767 }
768
769 return 0;
770 }
771
773 {
775 const int width =
f->avctx->width;
776 const int height =
f->avctx->height;
777 const unsigned int bitstream_size =
AV_RL32(buf);
778 unsigned int prestream_size;
779 const uint8_t *prestream;
780
781 if (bitstream_size > (1 << 26))
783
784 if (length < bitstream_size + 12) {
787 }
788
789 prestream_size = 4 *
AV_RL32(buf + bitstream_size + 4);
790 prestream = buf + bitstream_size + 12;
791
792 if (prestream_size + bitstream_size + 12 != length
793 || prestream_size > (1 << 26)) {
795 prestream_size, bitstream_size, length);
797 }
798
800 if (!prestream) {
803 }
804
806
808
809 prestream_size = length + buf - prestream;
810
812 prestream_size);
813 if (!
f->bitstream_buffer)
815 f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) prestream,
816 prestream_size / 4);
818
819 f->last_dc = 0 * 128 * 8 * 8;
820
821 for (y = 0; y <
height; y += 16) {
822 for (x = 0; x <
width; x += 16) {
825
827 }
828 }
829
832
833 return 0;
834 }
835
838 {
839 const uint8_t *buf = avpkt->
data;
840 int buf_size = avpkt->
size;
844
845 if (buf_size < 20)
847
849
850 if (buf_size <
AV_RL32(buf + 4) + 8) {
854 }
855
857
858 if (frame_4cc ==
AV_RL32(
"cfrm")) {
859 int free_index = -1;
861 const int data_size = buf_size - 20;
863
864 if (
f->version <= 1) {
867 }
868
870 whole_size =
AV_RL32(buf + 16);
871
872 if (data_size < 0 || whole_size < 0) {
875 }
876
881
883 if (
f->cfrm[
i].id ==
id)
884 break;
885 if (
f->cfrm[
i].size == 0)
887 }
888
892 }
894
897
900 // explicit check needed as memcpy below might not catch a NULL
904 }
905
906 memcpy(cfrm->
data + cfrm->
size, buf + 20, data_size);
907 cfrm->
size += data_size;
908
909 if (cfrm->
size >= whole_size) {
912
916
919
920 cfrm->
size = cfrm->
id = 0;
922 } else
923 return buf_size;
924 } else {
925 buf = buf + 12;
927 }
928
931
932 if (frame_4cc ==
AV_RL32(
"ifr2")) {
937 }
938 }
else if (frame_4cc ==
AV_RL32(
"ifrm")) {
943 }
944 }
else if (frame_4cc ==
AV_RL32(
"pfrm") || frame_4cc ==
AV_RL32(
"pfr2")) {
949 }
950 }
else if (frame_4cc ==
AV_RL32(
"snd_")) {
952 buf_size);
953 } else {
955 buf_size);
956 }
957
959
961 (
const uint8_t*)
f->frame_buffer, avctx->
width * 2,
963 FFSWAP(uint16_t *,
f->frame_buffer,
f->last_frame_buffer);
964
965 *got_frame = 1;
966
967 emms_c();
968
969 return buf_size;
970 }
971
973 {
976
980 f->bitstream_buffer_size = 0;
983 f->cfrm[
i].allocated_size = 0;
984 }
986
987 return 0;
988 }
989
991 {
995
999 }
1003 }
1004
1008
1011 if (!
f->frame_buffer || !
f->last_frame_buffer) {
1014 }
1015
1020
1023 else
1025
1027
1028 return 0;
1029 }
1030
1042 };