36 #define MIMIC_HEADER_SIZE 20
69 0x0000000a, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
70 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
71 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000b,
72 0x0000001b, 0x00000038, 0x00000078, 0x00000079, 0x0000007a, 0x000000f9,
73 0x000000fa, 0x000003fb, 0x000007f8, 0x000007f9, 0x000007fa, 0x000007fb,
74 0x00000ff8, 0x00000ff9, 0x00000001, 0x00000039, 0x0000007b, 0x000000fb,
75 0x000001f8, 0x000001f9, 0x00000ffa, 0x00000ffb, 0x00001ff8, 0x00001ff9,
76 0x00001ffa, 0x00001ffb, 0x00003ff8, 0x00003ff9, 0x00003ffa, 0x00000000,
77 0x00000004, 0x0000003a, 0x000001fa, 0x00003ffb, 0x00007ff8, 0x00007ff9,
78 0x00007ffa, 0x00007ffb, 0x0000fff8, 0x0000fff9, 0x0000fffa, 0x0000fffb,
79 0x0001fff8, 0x0001fff9, 0x0001fffa, 0x00000000, 0x0000000c, 0x000000f8,
80 0x000001fb, 0x0001fffb, 0x0003fff8, 0x0003fff9, 0x0003fffa, 0x0003fffb,
81 0x0007fff8, 0x0007fff9, 0x0007fffa, 0x0007fffb, 0x000ffff8, 0x000ffff9,
82 0x000ffffa, 0x00000000, 0x0000001a, 0x000003f8, 0x000ffffb, 0x001ffff8,
83 0x001ffff9, 0x001ffffa, 0x001ffffb, 0x003ffff8, 0x003ffff9, 0x003ffffa,
84 0x003ffffb, 0x007ffff8, 0x007ffff9, 0x007ffffa, 0x007ffffb, 0x00000000,
85 0x0000003b, 0x000003f9, 0x00fffff8, 0x00fffff9, 0x00fffffa, 0x00fffffb,
86 0x01fffff8, 0x01fffff9, 0x01fffffa, 0x01fffffb, 0x03fffff8, 0x03fffff9,
87 0x03fffffa, 0x03fffffb, 0x07fffff8, 0x00000000, 0x000003fa, 0x07fffff9,
88 0x07fffffa, 0x07fffffb, 0x0ffffff8, 0x0ffffff9, 0x0ffffffa, 0x0ffffffb,
89 0x1ffffff8, 0x1ffffff9, 0x1ffffffa, 0x1ffffffb, 0x3ffffff8, 0x3ffffff9,
94 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
95 0, 0, 0, 0, 2, 4, 5, 6, 7, 7, 7, 8,
96 8, 10, 11, 11, 11, 11, 12, 12, 2, 6, 7, 8,
97 9, 9, 12, 12, 13, 13, 13, 13, 14, 14, 14, 0,
98 3, 6, 9, 14, 15, 15, 15, 15, 16, 16, 16, 16,
99 17, 17, 17, 0, 4, 8, 9, 17, 18, 18, 18, 18,
100 19, 19, 19, 19, 20, 20, 20, 0, 5, 10, 20, 21,
101 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 0,
102 6, 10, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26,
103 26, 26, 27, 0, 10, 27, 27, 27, 28, 28, 28, 28,
104 29, 29, 29, 29, 30, 30, 30,
108 0, 8, 1, 2, 9, 16, 24, 17,
109 10, 3, 4, 11, 18, 25, 32, 40,
110 33, 26, 19, 12, 5, 6, 13, 20,
111 27, 34, 41, 48, 56, 49, 42, 35,
112 28, 21, 14, 7, 15, 22, 29, 36,
113 43, 50, 57, 58, 51, 44, 37, 30,
114 23, 31, 38, 45, 52, 59, 39, 46,
115 53, 60, 61, 54, 47, 55, 62, 63,
175 if (avctx == avctx_from)
185 if (i !=
src->next_cur_index &&
src->frames[i].f->data[0]) {
199 { -7, 7, -6, 6, -5, 5, -4, 4, },
200 { -15, 15, -14, 14, -13, 13, -12, 12,
201 -11, 11, -10, 10, -9, 9, -8, 8, },
202 { -31, 31, -30, 30, -29, 29, -28, 28,
203 -27, 27, -26, 26, -25, 25, -24, 24,
204 -23, 23, -22, 22, -21, 21, -20, 20,
205 -19, 19, -18, 18, -17, 17, -16, 16, },
206 { -63, 63, -62, 62, -61, 61, -60, 60,
207 -59, 59, -58, 58, -57, 57, -56, 56,
208 -55, 55, -54, 54, -53, 53, -52, 52,
209 -51, 51, -50, 50, -49, 49, -48, 48,
210 -47, 47, -46, 46, -45, 45, -44, 44,
211 -43, 43, -42, 42, -41, 41, -40, 40,
212 -39, 39, -38, 38, -37, 37, -36, 36,
213 -35, 35, -34, 34, -33, 33, -32, 32, },
214 { -127, 127, -126, 126, -125, 125, -124, 124,
215 -123, 123, -122, 122, -121, 121, -120, 120,
216 -119, 119, -118, 118, -117, 117, -116, 116,
217 -115, 115, -114, 114, -113, 113, -112, 112,
218 -111, 111, -110, 110, -109, 109, -108, 108,
219 -107, 107, -106, 106, -105, 105, -104, 104,
220 -103, 103, -102, 102, -101, 101, -100, 100,
221 -99, 99, -98, 98, -97, 97, -96, 96, },
222 { -95, 95, -94, 94, -93, 93, -92, 92,
223 -91, 91, -90, 90, -89, 89, -88, 88,
224 -87, 87, -86, 86, -85, 85, -84, 84,
225 -83, 83, -82, 82, -81, 81, -80, 80,
226 -79, 79, -78, 78, -77, 77, -76, 76,
227 -75, 75, -74, 74, -73, 73, -72, 72,
228 -71, 71, -70, 70, -69, 69, -68, 68,
229 -67, 67, -66, 66, -65, 65, -64, 64, },
241 for (pos = 1; pos < num_coeffs; pos++) {
242 uint32_t vlc, num_bits;
268 coeff = (coeff * qscale) / 1001;
281 for (plane = 0; plane < 3; plane++) {
282 const int is_chroma = !!
plane;
283 const int qscale = av_clip(10000 - quality, is_chroma ? 1000 : 2000,
295 if (is_iframe ||
get_bits1(&ctx->
gb) == is_chroma) {
299 if (is_chroma || is_iframe || !
get_bits1(&ctx->
gb)) {
320 "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++) {
431 (
const uint32_t *) (buf + MIMIC_HEADER_SIZE),
435 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]
int linesize[AV_NUM_DATA_POINTERS]
number of bytes per line
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 FF_INPUT_BUFFER_PADDING_SIZE at the end w...
#define FF_ARRAY_ELEMS(a)
void ff_thread_await_progress(ThreadFrame *f, int n, int field)
Wait for earlier decoding threads to finish reference pictures.
AVPicture flipped_ptrs[16]
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.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointers to the image data planes
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 CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
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.
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.
const char * name
Name of the codec implementation.
static av_cold int mimic_init_thread_copy(AVCodecContext *avctx)
Libavcodec external API header.
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)
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
enum AVPictureType pict_type
Picture type of the frame.
static av_cold int mimic_decode_end(AVCodecContext *avctx)
int width
picture width / height.
GLsizei GLboolean const GLfloat * value
#define FF_CEIL_RSHIFT(a, b)
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 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)
static int mimic_decode_update_thread_context(AVCodecContext *avctx, const AVCodecContext *avctx_from)
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.
#define init_vlc(vlc, nb_bits, nb_codes,bits, bits_wrap, bits_size,codes, codes_wrap, codes_size,flags)
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1.
static unsigned int get_bits1(GetBitContext *s)
BYTE int const BYTE int int int height
#define FF_THREAD_FRAME
Decode more than one frame at once.
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
static void prepare_avpic(MimicContext *ctx, AVPicture *dst, AVFrame *src)
Flip the buffer upside-down and put it in the YVU order to match the way Mimic encodes frames...
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
common internal api header.
#define CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
static int mimic_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
#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.