46 #define SVQ1_BLOCK_TYPE_VLC_BITS 3
55 typedef struct svq1_pmv_s {
78 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
79 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
80 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
81 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
82 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
83 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
84 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
85 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
86 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
87 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
88 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
89 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
90 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
91 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
92 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
93 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
94 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
95 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
96 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
97 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
98 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
99 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
100 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
101 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
102 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
103 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
104 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
105 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
106 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
107 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
108 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
109 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
112 #define SVQ1_PROCESS_VECTOR() \
113 for (; level > 0; i++) { \
121 if (!get_bits1(bitbuf)) \
124 list[n++] = list[i]; \
125 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
128 #define SVQ1_ADD_CODEBOOK() \
130 for (j = 0; j < stages; j++) { \
131 n3 = codebook[entries[j]] ^ 0x80808080; \
132 n1 += (n3 & 0xFF00FF00) >> 8; \
133 n2 += n3 & 0x00FF00FF; \
137 if (n1 & 0xFF00FF00) { \
138 n3 = (n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
140 n1 |= (~n1 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
141 n1 &= n3 & 0x00FF00FF; \
144 if (n2 & 0xFF00FF00) { \
145 n3 = (n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
147 n2 |= (~n2 >> 15 & 0x00010001 | 0x01000100) - 0x00010001; \
148 n2 &= n3 & 0x00FF00FF; \
151 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook) \
152 codebook = (const uint32_t *)cbook[level]; \
154 bit_cache = get_bits(bitbuf, 4 * stages); \
156 for (j = 0; j < stages; j++) { \
157 entries[j] = (((bit_cache >> (4 * (stages - j - 1))) & 0xF) + \
158 16 * j) << (level + 1); \
160 mean -= stages * 128; \
161 n4 = (mean << 16) + mean;
175 uint32_t n1, n2, n3, n4;
181 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
185 dst = (uint32_t *)list[
i];
193 for (y = 0; y <
height; y++)
194 memset(&dst[y * (pitch / 4)], 0,
width);
198 if ((stages > 0 &&
level >= 4)) {
200 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
209 for (y = 0; y <
height; y++)
210 memset(&dst[y * (pitch / 4)],
mean,
width);
214 for (y = 0; y <
height; y++) {
220 dst[x] = n1 << 8 | n2;
242 uint32_t n1, n2, n3, n4;
248 for (
i = 0, m = 1, n = 1,
level = 5;
i < n;
i++) {
252 dst = (uint32_t *)list[
i];
262 if ((stages > 0 &&
level >= 4)) {
264 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
274 for (y = 0; y <
height; y++) {
278 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
279 n2 = n4 + (n3 & 0x00FF00FF);
282 dst[x] = n1 << 8 | n2;
296 for (
i = 0;
i < 2;
i++) {
317 ptrdiff_t pitch,
int x,
int y)
323 src = &previous[x + y * pitch];
326 for (
i = 0;
i < 16;
i++) {
327 memcpy(dst,
src, 16);
335 ptrdiff_t pitch,
svq1_pmv *motion,
int x,
int y,
350 pmv[1] = &motion[x / 8 + 2];
351 pmv[2] = &motion[x / 8 + 4];
359 motion[x / 8 + 2].
x =
360 motion[x / 8 + 3].
x =
mv.x;
362 motion[x / 8 + 2].
y =
363 motion[x / 8 + 3].
y =
mv.y;
368 src = &previous[(x + (
mv.x >> 1)) + (y + (
mv.y >> 1)) * pitch];
378 ptrdiff_t pitch,
svq1_pmv *motion,
int x,
int y,
393 pmv[1] = &motion[(x / 8) + 2];
394 pmv[2] = &motion[(x / 8) + 4];
407 pmv[1] = &motion[(x / 8) + 3];
415 pmv[2] = &motion[(x / 8) + 1];
422 pmv[2] = &motion[(x / 8) + 2];
423 pmv[3] = &motion[(x / 8) + 3];
430 for (
i = 0;
i < 4;
i++) {
431 int mvx = pmv[
i]->
x + (
i & 1) * 16;
432 int mvy = pmv[
i]->
y + (
i >> 1) * 16;
438 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
445 current += 8 * (pitch - 1);
456 ptrdiff_t pitch,
svq1_pmv *motion,
int x,
int y,
470 motion[x / 8 + 2].
x =
471 motion[x / 8 + 2].
y =
472 motion[x / 8 + 3].
x =
473 motion[x / 8 + 3].
y = 0;
476 switch (block_type) {
486 ff_dlog(avctx,
"Error in svq1_motion_inter_block %i\n", result);
497 ff_dlog(avctx,
"Error in svq1_motion_inter_4v_block %i\n", result);
519 for (
i = 1;
i <=
out[0];
i++) {
554 if (
s->frame_code == 0x50 ||
s->frame_code == 0x60) {
559 ff_dlog(avctx,
"%s checksum (%02x) for packet data\n",
560 (csum == 0) ?
"correct" :
"incorrect", csum);
563 if ((
s->frame_code ^ 0x10) >= 0x50) {
569 "embedded message:\n%s\n", ((
char *)msg) + 1);
577 frame_size_code =
get_bits(bitbuf, 3);
579 if (frame_size_code == 7) {
623 int buf_size = avpkt->
size;
638 if ((
s->frame_code & ~0x70) || !(
s->frame_code & 0x60))
642 if (
s->frame_code != 0x20) {
645 if (buf_size < 9 * 4) {
651 &
s->pkt_swapped_allocated,
656 memcpy(
s->pkt_swapped, buf, buf_size);
657 buf =
s->pkt_swapped;
661 src = (uint32_t *)(
s->pkt_swapped + 4);
663 for (
i = 0;
i < 4;
i++)
669 ff_dlog(avctx,
"Error in svq1_decode_frame_header %i\n", result);
692 for (
i = 0;
i < 3;
i++) {
704 current = cur->
data[
i];
708 for (y = 0; y <
height; y += 16) {
709 for (x = 0; x <
width; x += 16) {
714 "Error in svq1_decode_block %i (keyframe)\n",
719 current += 16 * linesize;
725 s->prev->width !=
s->width ||
s->prev->height !=
s->height) {
732 for (y = 0; y <
height; y += 16) {
733 for (x = 0; x <
width; x += 16) {
740 "Error in svq1_decode_delta_block %i\n",
749 current += 16 * linesize;
777 for (
int i = 0,
offset = 0;
i < 6;
i++) {
778 static const uint8_t sizes[2][6] = { { 14, 10, 14, 18, 16, 18 },
779 { 10, 10, 14, 14, 14, 16 } };
815 s->width = avctx->
width + 3 & ~3;
816 s->height = avctx->
height + 3 & ~3;
832 s->pkt_swapped_allocated = 0;
834 s->pmv_allocated = 0;
static void flush(AVCodecContext *avctx)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Libavcodec external API header.
static av_cold int init(AVCodecContext *avctx)
static const unsigned codebook[256][2]
Public header for CRC hash function implementation.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
bitstream reader API header.
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
static int get_bits_left(GetBitContext *gb)
static unsigned int get_bits1(GetBitContext *s)
static void skip_bits(GetBitContext *s, int n)
static int skip_1stop_8data_bits(GetBitContext *gb)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static void skip_bits1(GetBitContext *s)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
@ AVDISCARD_ALL
discard all
@ AVDISCARD_NONKEY
discard all frames except keyframes
@ AVDISCARD_NONREF
discard all non reference
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...
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
void av_frame_unref(AVFrame *frame)
Unreference all the buffers referenced by frame and reset the frame fields.
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
@ AV_PICTURE_TYPE_I
Intra.
@ AV_PICTURE_TYPE_P
Predicted.
const uint8_t ff_mvtab[33][2]
av_cold void ff_hpeldsp_init(HpelDSPContext *c, int flags)
static const int sizes[][2]
static const int8_t mv[256][2]
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
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.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static int ff_thread_once(char *control, void(*routine)(void))
static enum AVPixelFormat pix_fmts[]
static av_const int sign_extend(int val, unsigned bits)
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
static const uint16_t table[]
main external API structure.
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int width
picture width / height.
int flags
AV_CODEC_FLAG_*.
enum AVDiscard skip_frame
Skip decoding for selected frames.
const char * name
Name of the codec implementation.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
enum AVPictureType pict_type
Picture type of the frame.
This structure stores compressed data.
op_pixels_func put_pixels_tab[4][4]
Halfpel motion compensation with rounding (a+b+1)>>1.
int pkt_swapped_allocated
VLC_TYPE(* table)[2]
code, bits
const uint16_t ff_svq1_frame_size_table[7][2]
Sorenson Vector Quantizer #1 (SVQ1) video codec.
#define SVQ1_BLOCK_INTER_4V
const uint8_t ff_svq1_intra_multistage_vlc[6][8][2]
const uint8_t ff_svq1_inter_multistage_vlc[6][8][2]
const int8_t *const ff_svq1_intra_codebooks[6]
const int8_t *const ff_svq1_inter_codebooks[6]
const uint16_t ff_svq1_inter_mean_vlc[512][2]
const uint16_t ff_svq1_intra_mean_vlc[256][2]
const uint8_t ff_svq1_block_type_vlc[4][2]
static int svq1_motion_inter_block(HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, ptrdiff_t pitch, svq1_pmv *motion, int x, int y, int width, int height)
static av_cold int svq1_decode_end(AVCodecContext *avctx)
static VLC svq1_inter_multistage[6]
static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame)
static int svq1_decode_motion_vector(GetBitContext *bitbuf, svq1_pmv *mv, svq1_pmv **pmv)
static VLC svq1_inter_mean
static av_cold int svq1_decode_init(AVCodecContext *avctx)
static const uint8_t string_table[256]
static int svq1_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
#define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)
#define SVQ1_BLOCK_TYPE_VLC_BITS
static void svq1_flush(AVCodecContext *avctx)
static VLC svq1_motion_component
static int svq1_decode_block_non_intra(GetBitContext *bitbuf, uint8_t *pixels, ptrdiff_t pitch)
static void svq1_parse_string(GetBitContext *bitbuf, uint8_t out[257])
#define SVQ1_ADD_CODEBOOK()
static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels, ptrdiff_t pitch)
static void svq1_skip_block(uint8_t *current, uint8_t *previous, ptrdiff_t pitch, int x, int y)
static av_cold void svq1_static_init(void)
static VLC svq1_intra_multistage[6]
static int svq1_decode_delta_block(AVCodecContext *avctx, HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, ptrdiff_t pitch, svq1_pmv *motion, int x, int y, int width, int height)
#define SVQ1_PROCESS_VECTOR()
static VLC svq1_intra_mean
static int svq1_motion_inter_4v_block(HpelDSPContext *hdsp, GetBitContext *bitbuf, uint8_t *current, uint8_t *previous, ptrdiff_t pitch, svq1_pmv *motion, int x, int y, int width, int height)
static VLC svq1_block_type
static float mean(const float *input, int size)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
static const uint8_t offset[127][2]
#define init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
#define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)
#define INIT_VLC_USE_NEW_STATIC