53 #define VMD_HEADER_SIZE 0x330
54 #define PALETTE_COUNT 256
65 const unsigned char *
buf;
75 #define QUEUE_SIZE 0x1000
76 #define QUEUE_MASK 0x0FFF
78 static void lz_unpack(
const unsigned char *src,
int src_len,
79 unsigned char *dest,
int dest_len)
85 unsigned int dataleft;
86 unsigned int chainofs;
87 unsigned int chainlen;
96 dataleft = bytestream2_get_le32(&gb);
100 if (bytestream2_peek_le32(&gb) == 0x56781234) {
101 bytestream2_get_le32(&gb);
110 tag = bytestream2_get_byteu(&gb);
111 if ((tag == 0xFF) && (dataleft > 8)) {
114 for (i = 0; i < 8; i++) {
115 queue[qpos++] = *d++ = bytestream2_get_byteu(&gb);
120 for (i = 0; i < 8; i++) {
126 queue[qpos++] = *d++ = bytestream2_get_byte(&gb);
130 chainofs = bytestream2_get_byte(&gb);
131 chainofs |= ((bytestream2_peek_byte(&gb) & 0xF0) << 4);
132 chainlen = (bytestream2_get_byte(&gb) & 0x0F) + 3;
133 if (chainlen == speclen) {
134 chainlen = bytestream2_get_byte(&gb) + 0xF + 3;
136 if (d + chainlen > d_end)
138 for (j = 0; j < chainlen; j++) {
140 queue[qpos++] = *d++;
143 dataleft -= chainlen;
151 static int rle_unpack(
const unsigned char *src,
unsigned char *dest,
152 int src_count,
int src_size,
int dest_len)
156 unsigned char *dest_end = dest + dest_len;
165 *pd++ = bytestream2_get_byteu(&gb);
172 l = bytestream2_get_byteu(&gb);
183 for (i = 0; i < l; i++) {
190 }
while (used < src_count);
198 unsigned int *palette32;
199 unsigned char r,
g,
b;
209 int frame_x, frame_y;
210 int frame_width, frame_height;
214 frame_width =
AV_RL16(&s->
buf[10]) - frame_x + 1;
215 frame_height =
AV_RL16(&s->
buf[12]) - frame_y + 1;
216 if (frame_x < 0 || frame_width < 0 ||
221 "Invalid horizontal range %d-%d\n",
222 frame_x, frame_width);
225 if (frame_y < 0 || frame_height < 0 ||
230 "Invalid vertical range %d-%d\n",
231 frame_x, frame_width);
236 (frame_x || frame_y)) {
247 (frame_x || frame_y || (frame_width != s->
avctx->
width) ||
256 if (s->
buf[15] & 0x02) {
258 palette32 = (
unsigned int *)s->
palette;
261 r = bytestream2_get_byteu(&gb) * 4;
262 g = bytestream2_get_byteu(&gb) * 4;
263 b = bytestream2_get_byteu(&gb) * 4;
264 palette32[i] = (r << 16) | (g << 8) | (
b);
279 meth = bytestream2_get_byteu(&gb);
283 "Trying to unpack LZ-compressed frame with no LZ buffer\n");
292 dp = &frame->
data[0][frame_y * frame->
linesize[0] + frame_x];
296 for (i = 0; i < frame_height; i++) {
299 len = bytestream2_get_byte(&gb);
301 len = (len & 0x7F) + 1;
302 if (ofs + len > frame_width ||
311 memcpy(&dp[ofs], &pp[ofs], len + 1);
314 }
while (ofs < frame_width);
315 if (ofs > frame_width) {
317 "VMD video: offset > width (%d > %d)\n",
327 for (i = 0; i < frame_height; i++) {
335 for (i = 0; i < frame_height; i++) {
338 len = bytestream2_get_byte(&gb);
340 len = (len & 0x7F) + 1;
341 if (bytestream2_peek_byte(&gb) == 0xFF) {
343 bytestream2_get_byte(&gb);
357 memcpy(&dp[ofs], &pp[ofs], len + 1);
360 }
while (ofs < frame_width);
361 if (ofs > frame_width) {
363 "VMD video: offset > width (%d > %d)\n",
389 unsigned int *palette32;
390 int palette_index = 0;
391 unsigned char r,
g,
b;
392 unsigned char *vmd_header;
393 unsigned char *raw_palette;
404 vmd_header = (
unsigned char *)avctx->
extradata;
414 raw_palette = &vmd_header[28];
415 palette32 = (
unsigned int *)s->
palette;
417 r = raw_palette[palette_index++] * 4;
418 g = raw_palette[palette_index++] * 4;
419 b = raw_palette[palette_index++] * 4;
420 palette32[i] = (r << 16) | (g << 8) | (
b);
433 void *
data,
int *got_frame,
437 int buf_size = avpkt->
size;
475 #define BLOCK_TYPE_AUDIO 1
476 #define BLOCK_TYPE_INITIAL 2
477 #define BLOCK_TYPE_SILENCE 3
485 0x000, 0x008, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070, 0x080,
486 0x090, 0x0A0, 0x0B0, 0x0C0, 0x0D0, 0x0E0, 0x0F0, 0x100, 0x110, 0x120,
487 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1A0, 0x1B0, 0x1C0,
488 0x1D0, 0x1E0, 0x1F0, 0x200, 0x208, 0x210, 0x218, 0x220, 0x228, 0x230,
489 0x238, 0x240, 0x248, 0x250, 0x258, 0x260, 0x268, 0x270, 0x278, 0x280,
490 0x288, 0x290, 0x298, 0x2A0, 0x2A8, 0x2B0, 0x2B8, 0x2C0, 0x2C8, 0x2D0,
491 0x2D8, 0x2E0, 0x2E8, 0x2F0, 0x2F8, 0x300, 0x308, 0x310, 0x318, 0x320,
492 0x328, 0x330, 0x338, 0x340, 0x348, 0x350, 0x358, 0x360, 0x368, 0x370,
493 0x378, 0x380, 0x388, 0x390, 0x398, 0x3A0, 0x3A8, 0x3B0, 0x3B8, 0x3C0,
494 0x3C8, 0x3D0, 0x3D8, 0x3E0, 0x3E8, 0x3F0, 0x3F8, 0x400, 0x440, 0x480,
495 0x4C0, 0x500, 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700,
496 0x740, 0x780, 0x7C0, 0x800, 0x900, 0xA00, 0xB00, 0xC00, 0xD00, 0xE00,
497 0xF00, 0x1000, 0x1400, 0x1800, 0x1C00, 0x2000, 0x3000, 0x4000
525 "block align = %d, sample rate = %d\n",
536 const uint8_t *buf_end = buf + buf_size;
538 int st = channels - 1;
541 for (ch = 0; ch < channels; ch++) {
542 predictor[ch] = (int16_t)
AV_RL16(buf);
544 *out++ = predictor[ch];
549 while (buf < buf_end) {
555 predictor[ch] = av_clip_int16(predictor[ch]);
556 *out++ = predictor[ch];
562 int *got_frame_ptr,
AVPacket *avpkt)
567 int buf_size = avpkt->
size;
569 int block_type, silent_chunks, audio_chunks;
572 int16_t *output_samples_s16;
597 silent_chunks = av_popcount(flags);
600 }
else if (block_type == BLOCK_TYPE_SILENCE) {
618 output_samples_u8 = frame->
data[0];
619 output_samples_s16 = (int16_t *)frame->
data[0];
622 if (silent_chunks > 0) {
626 memset(output_samples_s16, 0x00, silent_size * 2);
627 output_samples_s16 += silent_size;
629 memset(output_samples_u8, 0x80, silent_size);
630 output_samples_u8 += silent_size;
635 if (audio_chunks > 0) {
636 buf_end = buf + (buf_size & ~(avctx->
channels > 1));
643 memcpy(output_samples_u8, buf, s->
chunk_size);
static int vmd_decode(VmdVideoContext *s, AVFrame *frame)
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
#define BLOCK_TYPE_SILENCE
#define AV_LOG_WARNING
Something somehow does not look correct.
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)
#define AV_CH_LAYOUT_STEREO
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
enum AVSampleFormat sample_fmt
audio sample format
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
8 bit with PIX_FMT_RGB32 palette
static int vmdvideo_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;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);returnNULL;}returnac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_dlog(ac->avr,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> out
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
unsigned char * unpack_buffer
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
#define BLOCK_TYPE_INITIAL
unsigned char palette[PALETTE_COUNT *4]
static void lz_unpack(const unsigned char *src, int src_len, unsigned char *dest, int dest_len)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
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 bytestream2_get_ne16
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
const unsigned char * buf
void av_log(void *avcl, int level, const char *fmt,...)
const char * name
Name of the codec implementation.
static int rle_unpack(const unsigned char *src, unsigned char *dest, int src_count, int src_size, int dest_len)
uint64_t channel_layout
Audio channel layout.
audio channel layout utility functions
int width
picture width / height.
static av_cold int vmdvideo_decode_end(AVCodecContext *avctx)
static av_cold int vmdaudio_decode_init(AVCodecContext *avctx)
if(ac->has_optimized_func)
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
static av_always_inline int bytestream2_tell(GetByteContext *g)
AVCodec ff_vmdaudio_decoder
static void decode_audio_s16(int16_t *out, const uint8_t *buf, int buf_size, int channels)
Libavcodec external API header.
int sample_rate
samples per second
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
main external API structure.
static void close(AVCodecParserContext *s)
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static int vmdaudio_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
AVCodec ff_vmdvideo_decoder
common internal api header.
common internal and external API header
static av_cold int vmdvideo_decode_init(AVCodecContext *avctx)
static av_cold int init(AVCodecParserContext *s)
int channels
number of audio channels
static const uint16_t vmdaudio_table[128]
#define AV_CH_LAYOUT_MONO
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.
int nb_samples
number of audio samples (per channel) described by this frame