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,
172 if (avctx == avctx_from)
180 if (i !=
src->next_cur_index &&
src->frames[i].f->data[0]) {
195 { -7, 7, -6, 6, -5, 5, -4, 4, },
196 { -15, 15, -14, 14, -13, 13, -12, 12,
197 -11, 11, -10, 10, -9, 9, -8, 8, },
198 { -31, 31, -30, 30, -29, 29, -28, 28,
199 -27, 27, -26, 26, -25, 25, -24, 24,
200 -23, 23, -22, 22, -21, 21, -20, 20,
201 -19, 19, -18, 18, -17, 17, -16, 16, },
202 { -63, 63, -62, 62, -61, 61, -60, 60,
203 -59, 59, -58, 58, -57, 57, -56, 56,
204 -55, 55, -54, 54, -53, 53, -52, 52,
205 -51, 51, -50, 50, -49, 49, -48, 48,
206 -47, 47, -46, 46, -45, 45, -44, 44,
207 -43, 43, -42, 42, -41, 41, -40, 40,
208 -39, 39, -38, 38, -37, 37, -36, 36,
209 -35, 35, -34, 34, -33, 33, -32, 32, },
210 { -127, 127, -126, 126, -125, 125, -124, 124,
211 -123, 123, -122, 122, -121, 121, -120, 120,
212 -119, 119, -118, 118, -117, 117, -116, 116,
213 -115, 115, -114, 114, -113, 113, -112, 112,
214 -111, 111, -110, 110, -109, 109, -108, 108,
215 -107, 107, -106, 106, -105, 105, -104, 104,
216 -103, 103, -102, 102, -101, 101, -100, 100,
217 -99, 99, -98, 98, -97, 97, -96, 96, },
218 { -95, 95, -94, 94, -93, 93, -92, 92,
219 -91, 91, -90, 90, -89, 89, -88, 88,
220 -87, 87, -86, 86, -85, 85, -84, 84,
221 -83, 83, -82, 82, -81, 81, -80, 80,
222 -79, 79, -78, 78, -77, 77, -76, 76,
223 -75, 75, -74, 74, -73, 73, -72, 72,
224 -71, 71, -70, 70, -69, 69, -68, 68,
225 -67, 67, -66, 66, -65, 65, -64, 64, },
237 for (pos = 1; pos < num_coeffs; pos++) {
238 uint32_t
vlc, num_bits;
264 coeff = (coeff * qscale) / 1001;
275 int ret, y, x, plane, cur_row = 0;
277 for (plane = 0; plane < 3; plane++) {
278 const int is_chroma = !!plane;
279 const int qscale = av_clip(10000 - quality, is_chroma ? 1000 : 2000,
291 if (is_iframe ||
get_bits1(&ctx->
gb) == is_chroma) {
295 if (is_chroma || is_iframe || !
get_bits1(&ctx->
gb)) {
316 "No such backreference! Buggy sample.\n");
349 for (i = 0; i < 3; i++)
357 int buf_size = avpkt->
size;
363 int quality, num_coeffs;
366 if (buf_size <= MIMIC_HEADER_SIZE) {
373 quality = bytestream2_get_le16u(&gb);
374 width = bytestream2_get_le16u(&gb);
375 height = bytestream2_get_le16u(&gb);
377 is_pframe = bytestream2_get_le32u(&gb);
378 num_coeffs = bytestream2_get_byteu(&gb);
384 if (!(width == 160 && height == 120) &&
385 !(width == 320 && height == 240)) {
396 for (i = 0; i < 3; i++) {
427 (
const uint32_t *) (buf + MIMIC_HEADER_SIZE),
431 res =
decode(ctx, quality, num_coeffs, !is_pframe);
#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.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
static av_cold int init(AVCodecContext *avctx)
void(* clear_block)(int16_t *block)
#define avpriv_request_sample(...)
av_cold void ff_blockdsp_init(BlockDSPContext *c, AVCodecContext *avctx)
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...
#define init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
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)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
void(* bswap_buf)(uint32_t *dst, const uint32_t *src, int w)
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.
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
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 FF_CODEC_CAP_ALLOCATE_PROGRESS
#define i(width, name, range_min, range_max)
#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.
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.
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[]
void(* idct_put)(uint8_t *dest, ptrdiff_t line_size, int16_t *block)
block -> idct -> clip to unsigned 8 bit -> dest.
#define FF_ARRAY_ELEMS(a)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
static av_cold int mimic_decode_init(AVCodecContext *avctx)
Libavcodec external API header.
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[]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
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)
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)