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 146 const uint8_t *syms,
int num_syms)
151 int prefix = 0, max_bits = 0, idx = 0;
153 for (i = 0; i < 16; i++) {
154 for (j = 0; j < lens[i]; j++) {
156 codes[idx] = prefix++;
164 codes, 2, 2, syms, 1, 1, 0);
171 for (i = 0; i < 2; i++) {
191 for (i = 0; i < 2; i++) {
213 if (val < (1 << (nbits - 1)))
214 val -= (1 << nbits) - 1;
230 int skip,
val, pos = 1, zz_pos,
dc;
232 memset(block, 0,
sizeof(*block) * 64);
252 dc += dc_cache[
LEFT];
255 block[0] = dc * quant_mat[0];
274 block[zz_pos] = val * quant_mat[zz_pos];
278 return pos == 64 ? 0 : -1;
282 uint8_t *dst[3],
int mb_x,
int mb_y)
287 for (j = 0; j < 2; j++) {
288 for (i = 0; i < 2; i++) {
289 int xpos = mb_x * 2 + i;
305 for (i = 1; i < 3; i++) {
316 out = dst[i] + mb_x * 16;
319 for (j = 0; j < 16; j++) {
320 for (k = 0; k < 8; k++)
330 int *sel_len,
int *prev)
334 for (i = 2; i >= 0; i--) {
340 if (sel_len[i] > 0) {
342 vec_pos[i] =
get_bits(gb, sel_len[i]);
343 if (vec_pos[i] >= pval)
346 vec_pos[i] = !prev[i];
350 vec_pos[i] = prev[i];
356 int vec_size,
int component,
int shift,
int *prev)
358 if (vec_pos < vec_size)
361 return prev[component];
363 return prev[component];
366 #define MKVAL(vals) ((vals)[0] | ((vals)[1] << 3) | ((vals)[2] << 6)) 380 uint8_t *picdst[3],
int mb_x,
int mb_y)
384 int sel_len[3], sel_flag[3];
386 int prev_vec1 = 0, prev_split = 0;
388 int prev_pix[3] = { 0 };
389 int prev_mode[16] = { 0 };
392 const int val_shift = ctx->
quality == 100 ? 0 : 2;
394 for (i = 0; i < 3; i++)
397 for (i = 0; i < 3; i++) {
399 for (j = 0; j < vec_len[i]; j++) {
404 sel_flag[i] = vec_len[i] > 1;
405 sel_len[i] = vec_len[i] > 2 ? vec_len[i] - 2 : 0;
408 for (j = 0; j < 16; j++) {
413 vals[0] = vals[1] = vals[2] = 0;
420 for (i = 0; i < 16; i++) {
422 vals[0] = prev_mode[i] & 7;
423 vals[1] = (prev_mode[i] >> 3) & 7;
424 vals[2] = prev_mode[i] >> 6;
425 if (mode == 1 && i == split) {
428 }
else if (mode == 2) {
432 for (k = 0; k < 3; k++)
435 val_shift, prev_pix);
436 prev_mode[i] =
MKVAL(vals);
441 if (split >= prev_split)
448 vals[0] = prev_mode[0] & 7;
449 vals[1] = (prev_mode[0] >> 3) & 7;
450 vals[2] = prev_mode[0] >> 6;
451 for (i = 0; i < 3; i++) {
452 for (k = 0; k <
split; k++) {
454 vec_len[i], i, val_shift,
456 prev_mode[k] =
MKVAL(vals);
462 vals[0] = prev_vec1 & 7;
463 vals[1] = (prev_vec1 >> 3) & 7;
464 vals[2] = prev_vec1 >> 6;
467 prev_vec1 =
MKVAL(vals);
469 for (i = 0; i < 3; i++) {
470 for (k = 0; k < 16 -
split; k++) {
472 vec_len[i], i, val_shift,
474 prev_mode[split + k] =
MKVAL(vals);
481 for (i = 0; i < 3; i++)
482 for (j = 0; j < 16; j++)
483 memcpy(picdst[i] + mb_x * 16 + j * ctx->
pic->
linesize[i],
484 ctx->
imgbuf[i] + j * 16, 16);
498 for (i = 0; i < 2; i++)
499 c->
prev_dc[0][mb_x * 2 + i] = 0;
501 for (i = 1; i < 3; i++) {
512 int buf_size = avpkt->
size;
518 int x, y, i, mb_width, mb_height, blk_type;
523 "Frame should have at least %d bytes, got %d instead\n",
529 width = bytestream2_get_be16(&bc);
530 height = bytestream2_get_be16(&bc);
532 quality = bytestream2_get_byte(&bc);
533 frame_type = bytestream2_get_byte(&bc);
535 if (width > avctx->
width ||
536 height != avctx->
height) {
541 if (quality < 1 || quality > 100) {
545 if ((frame_type & ~3) || frame_type == 3) {
552 "Empty frame found but it is not a skip frame.\n");
571 for (i = 0; i < 2; i++)
578 mb_width =
FFALIGN(width, 16) >> 4;
579 mb_height =
FFALIGN(height, 16) >> 4;
585 for (y = 0; y < mb_height; y++) {
587 for (x = 0; x < mb_width; x++) {
593 "Error decoding DCT block %d,%d\n",
601 "Error decoding VQ block %d,%d\n",
635 for (i = 0; i < 3; i++)
652 for (i = 0; i < 3; i++) {
static av_cold int mss4_decode_end(AVCodecContext *avctx)
const char const char void * val
void ff_mss34_gen_quant_mat(uint16_t *qmat, int quality, int luma)
Generate quantisation matrix for given quality.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static int shift(int a, int b)
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.
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.
static av_cold int init(AVCodecContext *avctx)
static void read_vec_pos(GetBitContext *gb, int *vec_pos, int *sel_flag, int *sel_len, int *prev)
int ff_init_vlc_sparse(VLC *vlc_arg, 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)
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)
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
Identical in function to av_frame_make_writable(), except it uses ff_get_buffer() to allocate the buf...
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
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)
FrameType
G723.1 frame types.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
static const uint8_t vec_len_syms[2][4]
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. ...
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)
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)
void ff_mss34_dct_put(uint8_t *dst, ptrdiff_t stride, int *block)
Transform and output DCT block.
static av_cold void mss4_free_vlcs(MSS4Context *ctx)
enum AVPictureType pict_type
Picture type of the frame.
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]
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
static av_cold int mss4_init_vlcs(MSS4Context *ctx)
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
main external API structure.
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)
const uint8_t ff_zigzag_direct[64]
static const uint8_t mss4_ac_vlc_lens[2][16]
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> dc
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)
common internal api header.
static int get_unary(GetBitContext *gb, int stop, int len)
Get unary code of limited length.
static int decode012(GetBitContext *gb)
VLC_TYPE(* table)[2]
code, bits
int key_frame
1 -> keyframe, 0-> not
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)
#define av_malloc_array(a, b)
uint8_t imgbuf[3][16 *16]
This structure stores compressed data.
void ff_free_vlc(VLC *vlc)
mode
Use these values in ebur128_init (or'ed).
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static const uint8_t mss4_vec_entry_vlc_syms[2][9]