2 * Copyright (C) 2005 Ole André Vadla Ravnås <oleavr@gmail.com>
3 * Copyright (C) 2008 Ramiro Polla <ramiro@lisha.ufsc.br>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 #include "bytestream.h"
31 #define MIMIC_HEADER_SIZE 20
34 AVCodecContext
*avctx
;
45 AVFrame buf_ptrs
[16];
46 AVPicture flipped_ptrs
[16];
48 DECLARE_ALIGNED_16(DCTELEM
, dct_block
[64]);
56 static const uint32_t huffcodes
[] = {
57 0x0000000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
58 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
59 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000b,
60 0x0000001b, 0x00000038, 0x00000078, 0x00000079, 0x0000007a, 0x000000f9,
61 0x000000fa, 0x000003fb, 0x000007f8, 0x000007f9, 0x000007fa, 0x000007fb,
62 0x00000ff8, 0x00000ff9, 0x00000001, 0x00000039, 0x0000007b, 0x000000fb,
63 0x000001f8, 0x000001f9, 0x00000ffa, 0x00000ffb, 0x00001ff8, 0x00001ff9,
64 0x00001ffa, 0x00001ffb, 0x00003ff8, 0x00003ff9, 0x00003ffa, 0x00000000,
65 0x00000004, 0x0000003a, 0x000001fa, 0x00003ffb, 0x00007ff8, 0x00007ff9,
66 0x00007ffa, 0x00007ffb, 0x0000fff8, 0x0000fff9, 0x0000fffa, 0x0000fffb,
67 0x0001fff8, 0x0001fff9, 0x0001fffa, 0x00000000, 0x0000000c, 0x000000f8,
68 0x000001fb, 0x0001fffb, 0x0003fff8, 0x0003fff9, 0x0003fffa, 0x0003fffb,
69 0x0007fff8, 0x0007fff9, 0x0007fffa, 0x0007fffb, 0x000ffff8, 0x000ffff9,
70 0x000ffffa, 0x00000000, 0x0000001a, 0x000003f8, 0x000ffffb, 0x001ffff8,
71 0x001ffff9, 0x001ffffa, 0x001ffffb, 0x003ffff8, 0x003ffff9, 0x003ffffa,
72 0x003ffffb, 0x007ffff8, 0x007ffff9, 0x007ffffa, 0x007ffffb, 0x00000000,
73 0x0000003b, 0x000003f9, 0x00fffff8, 0x00fffff9, 0x00fffffa, 0x00fffffb,
74 0x01fffff8, 0x01fffff9, 0x01fffffa, 0x01fffffb, 0x03fffff8, 0x03fffff9,
75 0x03fffffa, 0x03fffffb, 0x07fffff8, 0x00000000, 0x000003fa, 0x07fffff9,
76 0x07fffffa, 0x07fffffb, 0x0ffffff8, 0x0ffffff9, 0x0ffffffa, 0x0ffffffb,
77 0x1ffffff8, 0x1ffffff9, 0x1ffffffa, 0x1ffffffb, 0x3ffffff8, 0x3ffffff9,
81 static const uint8_t huffbits
[] = {
82 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
83 0, 0, 0, 0, 2, 4, 5, 6, 7, 7, 7, 8,
84 8, 10, 11, 11, 11, 11, 12, 12, 2, 6, 7, 8,
85 9, 9, 12, 12, 13, 13, 13, 13, 14, 14, 14, 0,
86 3, 6, 9, 14, 15, 15, 15, 15, 16, 16, 16, 16,
87 17, 17, 17, 0, 4, 8, 9, 17, 18, 18, 18, 18,
88 19, 19, 19, 19, 20, 20, 20, 0, 5, 10, 20, 21,
89 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 0,
90 6, 10, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26,
91 26, 26, 27, 0, 10, 27, 27, 27, 28, 28, 28, 28,
92 29, 29, 29, 29, 30, 30, 30,
95 static const uint8_t col_zag
[64] = {
96 0, 8, 1, 2, 9, 16, 24, 17,
97 10, 3, 4, 11, 18, 25, 32, 40,
98 33, 26, 19, 12, 5, 6, 13, 20,
99 27, 34, 41, 48, 56, 49, 42, 35,
100 28, 21, 14, 7, 15, 22, 29, 36,
101 43, 50, 57, 58, 51, 44, 37, 30,
102 23, 31, 38, 45, 52, 59, 39, 46,
103 53, 60, 61, 54, 47, 55, 62, 63,
106 static av_cold
int mimic_decode_init(AVCodecContext
*avctx
)
108 MimicContext
*ctx
= avctx
->priv_data
;
113 if(init_vlc(&ctx
->vlc
, 11, FF_ARRAY_ELEMS(huffbits
),
114 huffbits
, 1, 1, huffcodes
, 4, 4, 0)) {
115 av_log(avctx
, AV_LOG_ERROR
, "error initializing vlc table\n");
118 dsputil_init(&ctx
->dsp
, avctx
);
119 ff_init_scantable(ctx
->dsp
.idct_permutation
, &ctx
->scantable
, col_zag
);
124 static const int8_t vlcdec_lookup
[9][64] = {
128 { -7, 7, -6, 6, -5, 5, -4, 4, },
129 { -15, 15, -14, 14, -13, 13, -12, 12,
130 -11, 11, -10, 10, -9, 9, -8, 8, },
131 { -31, 31, -30, 30, -29, 29, -28, 28,
132 -27, 27, -26, 26, -25, 25, -24, 24,
133 -23, 23, -22, 22, -21, 21, -20, 20,
134 -19, 19, -18, 18, -17, 17, -16, 16, },
135 { -63, 63, -62, 62, -61, 61, -60, 60,
136 -59, 59, -58, 58, -57, 57, -56, 56,
137 -55, 55, -54, 54, -53, 53, -52, 52,
138 -51, 51, -50, 50, -49, 49, -48, 48,
139 -47, 47, -46, 46, -45, 45, -44, 44,
140 -43, 43, -42, 42, -41, 41, -40, 40,
141 -39, 39, -38, 38, -37, 37, -36, 36,
142 -35, 35, -34, 34, -33, 33, -32, 32, },
143 { -127, 127, -126, 126, -125, 125, -124, 124,
144 -123, 123, -122, 122, -121, 121, -120, 120,
145 -119, 119, -118, 118, -117, 117, -116, 116,
146 -115, 115, -114, 114, -113, 113, -112, 112,
147 -111, 111, -110, 110, -109, 109, -108, 108,
148 -107, 107, -106, 106, -105, 105, -104, 104,
149 -103, 103, -102, 102, -101, 101, -100, 100,
150 -99, 99, -98, 98, -97, 97, -96, 96, },
151 { -95, 95, -94, 94, -93, 93, -92, 92,
152 -91, 91, -90, 90, -89, 89, -88, 88,
153 -87, 87, -86, 86, -85, 85, -84, 84,
154 -83, 83, -82, 82, -81, 81, -80, 80,
155 -79, 79, -78, 78, -77, 77, -76, 76,
156 -75, 75, -74, 74, -73, 73, -72, 72,
157 -71, 71, -70, 70, -69, 69, -68, 68,
158 -67, 67, -66, 66, -65, 65, -64, 64, },
161 static int vlc_decode_block(MimicContext
*ctx
, int num_coeffs
, int qscale
)
163 DCTELEM
*block
= ctx
->dct_block
;
166 ctx
->dsp
.clear_block(block
);
168 block
[0] = get_bits(&ctx
->gb
, 8) << 3;
170 for(pos
= 1; pos
< num_coeffs
; pos
++) {
171 uint32_t vlc
, num_bits
;
175 vlc
= get_vlc2(&ctx
->gb
, ctx
->vlc
.table
, ctx
->vlc
.bits
, 3);
176 if(!vlc
) /* end-of-block code */
181 /* pos_add and num_bits are coded in the vlc code */
182 pos
+= vlc
&15; // pos_add
183 num_bits
= vlc
>>4; // num_bits
188 value
= get_bits(&ctx
->gb
, num_bits
);
190 /* FFmpeg's IDCT behaves somewhat different from the original code, so
191 * a factor of 4 was added to the input */
193 coeff
= vlcdec_lookup
[num_bits
][value
];
196 else /* TODO Use >> 10 instead of / 1001 */
197 coeff
= (coeff
* qscale
) / 1001;
199 block
[ctx
->scantable
.permutated
[pos
]] = coeff
;
205 static int decode(MimicContext
*ctx
, int quality
, int num_coeffs
,
210 for(plane
= 0; plane
< 3; plane
++) {
211 const int is_chroma
= !!plane
;
212 const int qscale
= av_clip(10000-quality
,is_chroma
?1000:2000,10000)<<2;
213 const int stride
= ctx
->flipped_ptrs
[ctx
->cur_index
].linesize
[plane
];
214 const uint8_t *src
= ctx
->flipped_ptrs
[ctx
->prev_index
].data
[plane
];
215 uint8_t *dst
= ctx
->flipped_ptrs
[ctx
->cur_index
].data
[plane
];
217 for(y
= 0; y
< ctx
->num_vblocks
[plane
]; y
++) {
218 for(x
= 0; x
< ctx
->num_hblocks
[plane
]; x
++) {
220 /* Check for a change condition in the current block.
221 * - iframes always change.
222 * - Luma plane changes on get_bits1 == 0
223 * - Chroma planes change on get_bits1 == 1 */
224 if(is_iframe
|| get_bits1(&ctx
->gb
) == is_chroma
) {
226 /* Luma planes may use a backreference from the 15 last
227 * frames preceding the previous. (get_bits1 == 1)
228 * Chroma planes don't use backreferences. */
229 if(is_chroma
|| is_iframe
|| !get_bits1(&ctx
->gb
)) {
231 if(!vlc_decode_block(ctx
, num_coeffs
, qscale
))
233 ctx
->dsp
.idct_put(dst
, stride
, ctx
->dct_block
);
235 unsigned int backref
= get_bits(&ctx
->gb
, 4);
236 int index
= (ctx
->cur_index
+backref
)&15;
237 uint8_t *p
= ctx
->flipped_ptrs
[index
].data
[0];
241 ctx
->flipped_ptrs
[ctx
->prev_index
].data
[plane
];
242 ctx
->dsp
.put_pixels_tab
[1][0](dst
, p
, stride
, 8);
244 av_log(ctx
->avctx
, AV_LOG_ERROR
,
245 "No such backreference! Buggy sample.\n");
249 ctx
->dsp
.put_pixels_tab
[1][0](dst
, src
, stride
, 8);
254 src
+= (stride
- ctx
->num_hblocks
[plane
])<<3;
255 dst
+= (stride
- ctx
->num_hblocks
[plane
])<<3;
263 * Flip the buffer upside-down and put it in the YVU order to match the
264 * way Mimic encodes frames.
266 static void prepare_avpic(MimicContext
*ctx
, AVPicture
*dst
, AVPicture
*src
)
269 dst
->data
[0] = src
->data
[0]+( ctx
->avctx
->height
-1)*src
->linesize
[0];
270 dst
->data
[1] = src
->data
[2]+((ctx
->avctx
->height
>>1)-1)*src
->linesize
[2];
271 dst
->data
[2] = src
->data
[1]+((ctx
->avctx
->height
>>1)-1)*src
->linesize
[1];
272 for(i
= 0; i
< 3; i
++)
273 dst
->linesize
[i
] = -src
->linesize
[i
];
276 static int mimic_decode_frame(AVCodecContext
*avctx
, void *data
,
277 int *data_size
, AVPacket
*avpkt
)
279 const uint8_t *buf
= avpkt
->data
;
280 int buf_size
= avpkt
->size
;
281 MimicContext
*ctx
= avctx
->priv_data
;
284 int quality
, num_coeffs
;
285 int swap_buf_size
= buf_size
- MIMIC_HEADER_SIZE
;
287 if(buf_size
< MIMIC_HEADER_SIZE
) {
288 av_log(avctx
, AV_LOG_ERROR
, "insufficient data\n");
292 buf
+= 2; /* some constant (always 256) */
293 quality
= bytestream_get_le16(&buf
);
294 width
= bytestream_get_le16(&buf
);
295 height
= bytestream_get_le16(&buf
);
296 buf
+= 4; /* some constant */
297 is_pframe
= bytestream_get_le32(&buf
);
298 num_coeffs
= bytestream_get_byte(&buf
);
299 buf
+= 3; /* some constant */
304 if(!(width
== 160 && height
== 120) &&
305 !(width
== 320 && height
== 240)) {
306 av_log(avctx
, AV_LOG_ERROR
, "invalid width/height!\n");
311 avctx
->width
= width
;
312 avctx
->height
= height
;
313 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
314 for(i
= 0; i
< 3; i
++) {
315 ctx
->num_vblocks
[i
] = -((-height
) >> (3 + !!i
));
316 ctx
->num_hblocks
[i
] = width
>> (3 + !!i
) ;
318 } else if(width
!= ctx
->avctx
->width
|| height
!= ctx
->avctx
->height
) {
319 av_log(avctx
, AV_LOG_ERROR
, "resolution changing is not supported\n");
323 if(is_pframe
&& !ctx
->buf_ptrs
[ctx
->prev_index
].data
[0]) {
324 av_log(avctx
, AV_LOG_ERROR
, "decoding must start with keyframe\n");
328 ctx
->buf_ptrs
[ctx
->cur_index
].reference
= 1;
329 if(avctx
->get_buffer(avctx
, &ctx
->buf_ptrs
[ctx
->cur_index
])) {
330 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
334 prepare_avpic(ctx
, &ctx
->flipped_ptrs
[ctx
->cur_index
],
335 (AVPicture
*) &ctx
->buf_ptrs
[ctx
->cur_index
]);
337 av_fast_malloc(&ctx
->swap_buf
, &ctx
->swap_buf_size
,
338 swap_buf_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
340 return AVERROR(ENOMEM
);
342 ctx
->dsp
.bswap_buf(ctx
->swap_buf
,
343 (const uint32_t*) buf
,
345 init_get_bits(&ctx
->gb
, ctx
->swap_buf
, swap_buf_size
<< 3);
347 if(!decode(ctx
, quality
, num_coeffs
, !is_pframe
)) {
348 avctx
->release_buffer(avctx
, &ctx
->buf_ptrs
[ctx
->cur_index
]);
352 ctx
->buf_ptrs
[ctx
->cur_index
].pict_type
= is_pframe
? FF_P_TYPE
:FF_I_TYPE
;
353 *(AVFrame
*)data
= ctx
->buf_ptrs
[ctx
->cur_index
];
354 *data_size
= sizeof(AVFrame
);
356 ctx
->prev_index
= ctx
->cur_index
;
358 ctx
->cur_index
&= 15;
360 /* Only release frames that aren't used for backreferences anymore */
361 if(ctx
->buf_ptrs
[ctx
->cur_index
].data
[0])
362 avctx
->release_buffer(avctx
, &ctx
->buf_ptrs
[ctx
->cur_index
]);
367 static av_cold
int mimic_decode_end(AVCodecContext
*avctx
)
369 MimicContext
*ctx
= avctx
->priv_data
;
372 av_free(ctx
->swap_buf
);
373 for(i
= 0; i
< 16; i
++)
374 if(ctx
->buf_ptrs
[i
].data
[0])
375 avctx
->release_buffer(avctx
, &ctx
->buf_ptrs
[i
]);
381 AVCodec mimic_decoder
= {
385 sizeof(MimicContext
),
391 .long_name
= NULL_IF_CONFIG_SMALL("Mimic"),