56 { 0, 1, 5, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0 },
57 { 0, 3, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0 }
61 { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125 },
62 { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119 }
66 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
67 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
68 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08,
69 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0,
70 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16,
71 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28,
72 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
73 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
74 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
75 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
76 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
77 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
78 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
79 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
80 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6,
81 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5,
82 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4,
83 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,
84 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA,
85 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
87 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
88 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
89 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
90 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0,
91 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34,
92 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26,
93 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38,
94 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
95 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
96 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
97 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
98 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
99 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
100 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5,
101 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4,
102 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3,
103 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2,
104 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA,
105 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
106 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
116 { 0, 2, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
117 { 0, 1, 5, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
121 { 0, 7, 6, 5, 8, 4, 3, 1, 2 },
122 { 0, 2, 3, 4, 5, 6, 7, 1, 8 }
125 #define MAX_ENTRIES 162
147 const uint8_t *syms,
int num_syms)
152 int prefix = 0, max_bits = 0, idx = 0;
154 for (i = 0; i < 16; i++) {
155 for (j = 0; j < lens[i]; j++) {
157 codes[idx] = prefix++;
165 codes, 2, 2, syms, 1, 1, 0);
172 for (i = 0; i < 2; i++) {
192 for (i = 0; i < 2; i++) {
214 if (val < (1 << (nbits - 1)))
215 val -= (1 << nbits) - 1;
228 int *
block,
int *dc_cache,
229 int bx,
int by, uint16_t *quant_mat)
231 int skip, val, pos = 1, zz_pos, dc;
233 memset(block, 0,
sizeof(*block) * 64);
253 dc += dc_cache[
LEFT];
256 block[0] = dc * quant_mat[0];
275 block[zz_pos] = val * quant_mat[zz_pos];
279 return pos == 64 ? 0 : -1;
283 uint8_t *dst[3],
int mb_x,
int mb_y)
288 for (j = 0; j < 2; j++) {
289 for (i = 0; i < 2; i++) {
290 int xpos = mb_x * 2 + i;
306 for (i = 1; i < 3; i++) {
317 out = dst[i] + mb_x * 16;
320 for (j = 0; j < 16; j++) {
321 for (k = 0; k < 8; k++)
331 int *sel_len,
int *prev)
335 for (i = 2; i >= 0; i--) {
341 if (sel_len[i] > 0) {
343 vec_pos[i] =
get_bits(gb, sel_len[i]);
344 if (vec_pos[i] >= pval)
347 vec_pos[i] = !prev[i];
351 vec_pos[i] = prev[i];
357 int vec_size,
int component,
int shift,
int *prev)
359 if (vec_pos < vec_size)
362 return prev[component];
363 prev[component] =
get_bits(gb, 8 - shift) << shift;
364 return prev[component];
367 #define MKVAL(vals) (vals[0] | (vals[1] << 3) | (vals[2] << 6))
381 uint8_t *picdst[3],
int mb_x,
int mb_y)
385 int sel_len[3], sel_flag[3];
386 int i, j, k, mode,
split;
387 int prev_vec1 = 0, prev_split = 0;
389 int prev_pix[3] = { 0 };
390 int prev_mode[16] = { 0 };
393 const int val_shift = ctx->
quality == 100 ? 0 : 2;
395 for (i = 0; i < 3; i++)
398 for (i = 0; i < 3; i++) {
400 for (j = 0; j < vec_len[i]; j++) {
405 sel_flag[i] = vec_len[i] > 1;
406 sel_len[i] = vec_len[i] > 2 ? vec_len[i] - 2 : 0;
409 for (j = 0; j < 16; j++) {
414 vals[0] = vals[1] = vals[2] = 0;
421 for (i = 0; i < 16; i++) {
423 vals[0] = prev_mode[i] & 7;
424 vals[1] = (prev_mode[i] >> 3) & 7;
425 vals[2] = prev_mode[i] >> 6;
426 if (mode == 1 && i == split) {
429 }
else if (mode == 2) {
433 for (k = 0; k < 3; k++)
436 val_shift, prev_pix);
437 prev_mode[i] =
MKVAL(vals);
442 if (split >= prev_split)
449 vals[0] = prev_mode[0] & 7;
450 vals[1] = (prev_mode[0] >> 3) & 7;
451 vals[2] = prev_mode[0] >> 6;
452 for (i = 0; i < 3; i++) {
453 for (k = 0; k <
split; k++) {
455 vec_len[i], i, val_shift,
457 prev_mode[k] =
MKVAL(vals);
463 vals[0] = prev_vec1 & 7;
464 vals[1] = (prev_vec1 >> 3) & 7;
465 vals[2] = prev_vec1 >> 6;
468 prev_vec1 =
MKVAL(vals);
470 for (i = 0; i < 3; i++) {
471 for (k = 0; k < 16 -
split; k++) {
473 vec_len[i], i, val_shift,
475 prev_mode[split + k] =
MKVAL(vals);
482 for (i = 0; i < 3; i++)
483 for (j = 0; j < 16; j++)
484 memcpy(picdst[i] + mb_x * 16 + j * ctx->
pic.
linesize[i],
485 ctx->
imgbuf[i] + j * 16, 16);
499 for (i = 0; i < 2; i++)
500 c->
prev_dc[0][mb_x * 2 + i] = 0;
502 for (i = 1; i < 3; i++) {
513 int buf_size = avpkt->
size;
519 int x, y, i, mb_width, mb_height, blk_type;
524 "Frame should have at least %d bytes, got %d instead\n",
530 width = bytestream2_get_be16(&bc);
531 height = bytestream2_get_be16(&bc);
533 quality = bytestream2_get_byte(&bc);
534 frame_type = bytestream2_get_byte(&bc);
536 if (width > avctx->
width ||
537 height != avctx->
height) {
542 if (quality < 1 || quality > 100) {
546 if ((frame_type & ~3) || frame_type == 3) {
553 "Empty frame found but it is not a skip frame.\n");
577 for (i = 0; i < 2; i++)
583 mb_width =
FFALIGN(width, 16) >> 4;
584 mb_height =
FFALIGN(height, 16) >> 4;
590 for (y = 0; y < mb_height; y++) {
592 for (x = 0; x < mb_width; x++) {
598 "Error decoding DCT block %d,%d\n",
606 "Error decoding VQ block %d,%d\n",
642 for (i = 0; i < 3; i++) {
665 for (i = 0; i < 3; i++)
static av_cold int mss4_decode_end(AVCodecContext *avctx)
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
void ff_mss34_gen_quant_mat(uint16_t *qmat, int quality, int luma)
Generate quantisation matrix for given quality.
const uint8_t ff_zigzag_direct[64]
uint16_t quant_mat[2][64]
static int mss4_decode_dct_block(MSS4Context *c, GetBitContext *gb, uint8_t *dst[3], int mb_x, int mb_y)
This structure describes decoded (raw) audio or video data.
FrameType
G723.1 frame types.
int buffer_hints
codec suggestion on buffer type if != 0
void(* release_buffer)(struct AVCodecContext *c, AVFrame *pic)
Called to release buffers which were allocated with get_buffer.
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
AVFrame * coded_frame
the picture in the bitstream
void ff_mss34_dct_put(uint8_t *dst, int stride, int *block)
Transform and output DCT block.
static void read_vec_pos(GetBitContext *gb, int *vec_pos, int *sel_flag, int *sel_len, int *prev)
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)
int(* reget_buffer)(struct AVCodecContext *c, AVFrame *pic)
Called at the beginning of a frame to get cr buffer for it.
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
int ff_init_vlc_sparse(VLC *vlc, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
static int mss4_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
bitstream reader API header.
static av_always_inline int get_coeff_bits(GetBitContext *gb, int nbits)
static int init(AVCodecParserContext *s)
int reference
is this picture used as reference The values for this are the same as the MpegEncContext.picture_structure variable, that is 1->top field, 2->bottom field, 3->frame/both fields.
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
static const uint8_t vec_len_syms[2][4]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static int get_value_cached(GetBitContext *gb, int vec_pos, uint8_t *vec, int vec_size, int component, int shift, int *prev)
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
void av_log(void *avcl, int level, const char *fmt,...)
const char * name
Name of the codec implementation.
static const uint8_t mss4_ac_vlc_syms[2][162]
static int get_coeff(GetBitContext *gb, VLC *vlc)
static char * split(char *message, char delim)
static av_cold void mss4_free_vlcs(MSS4Context *ctx)
enum AVPictureType pict_type
Picture type of the frame, see ?_TYPE below.
static av_cold int mss4_init_vlc(VLC *vlc, const uint8_t *lens, const uint8_t *syms, int num_syms)
int width
picture width / height.
static const uint8_t mss4_dc_vlc_lens[2][16]
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
struct MSS4Context MSS4Context
static av_cold int mss4_init_vlcs(MSS4Context *ctx)
int linesize[AV_NUM_DATA_POINTERS]
Size, in bytes, of the data for each picture/channel plane.
main external API structure.
static void close(AVCodecParserContext *s)
static void mss4_update_dc_cache(MSS4Context *c, int mb_x)
static av_cold int mss4_decode_init(AVCodecContext *avctx)
static unsigned int get_bits1(GetBitContext *s)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
#define FF_BUFFER_HINTS_REUSABLE
static const uint8_t mss4_ac_vlc_lens[2][16]
#define FF_BUFFER_HINTS_PRESERVE
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static const uint8_t mss4_vec_entry_vlc_lens[2][16]
static int mss4_decode_image_block(MSS4Context *ctx, GetBitContext *gb, uint8_t *picdst[3], int mb_x, int mb_y)
static int get_unary(GetBitContext *gb, int stop, int len)
Get unary code of limited length.
#define AVERROR_INVALIDDATA
static int decode012(GetBitContext *gb)
VLC_TYPE(* table)[2]
code, bits
int key_frame
1 -> keyframe, 0-> not
#define FF_BUFFER_HINTS_VALID
static int mss4_decode_dct(GetBitContext *gb, VLC *dc_vlc, VLC *ac_vlc, int *block, int *dc_cache, int bx, int by, uint16_t *quant_mat)
uint8_t imgbuf[3][16 *16]
This structure stores compressed data.
void ff_free_vlc(VLC *vlc)
static const uint8_t mss4_vec_entry_vlc_syms[2][9]