2 * Copyright (C) 2005 Ole André Vadla Ravnås <oleavr@gmail.com>
3 * Copyright (C) 2008 Ramiro Polla
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "bytestream.h"
33 #define MIMIC_HEADER_SIZE 20
36 AVCodecContext
*avctx
;
47 ThreadFrame frames
[16];
48 AVPicture flipped_ptrs
[16];
50 DECLARE_ALIGNED(16, int16_t, dct_block
)[64];
57 /* Kept in the context so multithreading can have a constant to read from */
62 static const uint32_t huffcodes
[] = {
63 0x0000000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
64 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
65 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000b,
66 0x0000001b, 0x00000038, 0x00000078, 0x00000079, 0x0000007a, 0x000000f9,
67 0x000000fa, 0x000003fb, 0x000007f8, 0x000007f9, 0x000007fa, 0x000007fb,
68 0x00000ff8, 0x00000ff9, 0x00000001, 0x00000039, 0x0000007b, 0x000000fb,
69 0x000001f8, 0x000001f9, 0x00000ffa, 0x00000ffb, 0x00001ff8, 0x00001ff9,
70 0x00001ffa, 0x00001ffb, 0x00003ff8, 0x00003ff9, 0x00003ffa, 0x00000000,
71 0x00000004, 0x0000003a, 0x000001fa, 0x00003ffb, 0x00007ff8, 0x00007ff9,
72 0x00007ffa, 0x00007ffb, 0x0000fff8, 0x0000fff9, 0x0000fffa, 0x0000fffb,
73 0x0001fff8, 0x0001fff9, 0x0001fffa, 0x00000000, 0x0000000c, 0x000000f8,
74 0x000001fb, 0x0001fffb, 0x0003fff8, 0x0003fff9, 0x0003fffa, 0x0003fffb,
75 0x0007fff8, 0x0007fff9, 0x0007fffa, 0x0007fffb, 0x000ffff8, 0x000ffff9,
76 0x000ffffa, 0x00000000, 0x0000001a, 0x000003f8, 0x000ffffb, 0x001ffff8,
77 0x001ffff9, 0x001ffffa, 0x001ffffb, 0x003ffff8, 0x003ffff9, 0x003ffffa,
78 0x003ffffb, 0x007ffff8, 0x007ffff9, 0x007ffffa, 0x007ffffb, 0x00000000,
79 0x0000003b, 0x000003f9, 0x00fffff8, 0x00fffff9, 0x00fffffa, 0x00fffffb,
80 0x01fffff8, 0x01fffff9, 0x01fffffa, 0x01fffffb, 0x03fffff8, 0x03fffff9,
81 0x03fffffa, 0x03fffffb, 0x07fffff8, 0x00000000, 0x000003fa, 0x07fffff9,
82 0x07fffffa, 0x07fffffb, 0x0ffffff8, 0x0ffffff9, 0x0ffffffa, 0x0ffffffb,
83 0x1ffffff8, 0x1ffffff9, 0x1ffffffa, 0x1ffffffb, 0x3ffffff8, 0x3ffffff9,
87 static const uint8_t huffbits
[] = {
88 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
89 0, 0, 0, 0, 2, 4, 5, 6, 7, 7, 7, 8,
90 8, 10, 11, 11, 11, 11, 12, 12, 2, 6, 7, 8,
91 9, 9, 12, 12, 13, 13, 13, 13, 14, 14, 14, 0,
92 3, 6, 9, 14, 15, 15, 15, 15, 16, 16, 16, 16,
93 17, 17, 17, 0, 4, 8, 9, 17, 18, 18, 18, 18,
94 19, 19, 19, 19, 20, 20, 20, 0, 5, 10, 20, 21,
95 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 0,
96 6, 10, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26,
97 26, 26, 27, 0, 10, 27, 27, 27, 28, 28, 28, 28,
98 29, 29, 29, 29, 30, 30, 30,
101 static const uint8_t col_zag
[64] = {
102 0, 8, 1, 2, 9, 16, 24, 17,
103 10, 3, 4, 11, 18, 25, 32, 40,
104 33, 26, 19, 12, 5, 6, 13, 20,
105 27, 34, 41, 48, 56, 49, 42, 35,
106 28, 21, 14, 7, 15, 22, 29, 36,
107 43, 50, 57, 58, 51, 44, 37, 30,
108 23, 31, 38, 45, 52, 59, 39, 46,
109 53, 60, 61, 54, 47, 55, 62, 63,
112 static av_cold
int mimic_decode_end(AVCodecContext
*avctx
)
114 MimicContext
*ctx
= avctx
->priv_data
;
117 av_free(ctx
->swap_buf
);
119 for (i
= 0; i
< FF_ARRAY_ELEMS(ctx
->frames
); i
++) {
120 if (ctx
->frames
[i
].f
)
121 ff_thread_release_buffer(avctx
, &ctx
->frames
[i
]);
122 av_frame_free(&ctx
->frames
[i
].f
);
125 if (!avctx
->internal
->is_copy
)
126 ff_free_vlc(&ctx
->vlc
);
131 static av_cold
int mimic_decode_init(AVCodecContext
*avctx
)
133 MimicContext
*ctx
= avctx
->priv_data
;
136 avctx
->internal
->allocate_progress
= 1;
141 if ((ret
= init_vlc(&ctx
->vlc
, 11, FF_ARRAY_ELEMS(huffbits
),
142 huffbits
, 1, 1, huffcodes
, 4, 4, 0)) < 0) {
143 av_log(avctx
, AV_LOG_ERROR
, "error initializing vlc table\n");
146 ff_dsputil_init(&ctx
->dsp
, avctx
);
147 ff_init_scantable(ctx
->dsp
.idct_permutation
, &ctx
->scantable
, col_zag
);
149 for (i
= 0; i
< FF_ARRAY_ELEMS(ctx
->frames
); i
++) {
150 ctx
->frames
[i
].f
= av_frame_alloc();
151 if (!ctx
->frames
[i
].f
) {
152 mimic_decode_end(avctx
);
153 return AVERROR(ENOMEM
);
160 static int mimic_decode_update_thread_context(AVCodecContext
*avctx
, const AVCodecContext
*avctx_from
)
162 MimicContext
*dst
= avctx
->priv_data
, *src
= avctx_from
->priv_data
;
165 if (avctx
== avctx_from
)
168 dst
->cur_index
= src
->next_cur_index
;
169 dst
->prev_index
= src
->next_prev_index
;
171 memcpy(dst
->flipped_ptrs
, src
->flipped_ptrs
, sizeof(src
->flipped_ptrs
));
173 for (i
= 0; i
< FF_ARRAY_ELEMS(dst
->frames
); i
++) {
174 ff_thread_release_buffer(avctx
, &dst
->frames
[i
]);
175 if (src
->frames
[i
].f
->data
[0]) {
176 ret
= ff_thread_ref_frame(&dst
->frames
[i
], &src
->frames
[i
]);
185 static const int8_t vlcdec_lookup
[9][64] = {
189 { -7, 7, -6, 6, -5, 5, -4, 4, },
190 { -15, 15, -14, 14, -13, 13, -12, 12,
191 -11, 11, -10, 10, -9, 9, -8, 8, },
192 { -31, 31, -30, 30, -29, 29, -28, 28,
193 -27, 27, -26, 26, -25, 25, -24, 24,
194 -23, 23, -22, 22, -21, 21, -20, 20,
195 -19, 19, -18, 18, -17, 17, -16, 16, },
196 { -63, 63, -62, 62, -61, 61, -60, 60,
197 -59, 59, -58, 58, -57, 57, -56, 56,
198 -55, 55, -54, 54, -53, 53, -52, 52,
199 -51, 51, -50, 50, -49, 49, -48, 48,
200 -47, 47, -46, 46, -45, 45, -44, 44,
201 -43, 43, -42, 42, -41, 41, -40, 40,
202 -39, 39, -38, 38, -37, 37, -36, 36,
203 -35, 35, -34, 34, -33, 33, -32, 32, },
204 { -127, 127, -126, 126, -125, 125, -124, 124,
205 -123, 123, -122, 122, -121, 121, -120, 120,
206 -119, 119, -118, 118, -117, 117, -116, 116,
207 -115, 115, -114, 114, -113, 113, -112, 112,
208 -111, 111, -110, 110, -109, 109, -108, 108,
209 -107, 107, -106, 106, -105, 105, -104, 104,
210 -103, 103, -102, 102, -101, 101, -100, 100,
211 -99, 99, -98, 98, -97, 97, -96, 96, },
212 { -95, 95, -94, 94, -93, 93, -92, 92,
213 -91, 91, -90, 90, -89, 89, -88, 88,
214 -87, 87, -86, 86, -85, 85, -84, 84,
215 -83, 83, -82, 82, -81, 81, -80, 80,
216 -79, 79, -78, 78, -77, 77, -76, 76,
217 -75, 75, -74, 74, -73, 73, -72, 72,
218 -71, 71, -70, 70, -69, 69, -68, 68,
219 -67, 67, -66, 66, -65, 65, -64, 64, },
222 static int vlc_decode_block(MimicContext
*ctx
, int num_coeffs
, int qscale
)
224 int16_t *block
= ctx
->dct_block
;
227 ctx
->dsp
.clear_block(block
);
229 block
[0] = get_bits(&ctx
->gb
, 8) << 3;
231 for (pos
= 1; pos
< num_coeffs
; pos
++) {
232 uint32_t vlc
, num_bits
;
236 vlc
= get_vlc2(&ctx
->gb
, ctx
->vlc
.table
, ctx
->vlc
.bits
, 3);
237 if (!vlc
) /* end-of-block code */
240 return AVERROR_INVALIDDATA
;
242 /* pos_add and num_bits are coded in the vlc code */
243 pos
+= vlc
& 15; // pos_add
244 num_bits
= vlc
>> 4; // num_bits
247 return AVERROR_INVALIDDATA
;
249 value
= get_bits(&ctx
->gb
, num_bits
);
251 /* Libav's IDCT behaves somewhat different from the original code, so
252 * a factor of 4 was added to the input */
254 coeff
= vlcdec_lookup
[num_bits
][value
];
257 else /* TODO Use >> 10 instead of / 1001 */
258 coeff
= (coeff
* qscale
) / 1001;
260 block
[ctx
->scantable
.permutated
[pos
]] = coeff
;
266 static int decode(MimicContext
*ctx
, int quality
, int num_coeffs
,
269 int ret
, y
, x
, plane
, cur_row
= 0;
271 for (plane
= 0; plane
< 3; plane
++) {
272 const int is_chroma
= !!plane
;
273 const int qscale
= av_clip(10000 - quality
, is_chroma
? 1000 : 2000,
275 const int stride
= ctx
->flipped_ptrs
[ctx
->cur_index
].linesize
[plane
];
276 const uint8_t *src
= ctx
->flipped_ptrs
[ctx
->prev_index
].data
[plane
];
277 uint8_t *dst
= ctx
->flipped_ptrs
[ctx
->cur_index
].data
[plane
];
279 for (y
= 0; y
< ctx
->num_vblocks
[plane
]; y
++) {
280 for (x
= 0; x
< ctx
->num_hblocks
[plane
]; x
++) {
281 /* Check for a change condition in the current block.
282 * - iframes always change.
283 * - Luma plane changes on get_bits1 == 0
284 * - Chroma planes change on get_bits1 == 1 */
285 if (is_iframe
|| get_bits1(&ctx
->gb
) == is_chroma
) {
286 /* Luma planes may use a backreference from the 15 last
287 * frames preceding the previous. (get_bits1 == 1)
288 * Chroma planes don't use backreferences. */
289 if (is_chroma
|| is_iframe
|| !get_bits1(&ctx
->gb
)) {
290 if ((ret
= vlc_decode_block(ctx
, num_coeffs
,
292 av_log(ctx
->avctx
, AV_LOG_ERROR
, "Error decoding "
296 ctx
->dsp
.idct_put(dst
, stride
, ctx
->dct_block
);
298 unsigned int backref
= get_bits(&ctx
->gb
, 4);
299 int index
= (ctx
->cur_index
+ backref
) & 15;
300 uint8_t *p
= ctx
->flipped_ptrs
[index
].data
[0];
302 if (index
!= ctx
->cur_index
&& p
) {
303 ff_thread_await_progress(&ctx
->frames
[index
],
306 ctx
->flipped_ptrs
[ctx
->prev_index
].data
[plane
];
307 ctx
->dsp
.put_pixels_tab
[1][0](dst
, p
, stride
, 8);
309 av_log(ctx
->avctx
, AV_LOG_ERROR
,
310 "No such backreference! Buggy sample.\n");
314 ff_thread_await_progress(&ctx
->frames
[ctx
->prev_index
],
316 ctx
->dsp
.put_pixels_tab
[1][0](dst
, src
, stride
, 8);
321 src
+= (stride
- ctx
->num_hblocks
[plane
]) << 3;
322 dst
+= (stride
- ctx
->num_hblocks
[plane
]) << 3;
324 ff_thread_report_progress(&ctx
->frames
[ctx
->cur_index
],
333 * Flip the buffer upside-down and put it in the YVU order to match the
334 * way Mimic encodes frames.
336 static void prepare_avpic(MimicContext
*ctx
, AVPicture
*dst
, AVFrame
*src
)
339 dst
->data
[0] = src
->data
[0] + ( ctx
->avctx
->height
- 1) * src
->linesize
[0];
340 dst
->data
[1] = src
->data
[2] + ((ctx
->avctx
->height
>> 1) - 1) * src
->linesize
[2];
341 dst
->data
[2] = src
->data
[1] + ((ctx
->avctx
->height
>> 1) - 1) * src
->linesize
[1];
342 for (i
= 0; i
< 3; i
++)
343 dst
->linesize
[i
] = -src
->linesize
[i
];
346 static int mimic_decode_frame(AVCodecContext
*avctx
, void *data
,
347 int *got_frame
, AVPacket
*avpkt
)
349 const uint8_t *buf
= avpkt
->data
;
350 int buf_size
= avpkt
->size
;
351 int swap_buf_size
= buf_size
- MIMIC_HEADER_SIZE
;
352 MimicContext
*ctx
= avctx
->priv_data
;
356 int quality
, num_coeffs
;
359 if (buf_size
<= MIMIC_HEADER_SIZE
) {
360 av_log(avctx
, AV_LOG_ERROR
, "insufficient data\n");
361 return AVERROR_INVALIDDATA
;
364 bytestream2_init(&gb
, buf
, MIMIC_HEADER_SIZE
);
365 bytestream2_skip(&gb
, 2); /* some constant (always 256) */
366 quality
= bytestream2_get_le16u(&gb
);
367 width
= bytestream2_get_le16u(&gb
);
368 height
= bytestream2_get_le16u(&gb
);
369 bytestream2_skip(&gb
, 4); /* some constant */
370 is_pframe
= bytestream2_get_le32u(&gb
);
371 num_coeffs
= bytestream2_get_byteu(&gb
);
372 bytestream2_skip(&gb
, 3); /* some constant */
377 if (!(width
== 160 && height
== 120) &&
378 !(width
== 320 && height
== 240)) {
379 av_log(avctx
, AV_LOG_ERROR
, "invalid width/height!\n");
380 return AVERROR_INVALIDDATA
;
384 avctx
->width
= width
;
385 avctx
->height
= height
;
386 avctx
->pix_fmt
= AV_PIX_FMT_YUV420P
;
387 for (i
= 0; i
< 3; i
++) {
388 ctx
->num_vblocks
[i
] = -((-height
) >> (3 + !!i
));
389 ctx
->num_hblocks
[i
] = width
>> (3 + !!i
);
391 } else if (width
!= ctx
->avctx
->width
|| height
!= ctx
->avctx
->height
) {
392 av_log_missing_feature(avctx
, "resolution changing", 1);
393 return AVERROR_PATCHWELCOME
;
396 if (is_pframe
&& !ctx
->frames
[ctx
->prev_index
].f
->data
[0]) {
397 av_log(avctx
, AV_LOG_ERROR
, "decoding must start with keyframe\n");
398 return AVERROR_INVALIDDATA
;
401 ff_thread_release_buffer(avctx
, &ctx
->frames
[ctx
->cur_index
]);
402 ctx
->frames
[ctx
->cur_index
].f
->pict_type
= is_pframe
? AV_PICTURE_TYPE_P
:
404 if ((res
= ff_thread_get_buffer(avctx
, &ctx
->frames
[ctx
->cur_index
],
405 AV_GET_BUFFER_FLAG_REF
)) < 0) {
406 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
410 ctx
->next_prev_index
= ctx
->cur_index
;
411 ctx
->next_cur_index
= (ctx
->cur_index
- 1) & 15;
413 prepare_avpic(ctx
, &ctx
->flipped_ptrs
[ctx
->cur_index
],
414 ctx
->frames
[ctx
->cur_index
].f
);
416 ff_thread_finish_setup(avctx
);
418 av_fast_padded_malloc(&ctx
->swap_buf
, &ctx
->swap_buf_size
, swap_buf_size
);
420 return AVERROR(ENOMEM
);
422 ctx
->dsp
.bswap_buf(ctx
->swap_buf
,
423 (const uint32_t*) (buf
+ MIMIC_HEADER_SIZE
),
425 init_get_bits(&ctx
->gb
, ctx
->swap_buf
, swap_buf_size
<< 3);
427 res
= decode(ctx
, quality
, num_coeffs
, !is_pframe
);
428 ff_thread_report_progress(&ctx
->frames
[ctx
->cur_index
], INT_MAX
, 0);
430 if (!(avctx
->active_thread_type
& FF_THREAD_FRAME
)) {
431 ff_thread_release_buffer(avctx
, &ctx
->frames
[ctx
->cur_index
]);
436 if ((res
= av_frame_ref(data
, ctx
->frames
[ctx
->cur_index
].f
)) < 0)
440 ctx
->prev_index
= ctx
->next_prev_index
;
441 ctx
->cur_index
= ctx
->next_cur_index
;
443 /* Only release frames that aren't used for backreferences anymore */
444 ff_thread_release_buffer(avctx
, &ctx
->frames
[ctx
->cur_index
]);
449 static av_cold
int mimic_init_thread_copy(AVCodecContext
*avctx
)
451 MimicContext
*ctx
= avctx
->priv_data
;
454 for (i
= 0; i
< FF_ARRAY_ELEMS(ctx
->frames
); i
++) {
455 ctx
->frames
[i
].f
= av_frame_alloc();
456 if (!ctx
->frames
[i
].f
) {
457 mimic_decode_end(avctx
);
458 return AVERROR(ENOMEM
);
465 AVCodec ff_mimic_decoder
= {
467 .type
= AVMEDIA_TYPE_VIDEO
,
468 .id
= AV_CODEC_ID_MIMIC
,
469 .priv_data_size
= sizeof(MimicContext
),
470 .init
= mimic_decode_init
,
471 .close
= mimic_decode_end
,
472 .decode
= mimic_decode_frame
,
473 .capabilities
= CODEC_CAP_DR1
| CODEC_CAP_FRAME_THREADS
,
474 .long_name
= NULL_IF_CONFIG_SMALL("Mimic"),
475 .update_thread_context
= ONLY_IF_THREADS_ENABLED(mimic_decode_update_thread_context
),
476 .init_thread_copy
= ONLY_IF_THREADS_ENABLED(mimic_init_thread_copy
),