annotate mimic.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 8a4984c5cacc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
1 /*
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
2 * Copyright (C) 2005 Ole André Vadla Ravnås <oleavr@gmail.com>
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
3 * Copyright (C) 2008 Ramiro Polla <ramiro@lisha.ufsc.br>
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
4 *
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
5 * This file is part of FFmpeg.
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
6 *
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
11 *
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
15 * Lesser General Public License for more details.
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
16 *
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
20 */
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
21
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
22 #include <stdlib.h>
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
23 #include <string.h>
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
24 #include <stdint.h>
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
25
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
26 #include "avcodec.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9415
diff changeset
27 #include "get_bits.h"
6666
1c76797e2216 Use bytestream functions for reading frame header.
ramiro
parents: 6654
diff changeset
28 #include "bytestream.h"
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
29 #include "dsputil.h"
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
30
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
31 #define MIMIC_HEADER_SIZE 20
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
32
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
33 typedef struct {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
34 AVCodecContext *avctx;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
35
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
36 int num_vblocks[3];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
37 int num_hblocks[3];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
38
9414
5a738e8f9524 Use void * instead of uint8_t * for the destination buffer for dsp.bswap_buf
reimar
parents: 9413
diff changeset
39 void *swap_buf;
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
40 int swap_buf_size;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
41
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
42 int cur_index;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
43 int prev_index;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
44
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
45 AVFrame buf_ptrs [16];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
46 AVPicture flipped_ptrs[16];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
47
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 10961
diff changeset
48 DECLARE_ALIGNED(16, DCTELEM, dct_block)[64];
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
49
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
50 GetBitContext gb;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
51 ScanTable scantable;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
52 DSPContext dsp;
6652
1aa282868038 Rename vlc1 to vlc.
ramiro
parents: 6517
diff changeset
53 VLC vlc;
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
54 } MimicContext;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
55
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
56 static const uint32_t huffcodes[] = {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
57 0x0000000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
58 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
59 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000b,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
60 0x0000001b, 0x00000038, 0x00000078, 0x00000079, 0x0000007a, 0x000000f9,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
61 0x000000fa, 0x000003fb, 0x000007f8, 0x000007f9, 0x000007fa, 0x000007fb,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
62 0x00000ff8, 0x00000ff9, 0x00000001, 0x00000039, 0x0000007b, 0x000000fb,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
63 0x000001f8, 0x000001f9, 0x00000ffa, 0x00000ffb, 0x00001ff8, 0x00001ff9,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
64 0x00001ffa, 0x00001ffb, 0x00003ff8, 0x00003ff9, 0x00003ffa, 0x00000000,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
65 0x00000004, 0x0000003a, 0x000001fa, 0x00003ffb, 0x00007ff8, 0x00007ff9,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
66 0x00007ffa, 0x00007ffb, 0x0000fff8, 0x0000fff9, 0x0000fffa, 0x0000fffb,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
67 0x0001fff8, 0x0001fff9, 0x0001fffa, 0x00000000, 0x0000000c, 0x000000f8,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
68 0x000001fb, 0x0001fffb, 0x0003fff8, 0x0003fff9, 0x0003fffa, 0x0003fffb,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
69 0x0007fff8, 0x0007fff9, 0x0007fffa, 0x0007fffb, 0x000ffff8, 0x000ffff9,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
70 0x000ffffa, 0x00000000, 0x0000001a, 0x000003f8, 0x000ffffb, 0x001ffff8,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
71 0x001ffff9, 0x001ffffa, 0x001ffffb, 0x003ffff8, 0x003ffff9, 0x003ffffa,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
72 0x003ffffb, 0x007ffff8, 0x007ffff9, 0x007ffffa, 0x007ffffb, 0x00000000,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
73 0x0000003b, 0x000003f9, 0x00fffff8, 0x00fffff9, 0x00fffffa, 0x00fffffb,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
74 0x01fffff8, 0x01fffff9, 0x01fffffa, 0x01fffffb, 0x03fffff8, 0x03fffff9,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
75 0x03fffffa, 0x03fffffb, 0x07fffff8, 0x00000000, 0x000003fa, 0x07fffff9,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
76 0x07fffffa, 0x07fffffb, 0x0ffffff8, 0x0ffffff9, 0x0ffffffa, 0x0ffffffb,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
77 0x1ffffff8, 0x1ffffff9, 0x1ffffffa, 0x1ffffffb, 0x3ffffff8, 0x3ffffff9,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
78 0x3ffffffa,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
79 };
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
80
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
81 static const uint8_t huffbits[] = {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
82 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
83 0, 0, 0, 0, 2, 4, 5, 6, 7, 7, 7, 8,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
84 8, 10, 11, 11, 11, 11, 12, 12, 2, 6, 7, 8,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
85 9, 9, 12, 12, 13, 13, 13, 13, 14, 14, 14, 0,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
86 3, 6, 9, 14, 15, 15, 15, 15, 16, 16, 16, 16,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
87 17, 17, 17, 0, 4, 8, 9, 17, 18, 18, 18, 18,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
88 19, 19, 19, 19, 20, 20, 20, 0, 5, 10, 20, 21,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
89 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 0,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
90 6, 10, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
91 26, 26, 27, 0, 10, 27, 27, 27, 28, 28, 28, 28,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
92 29, 29, 29, 29, 30, 30, 30,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
93 };
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
94
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
95 static const uint8_t col_zag[64] = {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
96 0, 8, 1, 2, 9, 16, 24, 17,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
97 10, 3, 4, 11, 18, 25, 32, 40,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
98 33, 26, 19, 12, 5, 6, 13, 20,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
99 27, 34, 41, 48, 56, 49, 42, 35,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
100 28, 21, 14, 7, 15, 22, 29, 36,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
101 43, 50, 57, 58, 51, 44, 37, 30,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
102 23, 31, 38, 45, 52, 59, 39, 46,
6653
4421d9c976d0 Cosmetics and style.
ramiro
parents: 6652
diff changeset
103 53, 60, 61, 54, 47, 55, 62, 63,
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
104 };
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
105
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6508
diff changeset
106 static av_cold int mimic_decode_init(AVCodecContext *avctx)
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
107 {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
108 MimicContext *ctx = avctx->priv_data;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
109
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
110 ctx->prev_index = 0;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
111 ctx->cur_index = 15;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
112
8042
e70975d5ff80 uses FF_ARRAY_ELEMS() where appropriate
aurel
parents: 7040
diff changeset
113 if(init_vlc(&ctx->vlc, 11, FF_ARRAY_ELEMS(huffbits),
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
114 huffbits, 1, 1, huffcodes, 4, 4, 0)) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
115 av_log(avctx, AV_LOG_ERROR, "error initializing vlc table\n");
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
116 return -1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
117 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
118 dsputil_init(&ctx->dsp, avctx);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
119 ff_init_scantable(ctx->dsp.idct_permutation, &ctx->scantable, col_zag);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
120
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
121 return 0;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
122 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
123
8954
409d20e15da8 cosmetics: 'const static' --> 'static const' to avoid warnings of the type
diego
parents: 8288
diff changeset
124 static const int8_t vlcdec_lookup[9][64] = {
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
125 { 0, },
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
126 { -1, 1, },
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
127 { -3, 3, -2, 2, },
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
128 { -7, 7, -6, 6, -5, 5, -4, 4, },
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
129 { -15, 15, -14, 14, -13, 13, -12, 12,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
130 -11, 11, -10, 10, -9, 9, -8, 8, },
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
131 { -31, 31, -30, 30, -29, 29, -28, 28,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
132 -27, 27, -26, 26, -25, 25, -24, 24,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
133 -23, 23, -22, 22, -21, 21, -20, 20,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
134 -19, 19, -18, 18, -17, 17, -16, 16, },
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
135 { -63, 63, -62, 62, -61, 61, -60, 60,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
136 -59, 59, -58, 58, -57, 57, -56, 56,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
137 -55, 55, -54, 54, -53, 53, -52, 52,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
138 -51, 51, -50, 50, -49, 49, -48, 48,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
139 -47, 47, -46, 46, -45, 45, -44, 44,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
140 -43, 43, -42, 42, -41, 41, -40, 40,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
141 -39, 39, -38, 38, -37, 37, -36, 36,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
142 -35, 35, -34, 34, -33, 33, -32, 32, },
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
143 { -127, 127, -126, 126, -125, 125, -124, 124,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
144 -123, 123, -122, 122, -121, 121, -120, 120,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
145 -119, 119, -118, 118, -117, 117, -116, 116,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
146 -115, 115, -114, 114, -113, 113, -112, 112,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
147 -111, 111, -110, 110, -109, 109, -108, 108,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
148 -107, 107, -106, 106, -105, 105, -104, 104,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
149 -103, 103, -102, 102, -101, 101, -100, 100,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
150 -99, 99, -98, 98, -97, 97, -96, 96, },
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
151 { -95, 95, -94, 94, -93, 93, -92, 92,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
152 -91, 91, -90, 90, -89, 89, -88, 88,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
153 -87, 87, -86, 86, -85, 85, -84, 84,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
154 -83, 83, -82, 82, -81, 81, -80, 80,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
155 -79, 79, -78, 78, -77, 77, -76, 76,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
156 -75, 75, -74, 74, -73, 73, -72, 72,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
157 -71, 71, -70, 70, -69, 69, -68, 68,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
158 -67, 67, -66, 66, -65, 65, -64, 64, },
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
159 };
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
160
6654
603c780be9ff Do not pass dct_block to vlc_decode_block().
ramiro
parents: 6653
diff changeset
161 static int vlc_decode_block(MimicContext *ctx, int num_coeffs, int qscale)
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
162 {
6654
603c780be9ff Do not pass dct_block to vlc_decode_block().
ramiro
parents: 6653
diff changeset
163 DCTELEM *block = ctx->dct_block;
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
164 unsigned int pos;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
165
8288
800444234375 clear_block mmx
lorenm
parents: 8042
diff changeset
166 ctx->dsp.clear_block(block);
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
167
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
168 block[0] = get_bits(&ctx->gb, 8) << 3;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
169
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
170 for(pos = 1; pos < num_coeffs; pos++) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
171 uint32_t vlc, num_bits;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
172 int value;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
173 int coeff;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
174
6684
0b8ef15fa20e get_vlc2() only gets up to three levels in the tables. The last codes weren't being read properly.
ramiro
parents: 6668
diff changeset
175 vlc = get_vlc2(&ctx->gb, ctx->vlc.table, ctx->vlc.bits, 3);
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
176 if(!vlc) /* end-of-block code */
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
177 return 1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
178 if(vlc == -1)
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
179 return 0;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
180
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
181 /* pos_add and num_bits are coded in the vlc code */
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
182 pos += vlc&15; // pos_add
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
183 num_bits = vlc>>4; // num_bits
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
184
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
185 if(pos >= 64)
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
186 return 0;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
187
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
188 value = get_bits(&ctx->gb, num_bits);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
189
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
190 /* FFmpeg's IDCT behaves somewhat different from the original code, so
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
191 * a factor of 4 was added to the input */
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
192
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
193 coeff = vlcdec_lookup[num_bits][value];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
194 if(pos<3)
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
195 coeff <<= 4;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
196 else /* TODO Use >> 10 instead of / 1001 */
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
197 coeff = (coeff * qscale) / 1001;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
198
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
199 block[ctx->scantable.permutated[pos]] = coeff;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
200 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
201
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
202 return 1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
203 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
204
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
205 static int decode(MimicContext *ctx, int quality, int num_coeffs,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
206 int is_iframe)
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
207 {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
208 int y, x, plane;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
209
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
210 for(plane = 0; plane < 3; plane++) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
211 const int is_chroma = !!plane;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
212 const int qscale = av_clip(10000-quality,is_chroma?1000:2000,10000)<<2;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
213 const int stride = ctx->flipped_ptrs[ctx->cur_index].linesize[plane];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
214 const uint8_t *src = ctx->flipped_ptrs[ctx->prev_index].data[plane];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
215 uint8_t *dst = ctx->flipped_ptrs[ctx->cur_index ].data[plane];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
216
6653
4421d9c976d0 Cosmetics and style.
ramiro
parents: 6652
diff changeset
217 for(y = 0; y < ctx->num_vblocks[plane]; y++) {
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
218 for(x = 0; x < ctx->num_hblocks[plane]; x++) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
219
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
220 /* Check for a change condition in the current block.
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
221 * - iframes always change.
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
222 * - Luma plane changes on get_bits1 == 0
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
223 * - Chroma planes change on get_bits1 == 1 */
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
224 if(is_iframe || get_bits1(&ctx->gb) == is_chroma) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
225
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
226 /* Luma planes may use a backreference from the 15 last
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
227 * frames preceding the previous. (get_bits1 == 1)
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
228 * Chroma planes don't use backreferences. */
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
229 if(is_chroma || is_iframe || !get_bits1(&ctx->gb)) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
230
6654
603c780be9ff Do not pass dct_block to vlc_decode_block().
ramiro
parents: 6653
diff changeset
231 if(!vlc_decode_block(ctx, num_coeffs, qscale))
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
232 return 0;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
233 ctx->dsp.idct_put(dst, stride, ctx->dct_block);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
234 } else {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
235 unsigned int backref = get_bits(&ctx->gb, 4);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
236 int index = (ctx->cur_index+backref)&15;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
237 uint8_t *p = ctx->flipped_ptrs[index].data[0];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
238
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
239 if(p) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
240 p += src -
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
241 ctx->flipped_ptrs[ctx->prev_index].data[plane];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
242 ctx->dsp.put_pixels_tab[1][0](dst, p, stride, 8);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
243 } else {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
244 av_log(ctx->avctx, AV_LOG_ERROR,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
245 "No such backreference! Buggy sample.\n");
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
246 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
247 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
248 } else {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
249 ctx->dsp.put_pixels_tab[1][0](dst, src, stride, 8);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
250 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
251 src += 8;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
252 dst += 8;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
253 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
254 src += (stride - ctx->num_hblocks[plane])<<3;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
255 dst += (stride - ctx->num_hblocks[plane])<<3;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
256 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
257 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
258
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
259 return 1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
260 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
261
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
262 /**
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
263 * Flip the buffer upside-down and put it in the YVU order to match the
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
264 * way Mimic encodes frames.
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
265 */
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
266 static void prepare_avpic(MimicContext *ctx, AVPicture *dst, AVPicture *src)
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
267 {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
268 int i;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
269 dst->data[0] = src->data[0]+( ctx->avctx->height -1)*src->linesize[0];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
270 dst->data[1] = src->data[2]+((ctx->avctx->height>>1)-1)*src->linesize[2];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
271 dst->data[2] = src->data[1]+((ctx->avctx->height>>1)-1)*src->linesize[1];
6653
4421d9c976d0 Cosmetics and style.
ramiro
parents: 6652
diff changeset
272 for(i = 0; i < 3; i++)
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
273 dst->linesize[i] = -src->linesize[i];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
274 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
275
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
276 static int mimic_decode_frame(AVCodecContext *avctx, void *data,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8954
diff changeset
277 int *data_size, AVPacket *avpkt)
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
278 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8954
diff changeset
279 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8954
diff changeset
280 int buf_size = avpkt->size;
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
281 MimicContext *ctx = avctx->priv_data;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
282 int is_pframe;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
283 int width, height;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
284 int quality, num_coeffs;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
285 int swap_buf_size = buf_size - MIMIC_HEADER_SIZE;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
286
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
287 if(buf_size < MIMIC_HEADER_SIZE) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
288 av_log(avctx, AV_LOG_ERROR, "insufficient data\n");
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
289 return -1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
290 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
291
6667
4a5c7112e35c The code now is pretty self explanatory about the header structure.
ramiro
parents: 6666
diff changeset
292 buf += 2; /* some constant (always 256) */
6666
1c76797e2216 Use bytestream functions for reading frame header.
ramiro
parents: 6654
diff changeset
293 quality = bytestream_get_le16(&buf);
1c76797e2216 Use bytestream functions for reading frame header.
ramiro
parents: 6654
diff changeset
294 width = bytestream_get_le16(&buf);
1c76797e2216 Use bytestream functions for reading frame header.
ramiro
parents: 6654
diff changeset
295 height = bytestream_get_le16(&buf);
6667
4a5c7112e35c The code now is pretty self explanatory about the header structure.
ramiro
parents: 6666
diff changeset
296 buf += 4; /* some constant */
6666
1c76797e2216 Use bytestream functions for reading frame header.
ramiro
parents: 6654
diff changeset
297 is_pframe = bytestream_get_le32(&buf);
6668
28af02d712cf Fix regression introduced by r12929.
ramiro
parents: 6667
diff changeset
298 num_coeffs = bytestream_get_byte(&buf);
28af02d712cf Fix regression introduced by r12929.
ramiro
parents: 6667
diff changeset
299 buf += 3; /* some constant */
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
300
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
301 if(!ctx->avctx) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
302 int i;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
303
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
304 if(!(width == 160 && height == 120) &&
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
305 !(width == 320 && height == 240)) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
306 av_log(avctx, AV_LOG_ERROR, "invalid width/height!\n");
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
307 return -1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
308 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
309
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
310 ctx->avctx = avctx;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
311 avctx->width = width;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
312 avctx->height = height;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
313 avctx->pix_fmt = PIX_FMT_YUV420P;
6653
4421d9c976d0 Cosmetics and style.
ramiro
parents: 6652
diff changeset
314 for(i = 0; i < 3; i++) {
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
315 ctx->num_vblocks[i] = -((-height) >> (3 + !!i));
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
316 ctx->num_hblocks[i] = width >> (3 + !!i) ;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
317 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
318 } else if(width != ctx->avctx->width || height != ctx->avctx->height) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
319 av_log(avctx, AV_LOG_ERROR, "resolution changing is not supported\n");
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
320 return -1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
321 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
322
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
323 if(is_pframe && !ctx->buf_ptrs[ctx->prev_index].data[0]) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
324 av_log(avctx, AV_LOG_ERROR, "decoding must start with keyframe\n");
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
325 return -1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
326 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
327
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
328 ctx->buf_ptrs[ctx->cur_index].reference = 1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
329 if(avctx->get_buffer(avctx, &ctx->buf_ptrs[ctx->cur_index])) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
330 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
331 return -1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
332 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
333
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
334 prepare_avpic(ctx, &ctx->flipped_ptrs[ctx->cur_index],
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
335 (AVPicture*) &ctx->buf_ptrs[ctx->cur_index]);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
336
9415
141badec76fc Add a av_fast_malloc function and replace several uses of av_fast_realloc,
reimar
parents: 9414
diff changeset
337 av_fast_malloc(&ctx->swap_buf, &ctx->swap_buf_size,
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
338 swap_buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
339 if(!ctx->swap_buf)
9413
1eafaea58613 Use AVERROR(ENOMEM) instead of AVERROR_NOMEM / -1 in eatqi and mimic decoders
reimar
parents: 9355
diff changeset
340 return AVERROR(ENOMEM);
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
341
9414
5a738e8f9524 Use void * instead of uint8_t * for the destination buffer for dsp.bswap_buf
reimar
parents: 9413
diff changeset
342 ctx->dsp.bswap_buf(ctx->swap_buf,
6666
1c76797e2216 Use bytestream functions for reading frame header.
ramiro
parents: 6654
diff changeset
343 (const uint32_t*) buf,
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
344 swap_buf_size>>2);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
345 init_get_bits(&ctx->gb, ctx->swap_buf, swap_buf_size << 3);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
346
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
347 if(!decode(ctx, quality, num_coeffs, !is_pframe)) {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
348 avctx->release_buffer(avctx, &ctx->buf_ptrs[ctx->cur_index]);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
349 return -1;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
350 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
351
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
352 ctx->buf_ptrs[ctx->cur_index].pict_type = is_pframe ? FF_P_TYPE:FF_I_TYPE;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
353 *(AVFrame*)data = ctx->buf_ptrs[ctx->cur_index];
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
354 *data_size = sizeof(AVFrame);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
355
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
356 ctx->prev_index = ctx->cur_index;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
357 ctx->cur_index--;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
358 ctx->cur_index &= 15;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
359
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
360 /* Only release frames that aren't used for backreferences anymore */
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
361 if(ctx->buf_ptrs[ctx->cur_index].data[0])
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
362 avctx->release_buffer(avctx, &ctx->buf_ptrs[ctx->cur_index]);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
363
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
364 return buf_size;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
365 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
366
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6508
diff changeset
367 static av_cold int mimic_decode_end(AVCodecContext *avctx)
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
368 {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
369 MimicContext *ctx = avctx->priv_data;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
370 int i;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
371
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
372 av_free(ctx->swap_buf);
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
373 for(i = 0; i < 16; i++)
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
374 if(ctx->buf_ptrs[i].data[0])
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
375 avctx->release_buffer(avctx, &ctx->buf_ptrs[i]);
6652
1aa282868038 Rename vlc1 to vlc.
ramiro
parents: 6517
diff changeset
376 free_vlc(&ctx->vlc);
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
377
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
378 return 0;
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
379 }
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
380
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
381 AVCodec mimic_decoder = {
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
382 "mimic",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 11369
diff changeset
383 AVMEDIA_TYPE_VIDEO,
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
384 CODEC_ID_MIMIC,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
385 sizeof(MimicContext),
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
386 mimic_decode_init,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
387 NULL,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
388 mimic_decode_end,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
389 mimic_decode_frame,
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
390 CODEC_CAP_DR1,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6710
diff changeset
391 .long_name = NULL_IF_CONFIG_SMALL("Mimic"),
6508
d9711ab4a934 Mimic decoder.
ramiro
parents:
diff changeset
392 };