36 #define MIMIC_HEADER_SIZE 20
68 0x0000000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
69 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
70 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000b,
71 0x0000001b, 0x00000038, 0x00000078, 0x00000079, 0x0000007a, 0x000000f9,
72 0x000000fa, 0x000003fb, 0x000007f8, 0x000007f9, 0x000007fa, 0x000007fb,
73 0x00000ff8, 0x00000ff9, 0x00000001, 0x00000039, 0x0000007b, 0x000000fb,
74 0x000001f8, 0x000001f9, 0x00000ffa, 0x00000ffb, 0x00001ff8, 0x00001ff9,
75 0x00001ffa, 0x00001ffb, 0x00003ff8, 0x00003ff9, 0x00003ffa, 0x00000000,
76 0x00000004, 0x0000003a, 0x000001fa, 0x00003ffb, 0x00007ff8, 0x00007ff9,
77 0x00007ffa, 0x00007ffb, 0x0000fff8, 0x0000fff9, 0x0000fffa, 0x0000fffb,
78 0x0001fff8, 0x0001fff9, 0x0001fffa, 0x00000000, 0x0000000c, 0x000000f8,
79 0x000001fb, 0x0001fffb, 0x0003fff8, 0x0003fff9, 0x0003fffa, 0x0003fffb,
80 0x0007fff8, 0x0007fff9, 0x0007fffa, 0x0007fffb, 0x000ffff8, 0x000ffff9,
81 0x000ffffa, 0x00000000, 0x0000001a, 0x000003f8, 0x000ffffb, 0x001ffff8,
82 0x001ffff9, 0x001ffffa, 0x001ffffb, 0x003ffff8, 0x003ffff9, 0x003ffffa,
83 0x003ffffb, 0x007ffff8, 0x007ffff9, 0x007ffffa, 0x007ffffb, 0x00000000,
84 0x0000003b, 0x000003f9, 0x00fffff8, 0x00fffff9, 0x00fffffa, 0x00fffffb,
85 0x01fffff8, 0x01fffff9, 0x01fffffa, 0x01fffffb, 0x03fffff8, 0x03fffff9,
86 0x03fffffa, 0x03fffffb, 0x07fffff8, 0x00000000, 0x000003fa, 0x07fffff9,
87 0x07fffffa, 0x07fffffb, 0x0ffffff8, 0x0ffffff9, 0x0ffffffa, 0x0ffffffb,
88 0x1ffffff8, 0x1ffffff9, 0x1ffffffa, 0x1ffffffb, 0x3ffffff8, 0x3ffffff9,
93 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
94 0, 0, 0, 0, 2, 4, 5, 6, 7, 7, 7, 8,
95 8, 10, 11, 11, 11, 11, 12, 12, 2, 6, 7, 8,
96 9, 9, 12, 12, 13, 13, 13, 13, 14, 14, 14, 0,
97 3, 6, 9, 14, 15, 15, 15, 15, 16, 16, 16, 16,
98 17, 17, 17, 0, 4, 8, 9, 17, 18, 18, 18, 18,
99 19, 19, 19, 19, 20, 20, 20, 0, 5, 10, 20, 21,
100 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 0,
101 6, 10, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26,
102 26, 26, 27, 0, 10, 27, 27, 27, 28, 28, 28, 28,
103 29, 29, 29, 29, 30, 30, 30,
107 0, 8, 1, 2, 9, 16, 24, 17,
108 10, 3, 4, 11, 18, 25, 32, 40,
109 33, 26, 19, 12, 5, 6, 13, 20,
110 27, 34, 41, 48, 56, 49, 42, 35,
111 28, 21, 14, 7, 15, 22, 29, 36,
112 43, 50, 57, 58, 51, 44, 37, 30,
113 23, 31, 38, 45, 52, 59, 39, 46,
114 53, 60, 61, 54, 47, 55, 62, 63,
175 if (avctx == avctx_from)
183 if (i !=
src->next_cur_index &&
src->frames[i].f->data[0]) {
198 { -7, 7, -6, 6, -5, 5, -4, 4, },
199 { -15, 15, -14, 14, -13, 13, -12, 12,
200 -11, 11, -10, 10, -9, 9, -8, 8, },
201 { -31, 31, -30, 30, -29, 29, -28, 28,
202 -27, 27, -26, 26, -25, 25, -24, 24,
203 -23, 23, -22, 22, -21, 21, -20, 20,
204 -19, 19, -18, 18, -17, 17, -16, 16, },
205 { -63, 63, -62, 62, -61, 61, -60, 60,
206 -59, 59, -58, 58, -57, 57, -56, 56,
207 -55, 55, -54, 54, -53, 53, -52, 52,
208 -51, 51, -50, 50, -49, 49, -48, 48,
209 -47, 47, -46, 46, -45, 45, -44, 44,
210 -43, 43, -42, 42, -41, 41, -40, 40,
211 -39, 39, -38, 38, -37, 37, -36, 36,
212 -35, 35, -34, 34, -33, 33, -32, 32, },
213 { -127, 127, -126, 126, -125, 125, -124, 124,
214 -123, 123, -122, 122, -121, 121, -120, 120,
215 -119, 119, -118, 118, -117, 117, -116, 116,
216 -115, 115, -114, 114, -113, 113, -112, 112,
217 -111, 111, -110, 110, -109, 109, -108, 108,
218 -107, 107, -106, 106, -105, 105, -104, 104,
219 -103, 103, -102, 102, -101, 101, -100, 100,
220 -99, 99, -98, 98, -97, 97, -96, 96, },
221 { -95, 95, -94, 94, -93, 93, -92, 92,
222 -91, 91, -90, 90, -89, 89, -88, 88,
223 -87, 87, -86, 86, -85, 85, -84, 84,
224 -83, 83, -82, 82, -81, 81, -80, 80,
225 -79, 79, -78, 78, -77, 77, -76, 76,
226 -75, 75, -74, 74, -73, 73, -72, 72,
227 -71, 71, -70, 70, -69, 69, -68, 68,
228 -67, 67, -66, 66, -65, 65, -64, 64, },
240 for (pos = 1; pos < num_coeffs; pos++) {
241 uint32_t vlc, num_bits;
263 coeff = vlcdec_lookup[num_bits][
value];
267 coeff = (coeff * qscale) / 1001;
278 int ret, y, x,
plane, cur_row = 0;
280 for (plane = 0; plane < 3; plane++) {
281 const int is_chroma = !!
plane;
282 const int qscale = av_clip(10000 - quality, is_chroma ? 1000 : 2000,
294 if (is_iframe ||
get_bits1(&ctx->
gb) == is_chroma) {
298 if (is_chroma || is_iframe || !
get_bits1(&ctx->
gb)) {
319 "No such backreference! Buggy sample.\n");
352 for (i = 0; i < 3; i++)
360 int buf_size = avpkt->
size;
366 int quality, num_coeffs;
369 if (buf_size <= MIMIC_HEADER_SIZE) {
376 quality = bytestream2_get_le16u(&gb);
377 width = bytestream2_get_le16u(&gb);
378 height = bytestream2_get_le16u(&gb);
380 is_pframe = bytestream2_get_le32u(&gb);
381 num_coeffs = bytestream2_get_byteu(&gb);
387 if (!(width == 160 && height == 120) &&
388 !(width == 320 && height == 240)) {
397 for (i = 0; i < 3; i++) {
428 (
const uint32_t *) (buf + MIMIC_HEADER_SIZE),
432 res =
decode(ctx, quality, num_coeffs, !is_pframe);
void(* bswap_buf)(uint32_t *dst, const uint32_t *src, int w)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static const uint8_t col_zag[64]
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
void(* clear_block)(int16_t *block)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static av_cold int init(AVCodecContext *avctx)
#define DECLARE_ALIGNED(n, t, v)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
void ff_thread_await_progress(ThreadFrame *f, int n, int field)
Wait for earlier decoding threads to finish reference pictures.
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
Multithreading support functions.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
int ff_thread_ref_frame(ThreadFrame *dst, ThreadFrame *src)
bitstream reader API header.
void ff_thread_finish_setup(AVCodecContext *avctx)
If the codec defines update_thread_context(), call this when they are ready for the next thread to st...
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f)
Wrapper around release_buffer() frame-for multithreaded codecs.
#define init_vlc(vlc, nb_bits, nb_codes,bits, bits_wrap, bits_size,codes, codes_wrap, codes_size,flags)
int is_copy
Whether the parent AVCodecContext is a copy of the context which had init() called on it...
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int active_thread_type
Which multithreading methods are in use by the codec.
int flags
AV_CODEC_FLAG_*.
const char * name
Name of the codec implementation.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
static const int8_t vlcdec_lookup[9][64]
static int vlc_decode_block(MimicContext *ctx, int num_coeffs, int qscale)
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
enum AVPictureType pict_type
Picture type of the frame.
#define FF_THREAD_FRAME
Decode more than one frame at once.
static av_cold int mimic_decode_end(AVCodecContext *avctx)
int width
picture width / height.
GLsizei GLboolean const GLfloat * value
void ff_thread_report_progress(ThreadFrame *f, int n, int field)
Notify later decoding threads when part of their reference picture is ready.
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
uint8_t idct_permutation[64]
IDCT input permutation.
static const uint8_t huffbits[]
#define FF_ARRAY_ELEMS(a)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
void(* idct_put)(uint8_t *dest, int line_size, int16_t *block)
block -> idct -> clip to unsigned 8 bit -> dest.
static av_cold int mimic_decode_init(AVCodecContext *avctx)
Libavcodec external API header.
av_cold void ff_blockdsp_init(BlockDSPContext *c, AVCodecContext *avctx)
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
main external API structure.
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1.
static void flip_swap_frame(AVFrame *f)
Flip the buffer upside-down and put it in the YVU order to revert the way Mimic encodes frames...
static unsigned int get_bits1(GetBitContext *s)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static const uint32_t huffcodes[]
int allocate_progress
Whether to allocate progress for frame threading.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
GLint GLenum GLboolean GLsizei stride
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
common internal api header.
static int mimic_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
#define MIMIC_HEADER_SIZE
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
struct AVCodecInternal * internal
Private context used for internal data.
VLC_TYPE(* table)[2]
code, bits
static const double coeff[2][5]
This structure stores compressed data.
void ff_free_vlc(VLC *vlc)
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
#define AV_CEIL_RSHIFT(a, b)