3 * ported to MPlayer by Arpi <arpi@thot.banki.hu>
4 * ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
6 * Copyright (c) 2002 The Xine project
7 * Copyright (c) 2002 The FFmpeg project
9 * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
11 * This file is part of FFmpeg.
13 * FFmpeg is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2.1 of the License, or (at your option) any later version.
18 * FFmpeg is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with FFmpeg; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30 * Sorenson Vector Quantizer #1 (SVQ1) video codec.
31 * For more information of the SVQ1 algorithm, visit:
32 * http://www.pcisys.net/~melanson/codecs/
35 #include "libavutil/crc.h"
36 #include "libavutil/thread.h"
46 #define SVQ1_BLOCK_TYPE_VLC_BITS 3
47 static VLC svq1_block_type;
48 static VLC svq1_motion_component;
49 static VLC svq1_intra_multistage[6];
50 static VLC svq1_inter_multistage[6];
51 static VLC svq1_intra_mean;
52 static VLC svq1_inter_mean;
54 /* motion vector (prediction) */
55 typedef struct svq1_pmv_s {
60 typedef struct SVQ1Context {
66 int pkt_swapped_allocated;
71 int nonref; // 1 if the current frame won't be referenced
74 static const uint8_t string_table[256] = {
75 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
76 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
77 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
78 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
79 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
80 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
81 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
82 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
83 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
84 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
85 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
86 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
87 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
88 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
89 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
90 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
91 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
92 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
93 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
94 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
95 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
96 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
97 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
98 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
99 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
100 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
101 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
102 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
103 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
104 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
105 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
106 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
109 #define SVQ1_PROCESS_VECTOR() \
110 for (; level > 0; i++) { \
111 /* process next depth */ \
117 /* divide block if next bit set */ \
118 if (!get_bits1(bitbuf)) \
120 /* add child nodes */ \
121 list[n++] = list[i]; \
122 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level >> 1) + 1));\
125 #define SVQ1_ADD_CODEBOOK() \
126 /* add codebook entries to vector */ \
127 for (j = 0; j < stages; j++) { \
128 n3 = codebook[entries[j]] ^ 0x80808080; \
129 n1 += (n3 & 0xFF00FF00) >> 8; \
130 n2 += n3 & 0x00FF00FF; \
133 /* clip to [0..255] */ \
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); \
152 /* calculate codebook entries for this vector */ \
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 << 16) + mean;
160 static int svq1_decode_block_intra(GetBitContext *bitbuf, uint8_t *pixels,
166 const uint32_t *codebook;
171 unsigned x, y, width, height, level;
172 uint32_t n1, n2, n3, n4;
174 /* initialize list for breadth first processing of vectors */
177 /* recursively process vector */
178 for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
179 SVQ1_PROCESS_VECTOR();
181 /* destination address and vector size */
182 dst = (uint32_t *)list[i];
183 width = 1 << ((4 + level) / 2);
184 height = 1 << ((3 + level) / 2);
186 /* get number of stages (-1 skips vector, 0 for mean only) */
187 stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
190 for (y = 0; y < height; y++)
191 memset(&dst[y * (pitch / 4)], 0, width);
192 continue; /* skip vector */
195 if ((stages > 0 && level >= 4)) {
197 "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",
199 return AVERROR_INVALIDDATA; /* invalid vector */
201 av_assert0(stages >= 0);
203 mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
206 for (y = 0; y < height; y++)
207 memset(&dst[y * (pitch / 4)], mean, width);
209 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_intra_codebooks);
211 for (y = 0; y < height; y++) {
212 for (x = 0; x < width / 4; x++, codebook++) {
217 dst[x] = n1 << 8 | n2;
227 static int svq1_decode_block_non_intra(GetBitContext *bitbuf, uint8_t *pixels,
233 const uint32_t *codebook;
238 int x, y, width, height, level;
239 uint32_t n1, n2, n3, n4;
241 /* initialize list for breadth first processing of vectors */
244 /* recursively process vector */
245 for (i = 0, m = 1, n = 1, level = 5; i < n; i++) {
246 SVQ1_PROCESS_VECTOR();
248 /* destination address and vector size */
249 dst = (uint32_t *)list[i];
250 width = 1 << ((4 + level) / 2);
251 height = 1 << ((3 + level) / 2);
253 /* get number of stages (-1 skips vector, 0 for mean only) */
254 stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
257 continue; /* skip vector */
259 if ((stages > 0 && level >= 4)) {
261 "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",
263 return AVERROR_INVALIDDATA; /* invalid vector */
265 av_assert0(stages >= 0);
267 mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
269 SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_inter_codebooks);
271 for (y = 0; y < height; y++) {
272 for (x = 0; x < width / 4; x++, codebook++) {
274 /* add mean value to vector */
275 n1 = n4 + ((n3 & 0xFF00FF00) >> 8);
276 n2 = n4 + (n3 & 0x00FF00FF);
279 dst[x] = n1 << 8 | n2;
287 static int svq1_decode_motion_vector(GetBitContext *bitbuf, svq1_pmv *mv,
293 for (i = 0; i < 2; i++) {
294 /* get motion code */
295 diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
297 return AVERROR_INVALIDDATA;
299 if (get_bits1(bitbuf))
303 /* add median of motion vector predictors and clip result */
305 mv->y = sign_extend(diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y), 6);
307 mv->x = sign_extend(diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x), 6);
313 static void svq1_skip_block(uint8_t *current, uint8_t *previous,
314 ptrdiff_t pitch, int x, int y)
320 src = &previous[x + y * pitch];
323 for (i = 0; i < 16; i++) {
324 memcpy(dst, src, 16);
330 static int svq1_motion_inter_block(HpelDSPContext *hdsp, GetBitContext *bitbuf,
331 uint8_t *current, uint8_t *previous,
332 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
333 int width, int height)
341 /* predict and decode motion vector */
347 pmv[1] = &motion[x / 8 + 2];
348 pmv[2] = &motion[x / 8 + 4];
351 result = svq1_decode_motion_vector(bitbuf, &mv, pmv);
356 motion[x / 8 + 2].x =
357 motion[x / 8 + 3].x = mv.x;
359 motion[x / 8 + 2].y =
360 motion[x / 8 + 3].y = mv.y;
362 mv.x = av_clip(mv.x, -2 * x, 2 * (width - x - 16));
363 mv.y = av_clip(mv.y, -2 * y, 2 * (height - y - 16));
365 src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1)) * pitch];
368 hdsp->put_pixels_tab[0][(mv.y & 1) << 1 | (mv.x & 1)](dst, src, pitch, 16);
373 static int svq1_motion_inter_4v_block(HpelDSPContext *hdsp, GetBitContext *bitbuf,
374 uint8_t *current, uint8_t *previous,
375 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
376 int width, int height)
384 /* predict and decode motion vector (0) */
390 pmv[1] = &motion[(x / 8) + 2];
391 pmv[2] = &motion[(x / 8) + 4];
394 result = svq1_decode_motion_vector(bitbuf, &mv, pmv);
398 /* predict and decode motion vector (1) */
404 pmv[1] = &motion[(x / 8) + 3];
406 result = svq1_decode_motion_vector(bitbuf, &motion[0], pmv);
410 /* predict and decode motion vector (2) */
412 pmv[2] = &motion[(x / 8) + 1];
414 result = svq1_decode_motion_vector(bitbuf, &motion[(x / 8) + 2], pmv);
418 /* predict and decode motion vector (3) */
419 pmv[2] = &motion[(x / 8) + 2];
420 pmv[3] = &motion[(x / 8) + 3];
422 result = svq1_decode_motion_vector(bitbuf, pmv[3], pmv);
426 /* form predictions */
427 for (i = 0; i < 4; i++) {
428 int mvx = pmv[i]->x + (i & 1) * 16;
429 int mvy = pmv[i]->y + (i >> 1) * 16;
431 // FIXME: clipping or padding?
432 mvx = av_clip(mvx, -2 * x, 2 * (width - x - 8));
433 mvy = av_clip(mvy, -2 * y, 2 * (height - y - 8));
435 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1)) * pitch];
438 hdsp->put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst, src, pitch, 8);
440 /* select next block */
442 current += 8 * (pitch - 1);
450 static int svq1_decode_delta_block(AVCodecContext *avctx, HpelDSPContext *hdsp,
451 GetBitContext *bitbuf,
452 uint8_t *current, uint8_t *previous,
453 ptrdiff_t pitch, svq1_pmv *motion, int x, int y,
454 int width, int height)
460 block_type = get_vlc2(bitbuf, svq1_block_type.table,
461 SVQ1_BLOCK_TYPE_VLC_BITS, 1);
463 /* reset motion vectors */
464 if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
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) {
474 case SVQ1_BLOCK_SKIP:
475 svq1_skip_block(current, previous, pitch, x, y);
478 case SVQ1_BLOCK_INTER:
479 result = svq1_motion_inter_block(hdsp, bitbuf, current, previous,
480 pitch, motion, x, y, width, height);
483 ff_dlog(avctx, "Error in svq1_motion_inter_block %i\n", result);
486 result = svq1_decode_block_non_intra(bitbuf, current, pitch);
489 case SVQ1_BLOCK_INTER_4V:
490 result = svq1_motion_inter_4v_block(hdsp, bitbuf, current, previous,
491 pitch, motion, x, y, width, height);
494 ff_dlog(avctx, "Error in svq1_motion_inter_4v_block %i\n", result);
497 result = svq1_decode_block_non_intra(bitbuf, current, pitch);
500 case SVQ1_BLOCK_INTRA:
501 result = svq1_decode_block_intra(bitbuf, current, pitch);
508 static void svq1_parse_string(GetBitContext *bitbuf, uint8_t out[257])
513 out[0] = get_bits(bitbuf, 8);
514 seed = string_table[out[0]];
516 for (i = 1; i <= out[0]; i++) {
517 out[i] = get_bits(bitbuf, 8) ^ seed;
518 seed = string_table[out[i] ^ seed];
523 static int svq1_decode_frame_header(AVCodecContext *avctx, AVFrame *frame)
525 SVQ1Context *s = avctx->priv_data;
526 GetBitContext *bitbuf = &s->gb;
528 int width = s->width;
529 int height = s->height;
531 skip_bits(bitbuf, 8); /* temporal_reference */
535 switch (get_bits(bitbuf, 2)) {
537 frame->pict_type = AV_PICTURE_TYPE_I;
542 frame->pict_type = AV_PICTURE_TYPE_P;
545 av_log(avctx, AV_LOG_ERROR, "Invalid frame type.\n");
546 return AVERROR_INVALIDDATA;
549 if (frame->pict_type == AV_PICTURE_TYPE_I) {
551 if (s->frame_code == 0x50 || s->frame_code == 0x60) {
552 int csum = get_bits(bitbuf, 16);
554 csum = av_bswap16(av_crc(av_crc_get_table(AV_CRC_16_CCITT), av_bswap16(csum), bitbuf->buffer, bitbuf->size_in_bits >> 3));
556 ff_dlog(avctx, "%s checksum (%02x) for packet data\n",
557 (csum == 0) ? "correct" : "incorrect", csum);
560 if ((s->frame_code ^ 0x10) >= 0x50) {
563 svq1_parse_string(bitbuf, msg);
565 av_log(avctx, AV_LOG_INFO,
566 "embedded message:\n%s\n", ((char *)msg) + 1);
569 skip_bits(bitbuf, 2);
570 skip_bits(bitbuf, 2);
573 /* load frame size */
574 frame_size_code = get_bits(bitbuf, 3);
576 if (frame_size_code == 7) {
577 /* load width, height (12 bits each) */
578 width = get_bits(bitbuf, 12);
579 height = get_bits(bitbuf, 12);
581 if (!width || !height)
582 return AVERROR_INVALIDDATA;
584 /* get width, height from table */
585 width = ff_svq1_frame_size_table[frame_size_code][0];
586 height = ff_svq1_frame_size_table[frame_size_code][1];
591 if (get_bits1(bitbuf)) {
592 skip_bits1(bitbuf); /* use packet checksum if (1) */
593 skip_bits1(bitbuf); /* component checksums after image data if (1) */
595 if (get_bits(bitbuf, 2) != 0)
596 return AVERROR_INVALIDDATA;
599 if (get_bits1(bitbuf)) {
601 skip_bits(bitbuf, 4);
603 skip_bits(bitbuf, 2);
605 if (skip_1stop_8data_bits(bitbuf) < 0)
606 return AVERROR_INVALIDDATA;
608 if (get_bits_left(bitbuf) <= 0)
609 return AVERROR_INVALIDDATA;
616 static int svq1_decode_frame(AVCodecContext *avctx, void *data,
617 int *got_frame, AVPacket *avpkt)
619 const uint8_t *buf = avpkt->data;
620 int buf_size = avpkt->size;
621 SVQ1Context *s = avctx->priv_data;
624 int result, i, x, y, width, height;
628 /* initialize bit buffer */
629 ret = init_get_bits8(&s->gb, buf, buf_size);
633 /* decode frame header */
634 s->frame_code = get_bits(&s->gb, 22);
636 if ((s->frame_code & ~0x70) || !(s->frame_code & 0x60))
637 return AVERROR_INVALIDDATA;
639 /* swap some header bytes (why?) */
640 if (s->frame_code != 0x20) {
643 if (buf_size < 9 * 4) {
644 av_log(avctx, AV_LOG_ERROR, "Input packet too small\n");
645 return AVERROR_INVALIDDATA;
648 av_fast_padded_malloc(&s->pkt_swapped,
649 &s->pkt_swapped_allocated,
652 return AVERROR(ENOMEM);
654 memcpy(s->pkt_swapped, buf, buf_size);
655 buf = s->pkt_swapped;
656 init_get_bits(&s->gb, buf, buf_size * 8);
657 skip_bits(&s->gb, 22);
659 src = (uint32_t *)(s->pkt_swapped + 4);
661 for (i = 0; i < 4; i++)
662 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
665 result = svq1_decode_frame_header(avctx, cur);
667 ff_dlog(avctx, "Error in svq1_decode_frame_header %i\n", result);
671 result = ff_set_dimensions(avctx, s->width, s->height);
675 if ((avctx->skip_frame >= AVDISCARD_NONREF && s->nonref) ||
676 (avctx->skip_frame >= AVDISCARD_NONKEY &&
677 cur->pict_type != AV_PICTURE_TYPE_I) ||
678 avctx->skip_frame >= AVDISCARD_ALL)
681 result = ff_get_buffer(avctx, cur, s->nonref ? 0 : AV_GET_BUFFER_FLAG_REF);
685 pmv = av_malloc_array(FFALIGN(s->width, 16) / 8 + 3, sizeof(*pmv));
687 return AVERROR(ENOMEM);
689 /* decode y, u and v components */
690 for (i = 0; i < 3; i++) {
691 int linesize = cur->linesize[i];
693 width = FFALIGN(s->width, 16);
694 height = FFALIGN(s->height, 16);
696 if (avctx->flags & AV_CODEC_FLAG_GRAY)
698 width = FFALIGN(s->width / 4, 16);
699 height = FFALIGN(s->height / 4, 16);
702 current = cur->data[i];
704 if (cur->pict_type == AV_PICTURE_TYPE_I) {
706 for (y = 0; y < height; y += 16) {
707 for (x = 0; x < width; x += 16) {
708 result = svq1_decode_block_intra(&s->gb, ¤t[x],
711 av_log(avctx, AV_LOG_ERROR,
712 "Error in svq1_decode_block %i (keyframe)\n",
717 current += 16 * linesize;
721 uint8_t *previous = s->prev->data[i];
723 s->prev->width != s->width || s->prev->height != s->height) {
724 av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
725 result = AVERROR_INVALIDDATA;
729 memset(pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv));
731 for (y = 0; y < height; y += 16) {
732 for (x = 0; x < width; x += 16) {
733 result = svq1_decode_delta_block(avctx, &s->hdsp,
736 pmv, x, y, width, height);
739 "Error in svq1_decode_delta_block %i\n",
748 current += 16 * linesize;
754 av_frame_unref(s->prev);
755 result = av_frame_ref(s->prev, cur);
768 static av_cold void svq1_static_init(void)
770 INIT_VLC_STATIC(&svq1_block_type, SVQ1_BLOCK_TYPE_VLC_BITS, 4,
771 &ff_svq1_block_type_vlc[0][1], 2, 1,
772 &ff_svq1_block_type_vlc[0][0], 2, 1, 8);
774 INIT_VLC_STATIC(&svq1_motion_component, 7, 33,
775 &ff_mvtab[0][1], 2, 1,
776 &ff_mvtab[0][0], 2, 1, 176);
778 for (int i = 0, offset = 0; i < 6; i++) {
779 static const uint8_t sizes[2][6] = { { 14, 10, 14, 18, 16, 18 },
780 { 10, 10, 14, 14, 14, 16 } };
781 static VLC_TYPE table[168][2];
782 svq1_intra_multistage[i].table = &table[offset];
783 svq1_intra_multistage[i].table_allocated = sizes[0][i];
784 offset += sizes[0][i];
785 init_vlc(&svq1_intra_multistage[i], 3, 8,
786 &ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
787 &ff_svq1_intra_multistage_vlc[i][0][0], 2, 1,
788 INIT_VLC_USE_NEW_STATIC);
789 svq1_inter_multistage[i].table = &table[offset];
790 svq1_inter_multistage[i].table_allocated = sizes[1][i];
791 offset += sizes[1][i];
792 init_vlc(&svq1_inter_multistage[i], 3, 8,
793 &ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
794 &ff_svq1_inter_multistage_vlc[i][0][0], 2, 1,
795 INIT_VLC_USE_NEW_STATIC);
798 INIT_VLC_STATIC(&svq1_intra_mean, 8, 256,
799 &ff_svq1_intra_mean_vlc[0][1], 4, 2,
800 &ff_svq1_intra_mean_vlc[0][0], 4, 2, 632);
802 INIT_VLC_STATIC(&svq1_inter_mean, 9, 512,
803 &ff_svq1_inter_mean_vlc[0][1], 4, 2,
804 &ff_svq1_inter_mean_vlc[0][0], 4, 2, 1434);
807 static av_cold int svq1_decode_init(AVCodecContext *avctx)
809 static AVOnce init_static_once = AV_ONCE_INIT;
810 SVQ1Context *s = avctx->priv_data;
812 s->prev = av_frame_alloc();
814 return AVERROR(ENOMEM);
816 s->width = avctx->width + 3 & ~3;
817 s->height = avctx->height + 3 & ~3;
818 avctx->pix_fmt = AV_PIX_FMT_YUV410P;
820 ff_hpeldsp_init(&s->hdsp, avctx->flags);
822 ff_thread_once(&init_static_once, svq1_static_init);
827 static av_cold int svq1_decode_end(AVCodecContext *avctx)
829 SVQ1Context *s = avctx->priv_data;
831 av_frame_free(&s->prev);
832 av_freep(&s->pkt_swapped);
833 s->pkt_swapped_allocated = 0;
838 static void svq1_flush(AVCodecContext *avctx)
840 SVQ1Context *s = avctx->priv_data;
842 av_frame_unref(s->prev);
845 AVCodec ff_svq1_decoder = {
847 .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 1 / Sorenson Video 1 / SVQ1"),
848 .type = AVMEDIA_TYPE_VIDEO,
849 .id = AV_CODEC_ID_SVQ1,
850 .priv_data_size = sizeof(SVQ1Context),
851 .init = svq1_decode_init,
852 .close = svq1_decode_end,
853 .decode = svq1_decode_frame,
854 .capabilities = AV_CODEC_CAP_DR1,
856 .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV410P,
858 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,