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
42
43
44 #define BLOCK_TYPE_VLC_BITS 5
45 #define ACDC_VLC_BITS 9
46
47 #define CFRAME_BUFFER_COUNT 100
48
50 {
51 { // { 8, 4, 2 } x { 8, 4, 2}
52 { 0, 1 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 30, 5 }, { 31, 5 }, { 0, 0 }
53 }, { // { 8, 4 } x 1
54 { 0, 1 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
55 }, { // 1 x { 8, 4 }
56 { 0, 1 }, { 2, 2 }, { 0, 0 }, { 6, 3 }, { 14, 4 }, { 15, 4 }, { 0, 0 }
57 }, { // 1 x 2, 2 x 1
58 { 0, 1 }, { 0, 0 }, { 0, 0 }, { 2, 2 }, { 6, 3 }, { 14, 4 }, { 15, 4 }
59 }
60 }, {
61 { // { 8, 4, 2 } x { 8, 4, 2}
62 { 1, 2 }, { 4, 3 }, { 5, 3 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
63 }, {// { 8, 4 } x 1
64 { 1, 2 }, { 0, 0 }, { 2, 2 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
65 }, {// 1 x { 8, 4 }
66 { 1, 2 }, { 2, 2 }, { 0, 0 }, { 0, 2 }, { 6, 3 }, { 7, 3 }, { 0, 0 }
67 }, {// 1 x 2, 2 x 1
68 { 1, 2 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 2, 2 }, { 6, 3 }, { 7, 3 }
69 }
70 }
71 };
72
74 { -1, 3, 1, 1 },
75 { 3, 0, 0, 0 },
76 { 2, 0, 0, 0 },
77 { 2, 0, 0, 0 },
78 };
79
80 static const int8_t
mv[256][2] = {
81 { 0, 0 }, { 0, -1 }, { -1, 0 }, { 1, 0 }, { 0, 1 }, { -1, -1 }, { 1, -1 }, { -1, 1 },
82 { 1, 1 }, { 0, -2 }, { -2, 0 }, { 2, 0 }, { 0, 2 }, { -1, -2 }, { 1, -2 }, { -2, -1 },
83 { 2, -1 }, { -2, 1 }, { 2, 1 }, { -1, 2 }, { 1, 2 }, { -2, -2 }, { 2, -2 }, { -2, 2 },
84 { 2, 2 }, { 0, -3 }, { -3, 0 }, { 3, 0 }, { 0, 3 }, { -1, -3 }, { 1, -3 }, { -3, -1 },
85 { 3, -1 }, { -3, 1 }, { 3, 1 }, { -1, 3 }, { 1, 3 }, { -2, -3 }, { 2, -3 }, { -3, -2 },
86 { 3, -2 }, { -3, 2 }, { 3, 2 }, { -2, 3 }, { 2, 3 }, { 0, -4 }, { -4, 0 }, { 4, 0 },
87 { 0, 4 }, { -1, -4 }, { 1, -4 }, { -4, -1 }, { 4, -1 }, { 4, 1 }, { -1, 4 }, { 1, 4 },
88 { -3, -3 }, { -3, 3 }, { 3, 3 }, { -2, -4 }, { -4, -2 }, { 4, -2 }, { -4, 2 }, { -2, 4 },
89 { 2, 4 }, { -3, -4 }, { 3, -4 }, { 4, -3 }, { -5, 0 }, { -4, 3 }, { -3, 4 }, { 3, 4 },
90 { -1, -5 }, { -5, -1 }, { -5, 1 }, { -1, 5 }, { -2, -5 }, { 2, -5 }, { 5, -2 }, { 5, 2 },
91 { -4, -4 }, { -4, 4 }, { -3, -5 }, { -5, -3 }, { -5, 3 }, { 3, 5 }, { -6, 0 }, { 0, 6 },
92 { -6, -1 }, { -6, 1 }, { 1, 6 }, { 2, -6 }, { -6, 2 }, { 2, 6 }, { -5, -4 }, { 5, 4 },
93 { 4, 5 }, { -6, -3 }, { 6, 3 }, { -7, 0 }, { -1, -7 }, { 5, -5 }, { -7, 1 }, { -1, 7 },
94 { 4, -6 }, { 6, 4 }, { -2, -7 }, { -7, 2 }, { -3, -7 }, { 7, -3 }, { 3, 7 }, { 6, -5 },
95 { 0, -8 }, { -1, -8 }, { -7, -4 }, { -8, 1 }, { 4, 7 }, { 2, -8 }, { -2, 8 }, { 6, 6 },
96 { -8, 3 }, { 5, -7 }, { -5, 7 }, { 8, -4 }, { 0, -9 }, { -9, -1 }, { 1, 9 }, { 7, -6 },
97 { -7, 6 }, { -5, -8 }, { -5, 8 }, { -9, 3 }, { 9, -4 }, { 7, -7 }, { 8, -6 }, { 6, 8 },
98 { 10, 1 }, { -10, 2 }, { 9, -5 }, { 10, -3 }, { -8, -7 }, { -10, -4 }, { 6, -9 }, { -11, 0 },
99 { 11, 1 }, { -11, -2 }, { -2, 11 }, { 7, -9 }, { -7, 9 }, { 10, 6 }, { -4, 11 }, { 8, -9 },
100 { 8, 9 }, { 5, 11 }, { 7, -10 }, { 12, -3 }, { 11, 6 }, { -9, -9 }, { 8, 10 }, { 5, 12 },
101 { -11, 7 }, { 13, 2 }, { 6, -12 }, { 10, 9 }, { -11, 8 }, { -7, 12 }, { 0, 14 }, { 14, -2 },
102 { -9, 11 }, { -6, 13 }, { -14, -4 }, { -5, -14 }, { 5, 14 }, { -15, -1 }, { -14, -6 }, { 3, -15 },
103 { 11, -11 }, { -7, 14 }, { -5, 15 }, { 8, -14 }, { 15, 6 }, { 3, 16 }, { 7, -15 }, { -16, 5 },
104 { 0, 17 }, { -16, -6 }, { -10, 14 }, { -16, 7 }, { 12, 13 }, { -16, 8 }, { -17, 6 }, { -18, 3 },
105 { -7, 17 }, { 15, 11 }, { 16, 10 }, { 2, -19 }, { 3, -19 }, { -11, -16 }, { -18, 8 }, { -19, -6 },
106 { 2, -20 }, { -17, -11 }, { -10, -18 }, { 8, 19 }, { -21, -1 }, { -20, 7 }, { -4, 21 }, { 21, 5 },
107 { 15, 16 }, { 2, -22 }, { -10, -20 }, { -22, 5 }, { 20, -11 }, { -7, -22 }, { -12, 20 }, { 23, -5 },
108 { 13, -20 }, { 24, -2 }, { -15, 19 }, { -11, 22 }, { 16, 19 }, { 23, -10 }, { -18, -18 }, { -9, -24 },
109 { 24, -10 }, { -3, 26 }, { -23, 13 }, { -18, -20 }, { 17, 21 }, { -4, 27 }, { 27, 6 }, { 1, -28 },
110 { -11, 26 }, { -17, -23 }, { 7, 28 }, { 11, -27 }, { 29, 5 }, { -23, -19 }, { -28, -11 }, { -21, 22 },
111 { -30, 7 }, { -17, 26 }, { -27, 16 }, { 13, 29 }, { 19, -26 }, { 10, -31 }, { -14, -30 }, { 20, -27 },
112 { -29, 18 }, { -16, -31 }, { -28, -22 }, { 21, -30 }, { -25, 28 }, { 26, -29 }, { 25, -32 }, { -32, -32 }
113 };
114
115 /* This is simply the scaled down elementwise product of the standard JPEG
116 * quantizer table and the AAN premul table. */
118 16, 15, 13, 19, 24, 31, 28, 17,
119 17, 23, 25, 31, 36, 63, 45, 21,
120 18, 24, 27, 37, 52, 59, 49, 20,
121 16, 28, 34, 40, 60, 80, 51, 20,
122 18, 31, 48, 66, 68, 86, 56, 21,
123 19, 38, 56, 59, 64, 64, 48, 20,
124 27, 48, 55, 55, 56, 51, 35, 15,
125 20, 35, 34, 32, 31, 22, 15, 8,
126 };
127
129
130
137
157
158
159 #define FIX_1_082392200 70936
160 #define FIX_1_414213562 92682
161 #define FIX_1_847759065 121095
162 #define FIX_2_613125930 171254
163
164 #define MULTIPLY(var, const) ((int)((var) * (unsigned)(const)) >> 16)
165
167 {
168 int tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
169 int tmp10, tmp11, tmp12, tmp13;
170 int z5, z10, z11, z12, z13;
173
174 for (
i = 0;
i < 8;
i++) {
177
180
181 tmp0 = tmp10 + tmp13;
182 tmp3 = tmp10 - tmp13;
183 tmp1 = tmp11 + tmp12;
184 tmp2 = tmp11 - tmp12;
185
190
191 tmp7 = z11 + z13;
193
197
198 tmp6 = tmp12 - tmp7;
199 tmp5 = tmp11 - tmp6;
200 tmp4 = tmp10 + tmp5;
201
202 temp[8 * 0 +
i] = tmp0 + tmp7;
203 temp[8 * 7 +
i] = tmp0 - tmp7;
204 temp[8 * 1 +
i] = tmp1 + tmp6;
205 temp[8 * 6 +
i] = tmp1 - tmp6;
206 temp[8 * 2 +
i] = tmp2 + tmp5;
207 temp[8 * 5 +
i] = tmp2 - tmp5;
208 temp[8 * 4 +
i] = tmp3 + tmp4;
209 temp[8 * 3 +
i] = tmp3 - tmp4;
210 }
211
212 for (
i = 0;
i < 8 * 8;
i += 8) {
215
218
219 tmp0 = tmp10 + tmp13;
220 tmp3 = tmp10 - tmp13;
221 tmp1 = tmp11 + tmp12;
222 tmp2 = tmp11 - tmp12;
223
228
229 tmp7 = z11 + z13;
231
235
236 tmp6 = tmp12 - tmp7;
237 tmp5 = tmp11 - tmp6;
238 tmp4 = tmp10 + tmp5;
239
240 block[0 +
i] = (tmp0 + tmp7) >> 6;
241 block[7 +
i] = (tmp0 - tmp7) >> 6;
242 block[1 +
i] = (tmp1 + tmp6) >> 6;
243 block[6 +
i] = (tmp1 - tmp6) >> 6;
244 block[2 +
i] = (tmp2 + tmp5) >> 6;
245 block[5 +
i] = (tmp2 - tmp5) >> 6;
246 block[4 +
i] = (tmp3 + tmp4) >> 6;
247 block[3 +
i] = (tmp3 - tmp4) >> 6;
248 }
249 }
250
252 {
255
256 for (
i = 0;
i < 2;
i++) {
257 for (j = 0; j < 4; j++) {
264 }
265 }
266 }
267
269 {
271
272 for (
i = 0;
i < 256;
i++) {
274 f->mv[
i] =
mv[
i][0] +
mv[
i][1] * linesize / 2;
275 else
276 f->mv[
i] = (
i & 15) - 8 + ((
i >> 4) - 8) * linesize / 2;
277 }
278 }
279
280 #if HAVE_BIGENDIAN
281 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
282 { \
283 unsigned tmpval = AV_RN32(src); \
284 tmpval = (tmpval << 16) | (tmpval >> 16); \
285 tmpval = tmpval * (scale) + (dc); \
286 tmpval = (tmpval << 16) | (tmpval >> 16); \
287 AV_WN32A(dst, tmpval); \
288 }
289 #else
290 #define LE_CENTRIC_MUL(dst, src, scale, dc) \
291 { \
292 unsigned tmpval = AV_RN32(src) * (scale) + (dc); \
293 AV_WN32A(dst, tmpval); \
294 }
295 #endif
296
297 static inline void mcdc(uint16_t *dst,
const uint16_t *
src,
int log2w,
299 {
302
303 switch (log2w) {
304 case 0:
305 for (
i = 0;
i <
h;
i++) {
310 }
311 break;
312 case 1:
313 for (
i = 0;
i <
h;
i++) {
318 }
319 break;
320 case 2:
321 for (
i = 0;
i <
h;
i++) {
327 }
328 break;
329 case 3:
330 for (
i = 0;
i <
h;
i++) {
338 }
339 break;
340 default:
342 }
343 }
344
346 int log2w,
int log2h,
int stride)
347 {
349 uint16_t *start, *end;
351
353
356
363
364 start =
f->last_frame_buffer;
365 end = start +
stride * (
f->avctx->height -
h + 1) - (1 << log2w);
366
368 log2h--;
374 }
else if (
code == 2) {
375 log2w--;
381 }
else if (
code == 6) {
385 }
386 if (log2w) {
387 dst[0] = bytestream2_get_le16u(&
f->g2);
388 dst[1] = bytestream2_get_le16u(&
f->g2);
389 } else {
390 dst[0] = bytestream2_get_le16u(&
f->g2);
391 dst[
stride] = bytestream2_get_le16u(&
f->g2);
392 }
393 return 0;
394 }
395
399 }
400
402 src +=
f->mv[bytestream2_get_byte(&
f->g)];
403 }
else if (
code == 3 &&
f->version >= 2) {
404 return 0;
405 }
else if (
code == 4) {
406 src +=
f->mv[bytestream2_get_byte(&
f->g)];
410 }
411 dc = bytestream2_get_le16(&
f->g2);
412 }
else if (
code == 5) {
416 }
419 dc = bytestream2_get_le16(&
f->g2);
420 }
421
422 if (start >
src ||
src > end) {
425 }
426
428
429 return 0;
430 }
431
433 {
434 int x, y;
435 const int width =
f->avctx->width;
436 const int height =
f->avctx->height;
437 uint16_t *dst =
f->frame_buffer;
439 unsigned int bitstream_size, bytestream_size, wordstream_size, extra,
440 bytestream_offset, wordstream_offset;
442
443 src =
f->last_frame_buffer;
444
445 if (
f->version > 1) {
446 extra = 20;
447 if (length < extra)
449 bitstream_size =
AV_RL32(buf + 8);
450 wordstream_size =
AV_RL32(buf + 12);
451 bytestream_size =
AV_RL32(buf + 16);
452 } else {
453 extra = 0;
454 bitstream_size =
AV_RL16(buf - 4);
455 wordstream_size =
AV_RL16(buf - 2);
456 bytestream_size =
FFMAX(length - bitstream_size - wordstream_size, 0);
457 }
458
459 if (bitstream_size > length || bitstream_size >= INT_MAX/8 ||
460 bytestream_size > length - bitstream_size ||
461 wordstream_size > length - bytestream_size - bitstream_size ||
462 extra > length - bytestream_size - bitstream_size - wordstream_size) {
463 av_log(
f->avctx,
AV_LOG_ERROR,
"lengths %d %d %d %d\n", bitstream_size, bytestream_size, wordstream_size,
464 bitstream_size+ bytestream_size+ wordstream_size - length);
466 }
467
469 bitstream_size);
470 if (!
f->bitstream_buffer)
472 f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) (buf + extra),
473 bitstream_size / 4);
475
476 wordstream_offset = extra + bitstream_size;
477 bytestream_offset = extra + bitstream_size + wordstream_size;
479 length - wordstream_offset);
481 length - bytestream_offset);
482
484
485 for (y = 0; y <
height; y += 8) {
486 for (x = 0; x <
width; x += 8)
491 }
492
493 return 0;
494 }
495
496 /**
497 * decode block and dequantize.
498 * Note this is almost identical to MJPEG.
499 */
501 {
503
507 }
508
509 /* DC coef */
514 }
515
518
521 /* AC coefs */
523 for (;;) {
525
526 /* EOB */
528 break;
533 return 0;
534 }
535 } else {
538 } else {
541 }
545 return 0;
546 }
547
552 break;
553 }
554 }
555
556 return 0;
557 }
558
560 {
561 int16_t (*
block)[64] =
f->block;
564 uint16_t *dst =
f->frame_buffer + y *
stride + x;
565
566 for (
i = 0;
i < 4;
i++) {
567 block[
i][0] += 0x80 * 8 * 8;
569 }
570
572 for (
i = 4;
i < 6;
i++)
574 }
575
576 /* Note transform is:
577 * y = ( 1b + 4g + 2r) / 14
578 * cb = ( 3b - 2g - 1r) / 14
579 * cr = (-1b - 4g + 5r) / 14 */
580 for (y = 0; y < 8; y++) {
581 for (x = 0; x < 8; x++) {
582 int16_t *
temp =
block[(x >> 2) + 2 * (y >> 2)] +
583 2 * (x & 3) + 2 * 8 * (y & 3); // FIXME optimize
586 int cg = (
cb +
cr) >> 1;
587 int y;
588
590
592 dst[0] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
594 dst[1] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
596 dst[
stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
598 dst[1 +
stride] = ((y +
cb) >> 3) + (((y - cg) & 0xFC) << 3) + (((y +
cr) & 0xF8) << 8);
599 dst += 2;
600 }
601 dst += 2 *
stride - 2 * 8;
602 }
603 }
604
606 {
609
610 f->bdsp.clear_blocks(
f->block[0]);
611
612 for (
i = 0;
i < 6;
i++)
615
616 return 0;
617 }
618
620 const uint8_t * const buf,
621 int buf_size)
622 {
623 int frequency[512] = { 0 };
625 int up[512];
626 uint8_t len_tab[257];
627 int bits_tab[257];
628 int start, end;
629 const uint8_t *ptr = buf;
630 const uint8_t *ptr_end = buf + buf_size;
631 int j;
632
633 memset(up, -1, sizeof(up));
634
635 start = *ptr++;
636 end = *ptr++;
637 for (;;) {
639
640 if (ptr_end - ptr <
FFMAX(end - start + 1, 0) + 1) {
643 }
644
645 for (
i = start;
i <= end;
i++)
646 frequency[
i] = *ptr++;
647 start = *ptr++;
648 if (start == 0)
649 break;
650
651 end = *ptr++;
652 }
653 frequency[256] = 1;
654
655 while ((ptr - buf) & 3)
656 ptr++; // 4byte align
657
658 if (ptr > ptr_end) {
661 }
662
663 for (j = 257; j < 512; j++) {
664 int min_freq[2] = { 256 * 256, 256 * 256 };
665 int smallest[2] = { 0, 0 };
667 for (
i = 0;
i < j;
i++) {
668 if (frequency[
i] == 0)
669 continue;
670 if (frequency[
i] < min_freq[1]) {
671 if (frequency[
i] < min_freq[0]) {
672 min_freq[1] = min_freq[0];
673 smallest[1] = smallest[0];
674 min_freq[0] = frequency[
i];
676 } else {
677 min_freq[1] = frequency[
i];
679 }
680 }
681 }
682 if (min_freq[1] == 256 * 256)
683 break;
684
685 frequency[j] = min_freq[0] + min_freq[1];
686 flag[smallest[0]] = 0;
687 flag[smallest[1]] = 1;
688 up[smallest[0]] =
689 up[smallest[1]] = j;
690 frequency[smallest[0]] = frequency[smallest[1]] = 0;
691 }
692
693 for (j = 0; j < 257; j++) {
695
696 for (node = j; up[node] != -1; node = up[node]) {
700 // can this happen at all ?
702 "vlc length overflow\n");
703 }
704
707 }
708
711 bits_tab, 4, 4, 0))
713
714 return ptr;
715 }
716
718 {
719 int blue = 2 * (c0 & 0x001F) + (
c1 & 0x001F);
720 int green = (2 * (c0 & 0x03E0) + (
c1 & 0x03E0)) >> 5;
721 int red = 2 * (c0 >> 10) + (
c1 >> 10);
722 return red / 3 * 1024 + green / 3 * 32 + blue / 3;
723 }
724
726 {
727 int x, y, x2, y2;
728 const int width =
f->avctx->width;
729 const int height =
f->avctx->height;
731 uint16_t *dst =
f->frame_buffer;
732 const uint8_t *buf_end = buf + length;
734
735 if (length < mbs * 8) {
738 }
740
741 for (y = 0; y <
height; y += 16) {
742 for (x = 0; x <
width; x += 16) {
744 if (buf_end - buf < 8)
746 // warning following is purely guessed ...
747 color[0] = bytestream2_get_le16u(&g3);
748 color[1] = bytestream2_get_le16u(&g3);
749
750 if (
color[0] & 0x8000)
752 if (
color[1] & 0x8000)
754
757
758 bits = bytestream2_get_le32u(&g3);
759 for (y2 = 0; y2 < 16; y2++) {
760 for (x2 = 0; x2 < 16; x2++) {
761 int index = 2 * (x2 >> 2) + 8 * (y2 >> 2);
763 }
764 }
765 dst += 16;
766 }
767 dst += 16 *
width - x;
768 }
769
770 return 0;
771 }
772
774 {
776 const int width =
f->avctx->width;
777 const int height =
f->avctx->height;
778 const unsigned int bitstream_size =
AV_RL32(buf);
779 unsigned int prestream_size;
780 const uint8_t *prestream;
781
782 if (bitstream_size > (1 << 26))
784
785 if (length < bitstream_size + 12) {
788 }
789
790 prestream_size = 4 *
AV_RL32(buf + bitstream_size + 4);
791 prestream = buf + bitstream_size + 12;
792
793 if (prestream_size + bitstream_size + 12 != length
794 || prestream_size > (1 << 26)) {
796 prestream_size, bitstream_size, length);
798 }
799
801 if (!prestream) {
804 }
805
807
809
810 prestream_size = length + buf - prestream;
811
813 prestream_size);
814 if (!
f->bitstream_buffer)
816 f->bbdsp.bswap_buf(
f->bitstream_buffer, (
const uint32_t *) prestream,
817 prestream_size / 4);
819
820 f->last_dc = 0 * 128 * 8 * 8;
821
822 for (y = 0; y <
height; y += 16) {
823 for (x = 0; x <
width; x += 16) {
826
828 }
829 }
830
833
834 return 0;
835 }
836
839 {
840 const uint8_t *buf = avpkt->
data;
841 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);
954 } else {
956 buf_size);
958 }
959
961
963 (
const uint8_t*)
f->frame_buffer, avctx->
width * 2,
965 FFSWAP(uint16_t *,
f->frame_buffer,
f->last_frame_buffer);
966
967 *got_frame = 1;
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)
1013
1018
1021 else
1023
1025
1026 return 0;
1027 }
1028
1040 };