39 #define MIMIC_HEADER_SIZE 20 40 #define MIMIC_VLC_BITS 11 73 0x10, 0x20, 0x30, 0x00, 0x11, 0x40, 0x50, 0x12, 0x13, 0x21, 0x31, 0x60,
74 0x14, 0x15, 0x16, 0x22, 0x41, 0x17, 0x18, 0x23, 0x24, 0x25, 0x32, 0x42,
75 0x51, 0x61, 0x70, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x26, 0x27,
76 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x33, 0x34, 0x35, 0x36, 0x37,
77 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x43, 0x44, 0x45, 0x46, 0x47,
78 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x52, 0x53, 0x54, 0x55, 0x56,
79 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x62, 0x63, 0x64, 0x65,
80 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x71, 0x72, 0x73,
81 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E,
85 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8,
86 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12,
87 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17,
88 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21,
89 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26,
90 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30,
94 0, 8, 1, 2, 9, 16, 24, 17,
95 10, 3, 4, 11, 18, 25, 32, 40,
96 33, 26, 19, 12, 5, 6, 13, 20,
97 27, 34, 41, 48, 56, 49, 42, 35,
98 28, 21, 14, 7, 15, 22, 29, 36,
99 43, 50, 57, 58, 51, 44, 37, 30,
100 23, 31, 38, 45, 52, 59, 39, 46,
101 53, 60, 61, 54, 47, 55, 62, 63,
159 if (avctx == avctx_from)
167 if (i !=
src->next_cur_index &&
src->frames[i].f->data[0]) {
182 { -7, 7, -6, 6, -5, 5, -4, 4, },
183 { -15, 15, -14, 14, -13, 13, -12, 12,
184 -11, 11, -10, 10, -9, 9, -8, 8, },
185 { -31, 31, -30, 30, -29, 29, -28, 28,
186 -27, 27, -26, 26, -25, 25, -24, 24,
187 -23, 23, -22, 22, -21, 21, -20, 20,
188 -19, 19, -18, 18, -17, 17, -16, 16, },
189 { -63, 63, -62, 62, -61, 61, -60, 60,
190 -59, 59, -58, 58, -57, 57, -56, 56,
191 -55, 55, -54, 54, -53, 53, -52, 52,
192 -51, 51, -50, 50, -49, 49, -48, 48,
193 -47, 47, -46, 46, -45, 45, -44, 44,
194 -43, 43, -42, 42, -41, 41, -40, 40,
195 -39, 39, -38, 38, -37, 37, -36, 36,
196 -35, 35, -34, 34, -33, 33, -32, 32, },
197 { -127, 127, -126, 126, -125, 125, -124, 124,
198 -123, 123, -122, 122, -121, 121, -120, 120,
199 -119, 119, -118, 118, -117, 117, -116, 116,
200 -115, 115, -114, 114, -113, 113, -112, 112,
201 -111, 111, -110, 110, -109, 109, -108, 108,
202 -107, 107, -106, 106, -105, 105, -104, 104,
203 -103, 103, -102, 102, -101, 101, -100, 100,
204 -99, 99, -98, 98, -97, 97, -96, 96, },
205 { -95, 95, -94, 94, -93, 93, -92, 92,
206 -91, 91, -90, 90, -89, 89, -88, 88,
207 -87, 87, -86, 86, -85, 85, -84, 84,
208 -83, 83, -82, 82, -81, 81, -80, 80,
209 -79, 79, -78, 78, -77, 77, -76, 76,
210 -75, 75, -74, 74, -73, 73, -72, 72,
211 -71, 71, -70, 70, -69, 69, -68, 68,
212 -67, 67, -66, 66, -65, 65, -64, 64, },
224 for (pos = 1; pos < num_coeffs; pos++) {
225 uint32_t vlc, num_bits;
251 coeff = (coeff * qscale) / 1001;
262 int ret, y, x, plane, cur_row = 0;
264 for (plane = 0; plane < 3; plane++) {
265 const int is_chroma = !!plane;
266 const int qscale = av_clip(10000 - quality, is_chroma ? 1000 : 2000,
278 if (is_iframe ||
get_bits1(&ctx->
gb) == is_chroma) {
282 if (is_chroma || is_iframe || !
get_bits1(&ctx->
gb)) {
303 "No such backreference! Buggy sample.\n");
336 for (i = 0; i < 3; i++)
344 int buf_size = avpkt->
size;
353 if (buf_size <= MIMIC_HEADER_SIZE) {
360 quality = bytestream2_get_le16u(&gb);
361 width = bytestream2_get_le16u(&gb);
362 height = bytestream2_get_le16u(&gb);
364 is_pframe = bytestream2_get_le32u(&gb);
365 num_coeffs = bytestream2_get_byteu(&gb);
371 if (!(width == 160 && height == 120) &&
372 !(width == 320 && height == 240)) {
383 for (i = 0; i < 3; i++) {
414 (
const uint32_t *) (buf + MIMIC_HEADER_SIZE),
418 res =
decode(ctx, quality, num_coeffs, !is_pframe);
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#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
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...
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before ff_thread_await_progress() has been called on them.reget_buffer() and buffer age optimizations no longer work.*The contents of buffers must not be written to after ff_thread_report_progress() has been called on them.This includes draw_edges().Porting codecs to frame threading
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
The exact code depends on how similar the blocks are and how related they are to the block
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.
GLsizei GLboolean const GLfloat * value
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.
bitstream reader API header.
#define FF_CODEC_CAP_ALLOCATE_PROGRESS
#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)
static av_cold void mimic_init_static(void)
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have so the codec calls ff_thread_report set FF_CODEC_CAP_ALLOCATE_PROGRESS in AVCodec caps_internal and use ff_thread_get_buffer() to allocate frames.The frames must then be freed with ff_thread_release_buffer().Otherwise decode directly into the user-supplied frames.Call ff_thread_report_progress() after some part of the current picture has decoded.A good place to put this is where draw_horiz_band() is called-add this if it isn't called anywhere
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)
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call ff_thread_finish_setup() afterwards.If some code can't be moved
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.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about quality
#define INIT_VLC_STATIC_FROM_LENGTHS(vlc, bits, nb_codes, lens, len_wrap,symbols, symbols_wrap, symbols_size,offset, flags, static_size)
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)
int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src)
#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.
main external API structure.
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1.
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have update_thread_context() run it in the next thread.Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities.There will be very little speed gain at this point but it should work.If there are inter-frame dependencies
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.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static const uint8_t huffsyms[]
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)
static int ff_thread_once(char *control, void(*routine)(void))
VLC_TYPE(* table)[2]
code, bits
static const double coeff[2][5]
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
This structure stores compressed data.
#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)