54 typedef struct svq1_pmv_s {
74 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
75 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
76 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
77 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
78 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
79 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
80 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
81 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
82 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
83 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
84 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
85 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
86 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
87 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
88 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
89 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
90 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
91 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
92 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
93 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
94 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
95 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
96 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
97 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
98 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
99 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
100 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
101 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
102 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
103 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
104 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
105 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
108 #define SVQ1_PROCESS_VECTOR() \
109 for (; level > 0; i++) { \
117 if (get_bits1(bitbuf) == 0) \
120 list[n++] = list[i]; \
121 list[n++] = list[i] + \
122 (((level & 1) ? pitch : 1) << (level / 2 + 1)); \
125 #define SVQ1_ADD_CODEBOOK() \
127 for (j = 0; j < stages; j++) { \
128 n3 = codebook[entries[j]] ^ 0x80808080; \
129 n1 += (n3 & 0xFF00FF00) >> 8; \
130 n2 += n3 & 0x00FF00FF; \
134 if (n1 & 0xFF00FF00) { \
135 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
137 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
138 n1 &= n3 & 0x00FF00FF; \
141 if (n2 & 0xFF00FF00) { \
142 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
144 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
145 n2 &= n3 & 0x00FF00FF; \
148 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
149 codebook = (const uint32_t *)cbook[level]; \
151 bit_cache = get_bits(bitbuf, 4 * stages); \
153 for (j = 0; j < stages; j++) { \
154 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
155 16 * j) << (level + 1); \
157 mean -= stages * 128; \
158 n4 = mean + (mean >> 31) << 16 | (mean & 0xFFFF);
166 const uint32_t *codebook;
171 uint32_t n1, n2, n3, n4;
177 for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
181 dst = (uint32_t *)list[i];
182 width = 1 << ((4 +
level) / 2);
183 height = 1 << ((3 +
level) / 2);
186 stages =
get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
189 for (y = 0; y <
height; y++)
190 memset(&dst[y * (pitch / 4)], 0, width);
194 if (stages > 0 && level >= 4) {
196 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
204 for (y = 0; y <
height; y++)
205 memset(&dst[y * (pitch / 4)], mean, width);
209 for (y = 0; y <
height; y++) {
210 for (x = 0; x < width / 4; x++, codebook++) {
215 dst[x] = n1 << 8 | n2;
231 const uint32_t *codebook;
236 uint32_t n1, n2, n3, n4;
242 for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
246 dst = (uint32_t *)list[i];
247 width = 1 << ((4 +
level) / 2);
248 height = 1 << ((3 +
level) / 2);
251 stages =
get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
256 if ((stages > 0) && (level >= 4)) {
258 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
267 for (y = 0; y <
height; y++) {
268 for (x = 0; x < width / 4; x++, codebook++) {
271 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
272 n2 = n4 + (n3 & 0x00FF00FF);
275 dst[x] = n1 << 8 | n2;
289 for (i = 0; i < 2; i++) {
310 int pitch,
int x,
int y)
316 src = &previous[x + y * pitch];
319 for (i = 0; i < 16; i++) {
320 memcpy(dst, src, 16);
328 int pitch,
svq1_pmv *motion,
int x,
int y,
343 pmv[1] = &motion[x / 8 + 2];
344 pmv[2] = &motion[x / 8 + 4];
353 motion[x / 8 + 2].
x =
354 motion[x / 8 + 3].
x = mv.
x;
356 motion[x / 8 + 2].
y =
357 motion[x / 8 + 3].
y = mv.
y;
359 mv.
x = av_clip(mv.
x, -2 * x, 2 * (width - x - 16));
360 mv.
y = av_clip(mv.
y, -2 * y, 2 * (height - y - 16));
362 src = &previous[(x + (mv.
x >> 1)) + (y + (mv.
y >> 1)) * pitch];
372 int pitch,
svq1_pmv *motion,
int x,
int y,
387 pmv[1] = &motion[(x / 8) + 2];
388 pmv[2] = &motion[(x / 8) + 4];
402 pmv[1] = &motion[(x / 8) + 3];
411 pmv[2] = &motion[(x / 8) + 1];
419 pmv[2] = &motion[(x / 8) + 2];
420 pmv[3] = &motion[(x / 8) + 3];
428 for (i = 0; i < 4; i++) {
429 int mvx = pmv[i]->x + (i & 1) * 16;
430 int mvy = pmv[i]->y + (i >> 1) * 16;
433 mvx = av_clip(mvx, -2 * x, 2 * (width - x - 8));
434 mvy = av_clip(mvy, -2 * y, 2 * (height - y - 8));
436 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
439 hdsp->
put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst, src, pitch, 8);
443 current += 8 * (pitch - 1);
454 int pitch,
svq1_pmv *motion,
int x,
int y,
467 motion[x / 8 + 2].
x =
468 motion[x / 8 + 2].
y =
469 motion[x / 8 + 3].
x =
470 motion[x / 8 + 3].
y = 0;
473 switch (block_type) {
480 pitch, motion, x, y, width, height);
483 av_dlog(avctx,
"Error in svq1_motion_inter_block %i\n", result);
491 pitch, motion, x, y, width, height);
494 av_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n", result);
516 for (i = 1; i <= out[0]; i++) {
555 av_dlog(avctx,
"%s checksum (%02x) for packet data\n",
556 (csum == 0) ?
"correct" :
"incorrect", csum);
565 "embedded message: \"%s\"\n", (
char *)msg);
573 frame_size_code =
get_bits(bitbuf, 3);
575 if (frame_size_code == 7) {
615 int buf_size = avpkt->
size;
635 if (buf_size < 9 * 4) {
652 for (i = 0; i < 4; i++)
653 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
659 av_dlog(avctx,
"Error in svq1_decode_frame_header %i\n", result);
682 for (i = 0; i < 3; i++) {
694 current = cur->
data[i];
698 for (y = 0; y <
height; y += 16) {
699 for (x = 0; x <
width; x += 16) {
704 "Error in svq1_decode_block %i (keyframe)\n",
709 current += 16 * linesize;
721 memset(pmv, 0, ((width / 8) + 3) *
sizeof(
svq1_pmv));
723 for (y = 0; y <
height; y += 16) {
724 for (x = 0; x <
width; x += 16) {
728 pmv, x, y, width, height);
731 "Error in svq1_decode_delta_block %i\n",
740 current += 16 * linesize;
784 for (i = 0; i < 6; i++) {
785 static const uint8_t sizes[2][6] = { { 14, 10, 14, 18, 16, 18 },
786 { 10, 10, 14, 14, 14, 16 } };
788 svq1_intra_multistage[i].
table = &table[offset];
790 offset += sizes[0][i];
791 init_vlc(&svq1_intra_multistage[i], 3, 8,
795 svq1_inter_multistage[i].
table = &table[offset];
797 offset += sizes[1][i];
798 init_vlc(&svq1_inter_multistage[i], 3, 8,
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
discard all frames except keyframes
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static VLC svq1_inter_multistage[6]
This structure describes decoded (raw) audio or video data.
static int svq1_motion_inter_4v_block(HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, int pitch, svq1_pmv *motion, int x, int y, int width, int height)
static VLC svq1_motion_component
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
uint16_t ff_svq1_packet_checksum(const uint8_t *data, const int length, int value)
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.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
enum AVDiscard skip_frame
const uint16_t ff_svq1_frame_size_table[7][2]
static av_cold int svq1_decode_end(AVCodecContext *avctx)
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
static VLC svq1_intra_mean
const int8_t *const ff_svq1_inter_codebooks[6]
#define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)
static VLC svq1_intra_multistage[6]
const uint8_t ff_mvtab[33][2]
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
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.
bitstream reader API header.
#define SVQ1_ADD_CODEBOOK()
static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame)
int width
width and height of the video frame
#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 const int sizes[][2]
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. ...
#define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)
void av_log(void *avcl, int level, const char *fmt,...)
const char * name
Name of the codec implementation.
static void svq1_skip_block(uint8_t *current, uint8_t *previous, int pitch, int x, int y)
Sorenson Vector Quantizer #1 (SVQ1) video codec.
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
enum AVPictureType pict_type
Picture type of the frame.
static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels, int pitch)
static void svq1_parse_string(GetBitContext *bitbuf, uint8_t *out)
const uint8_t ff_svq1_block_type_vlc[4][2]
int width
picture width / height.
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
static void svq1_flush(AVCodecContext *avctx)
int pkt_swapped_allocated
#define INIT_VLC_USE_NEW_STATIC
const uint8_t ff_svq1_inter_multistage_vlc[6][8][2]
static int svq1_decode_delta_block(AVCodecContext *avctx, HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, int pitch, svq1_pmv *motion, int x, int y, int width, int height)
static const int8_t mv[256][2]
#define AV_LOG_INFO
Standard information.
Libavcodec external API header.
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.
#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 VLC svq1_inter_mean
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits1(GetBitContext *s)
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
static int svq1_motion_inter_block(HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, int pitch, svq1_pmv *motion, int x, int y, int width, int height)
static void skip_bits(GetBitContext *s, int n)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static int svq1_decode_block_non_intra(GetBitContext *bitbuf, uint8_t *pixels, int pitch)
static av_const int sign_extend(int val, unsigned bits)
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
#define SVQ1_BLOCK_INTER_4V
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
discard all non reference
static int svq1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
const int8_t *const ff_svq1_intra_codebooks[6]
common internal api header.
#define CODEC_FLAG_GRAY
Only decode/encode grayscale.
const uint8_t ff_svq1_intra_multistage_vlc[6][8][2]
static av_cold void flush(AVCodecContext *avctx)
Flush (reset) the frame ID after seeking.
static const uint8_t string_table[256]
static int svq1_decode_motion_vector(GetBitContext *bitbuf, svq1_pmv *mv, svq1_pmv **pmv)
const uint16_t ff_svq1_inter_mean_vlc[512][2]
static av_cold int init(AVCodecParserContext *s)
#define SVQ1_PROCESS_VECTOR()
VLC_TYPE(* table)[2]
code, bits
static av_cold int svq1_decode_init(AVCodecContext *avctx)
static VLC svq1_block_type
AVPixelFormat
Pixel format.
This structure stores compressed data.
const uint16_t ff_svq1_intra_mean_vlc[256][2]
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.