3 * Copyright (C) 2002 the xine project
4 * Copyright (C) 2002 the ffmpeg project
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * Ported to mplayer by Arpi <arpi@thot.banki.hu>
24 * Ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
26 * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
31 * Sorenson Vector Quantizer #1 (SVQ1) video codec.
32 * For more information of the SVQ1 algorithm, visit:
33 * http://www.pcisys.net/~melanson/codecs/
46 #include "mpegvideo.h"
52 extern const uint8_t mvtab[33][2];
54 static VLC svq1_block_type;
55 static VLC svq1_motion_component;
56 static VLC svq1_intra_multistage[6];
57 static VLC svq1_inter_multistage[6];
58 static VLC svq1_intra_mean;
59 static VLC svq1_inter_mean;
61 #define SVQ1_BLOCK_SKIP 0
62 #define SVQ1_BLOCK_INTER 1
63 #define SVQ1_BLOCK_INTER_4V 2
64 #define SVQ1_BLOCK_INTRA 3
66 typedef struct SVQ1Context {
67 MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independent of MpegEncContext, so this will be removed then (FIXME/XXX)
68 AVCodecContext *avctx;
71 AVFrame current_picture;
76 PutBitContext reorder_pb[6]; //why ooh why this sick breadth first order, everything is slower and more complex
81 /* Y plane block dimensions */
85 /* U & V plane (C planes) block dimensions */
91 int16_t (*motion_val8[3])[2];
92 int16_t (*motion_val16[3])[2];
97 /* motion vector (prediction) */
98 typedef struct svq1_pmv_s {
104 #include "svq1_vlc.h"
106 static const uint16_t checksum_table[256] = {
107 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
108 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
109 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
110 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
111 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
112 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
113 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
114 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
115 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
116 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
117 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
118 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
119 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
120 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
121 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
122 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
123 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
124 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
125 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
126 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
127 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
128 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
129 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
130 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
131 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
132 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
133 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
134 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
135 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
136 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
137 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
138 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
141 static const uint8_t string_table[256] = {
142 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
143 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
144 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
145 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
146 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
147 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
148 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
149 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
150 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
151 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
152 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
153 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
154 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
155 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
156 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
157 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
158 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
159 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
160 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
161 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
162 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
163 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
164 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
165 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
166 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
167 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
168 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
169 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
170 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
171 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
172 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
173 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
176 #define SVQ1_PROCESS_VECTOR()\
177 for (; level > 0; i++) {\
178 /* process next depth */\
184 /* divide block if next bit set */\
185 if (get_bits (bitbuf, 1) == 0)\
187 /* add child nodes */\
188 list[n++] = list[i];\
189 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
192 #define SVQ1_ADD_CODEBOOK()\
193 /* add codebook entries to vector */\
194 for (j=0; j < stages; j++) {\
195 n3 = codebook[entries[j]] ^ 0x80808080;\
196 n1 += ((n3 & 0xFF00FF00) >> 8);\
197 n2 += (n3 & 0x00FF00FF);\
200 /* clip to [0..255] */\
201 if (n1 & 0xFF00FF00) {\
202 n3 = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
204 n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
205 n1 &= (n3 & 0x00FF00FF);\
208 if (n2 & 0xFF00FF00) {\
209 n3 = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
211 n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
212 n2 &= (n3 & 0x00FF00FF);\
215 #define SVQ1_DO_CODEBOOK_INTRA()\
216 for (y=0; y < height; y++) {\
217 for (x=0; x < (width / 4); x++, codebook++) {\
222 dst[x] = (n1 << 8) | n2;\
227 #define SVQ1_DO_CODEBOOK_NONINTRA()\
228 for (y=0; y < height; y++) {\
229 for (x=0; x < (width / 4); x++, codebook++) {\
231 /* add mean value to vector */\
232 n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
233 n2 = (n3 & 0x00FF00FF) + n4;\
236 dst[x] = (n1 << 8) | n2;\
241 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
242 codebook = (const uint32_t *) cbook[level];\
243 bit_cache = get_bits (bitbuf, 4*stages);\
244 /* calculate codebook entries for this vector */\
245 for (j=0; j < stages; j++) {\
246 entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
248 mean -= (stages * 128);\
249 n4 = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
251 static int svq1_decode_block_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
255 const uint32_t *codebook;
259 unsigned x, y, width, height, level;
260 uint32_t n1, n2, n3, n4;
262 /* initialize list for breadth first processing of vectors */
265 /* recursively process vector */
266 for (i=0, m=1, n=1, level=5; i < n; i++) {
267 SVQ1_PROCESS_VECTOR();
269 /* destination address and vector size */
270 dst = (uint32_t *) list[i];
271 width = 1 << ((4 + level) /2);
272 height = 1 << ((3 + level) /2);
274 /* get number of stages (-1 skips vector, 0 for mean only) */
275 stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
278 for (y=0; y < height; y++) {
279 memset (&dst[y*(pitch / 4)], 0, width);
281 continue; /* skip vector */
284 if ((stages > 0) && (level >= 4)) {
286 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",stages,level);
288 return -1; /* invalid vector */
291 mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
294 for (y=0; y < height; y++) {
295 memset (&dst[y*(pitch / 4)], mean, width);
298 SVQ1_CALC_CODEBOOK_ENTRIES(svq1_intra_codebooks);
299 SVQ1_DO_CODEBOOK_INTRA()
306 static int svq1_decode_block_non_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
310 const uint32_t *codebook;
314 int x, y, width, height, level;
315 uint32_t n1, n2, n3, n4;
317 /* initialize list for breadth first processing of vectors */
320 /* recursively process vector */
321 for (i=0, m=1, n=1, level=5; i < n; i++) {
322 SVQ1_PROCESS_VECTOR();
324 /* destination address and vector size */
325 dst = (uint32_t *) list[i];
326 width = 1 << ((4 + level) /2);
327 height = 1 << ((3 + level) /2);
329 /* get number of stages (-1 skips vector, 0 for mean only) */
330 stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
332 if (stages == -1) continue; /* skip vector */
334 if ((stages > 0) && (level >= 4)) {
336 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",stages,level);
338 return -1; /* invalid vector */
341 mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
343 SVQ1_CALC_CODEBOOK_ENTRIES(svq1_inter_codebooks);
344 SVQ1_DO_CODEBOOK_NONINTRA()
349 static int svq1_decode_motion_vector (GetBitContext *bitbuf, svq1_pmv_t *mv, svq1_pmv_t **pmv) {
353 for (i=0; i < 2; i++) {
355 /* get motion code */
356 diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
360 if(get_bits1(bitbuf)) diff= -diff;
363 /* add median of motion vector predictors and clip result */
365 mv->y = ((diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y)) << 26) >> 26;
367 mv->x = ((diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x)) << 26) >> 26;
373 static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
378 src = &previous[x + y*pitch];
381 for (i=0; i < 16; i++) {
382 memcpy (dst, src, 16);
388 static int svq1_motion_inter_block (MpegEncContext *s, GetBitContext *bitbuf,
389 uint8_t *current, uint8_t *previous, int pitch,
390 svq1_pmv_t *motion, int x, int y) {
397 /* predict and decode motion vector */
404 pmv[1] = &motion[(x / 8) + 2];
405 pmv[2] = &motion[(x / 8) + 4];
408 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
414 motion[(x / 8) + 2].x =
415 motion[(x / 8) + 3].x = mv.x;
417 motion[(x / 8) + 2].y =
418 motion[(x / 8) + 3].y = mv.y;
420 if(y + (mv.y >> 1)<0)
422 if(x + (mv.x >> 1)<0)
426 int w= (s->width+15)&~15;
427 int h= (s->height+15)&~15;
428 if(x + (mv.x >> 1)<0 || y + (mv.y >> 1)<0 || x + (mv.x >> 1) + 16 > w || y + (mv.y >> 1) + 16> h)
429 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mv.x >> 1), y + (mv.y >> 1));
432 src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
435 s->dsp.put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
440 static int svq1_motion_inter_4v_block (MpegEncContext *s, GetBitContext *bitbuf,
441 uint8_t *current, uint8_t *previous, int pitch,
442 svq1_pmv_t *motion,int x, int y) {
449 /* predict and decode motion vector (0) */
456 pmv[1] = &motion[(x / 8) + 2];
457 pmv[2] = &motion[(x / 8) + 4];
460 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
465 /* predict and decode motion vector (1) */
472 pmv[1] = &motion[(x / 8) + 3];
474 result = svq1_decode_motion_vector (bitbuf, &motion[0], pmv);
479 /* predict and decode motion vector (2) */
481 pmv[2] = &motion[(x / 8) + 1];
483 result = svq1_decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
488 /* predict and decode motion vector (3) */
489 pmv[2] = &motion[(x / 8) + 2];
490 pmv[3] = &motion[(x / 8) + 3];
492 result = svq1_decode_motion_vector (bitbuf, pmv[3], pmv);
497 /* form predictions */
498 for (i=0; i < 4; i++) {
499 int mvx= pmv[i]->x + (i&1)*16;
500 int mvy= pmv[i]->y + (i>>1)*16;
502 ///XXX /FIXME cliping or padding?
509 int w= (s->width+15)&~15;
510 int h= (s->height+15)&~15;
511 if(x + (mvx >> 1)<0 || y + (mvy >> 1)<0 || x + (mvx >> 1) + 8 > w || y + (mvy >> 1) + 8> h)
512 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mvx >> 1), y + (mvy >> 1));
514 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch];
517 s->dsp.put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst,src,pitch,8);
519 /* select next block */
521 current += 8*(pitch - 1);
530 static int svq1_decode_delta_block (MpegEncContext *s, GetBitContext *bitbuf,
531 uint8_t *current, uint8_t *previous, int pitch,
532 svq1_pmv_t *motion, int x, int y) {
537 block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
539 /* reset motion vectors */
540 if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
543 motion[(x / 8) + 2].x =
544 motion[(x / 8) + 2].y =
545 motion[(x / 8) + 3].x =
546 motion[(x / 8) + 3].y = 0;
549 switch (block_type) {
550 case SVQ1_BLOCK_SKIP:
551 svq1_skip_block (current, previous, pitch, x, y);
554 case SVQ1_BLOCK_INTER:
555 result = svq1_motion_inter_block (s, bitbuf, current, previous, pitch, motion, x, y);
560 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_block %i\n",result);
564 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
567 case SVQ1_BLOCK_INTER_4V:
568 result = svq1_motion_inter_4v_block (s, bitbuf, current, previous, pitch, motion, x, y);
573 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_4v_block %i\n",result);
577 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
580 case SVQ1_BLOCK_INTRA:
581 result = svq1_decode_block_intra (bitbuf, current, pitch);
588 /* standard video sizes */
589 static struct { int width; int height; } svq1_frame_size_table[8] = {
590 { 160, 120 }, { 128, 96 }, { 176, 144 }, { 352, 288 },
591 { 704, 576 }, { 240, 180 }, { 320, 240 }, { -1, -1 }
594 static uint16_t svq1_packet_checksum (uint8_t *data, int length, int value) {
597 for (i=0; i < length; i++) {
598 value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
604 #if 0 /* unused, remove? */
605 static uint16_t svq1_component_checksum (uint16_t *pixels, int pitch,
606 int width, int height, int value) {
609 for (y=0; y < height; y++) {
610 for (x=0; x < width; x++) {
611 value = checksum_table[pixels[x] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
621 #ifdef CONFIG_DECODERS
622 static void svq1_parse_string (GetBitContext *bitbuf, uint8_t *out) {
626 out[0] = get_bits (bitbuf, 8);
628 seed = string_table[out[0]];
630 for (i=1; i <= out[0]; i++) {
631 out[i] = get_bits (bitbuf, 8) ^ seed;
632 seed = string_table[out[i] ^ seed];
636 static int svq1_decode_frame_header (GetBitContext *bitbuf,MpegEncContext *s) {
638 int temporal_reference;
640 temporal_reference = get_bits (bitbuf, 8);
643 s->pict_type= get_bits (bitbuf, 2)+1;
647 if (s->pict_type == I_TYPE) {
650 if (s->f_code == 0x50 || s->f_code == 0x60) {
651 int csum = get_bits (bitbuf, 16);
653 csum = svq1_packet_checksum ((uint8_t *)bitbuf->buffer, bitbuf->size_in_bits>>3, csum);
655 // av_log(s->avctx, AV_LOG_INFO, "%s checksum (%02x) for packet data\n",
656 // (csum == 0) ? "correct" : "incorrect", csum);
659 if ((s->f_code ^ 0x10) >= 0x50) {
662 svq1_parse_string (bitbuf, msg);
664 av_log(s->avctx, AV_LOG_INFO, "embedded message: \"%s\"\n", (char *) msg);
667 skip_bits (bitbuf, 2);
668 skip_bits (bitbuf, 2);
671 /* load frame size */
672 frame_size_code = get_bits (bitbuf, 3);
674 if (frame_size_code == 7) {
675 /* load width, height (12 bits each) */
676 s->width = get_bits (bitbuf, 12);
677 s->height = get_bits (bitbuf, 12);
679 if (!s->width || !s->height)
682 /* get width, height from table */
683 s->width = svq1_frame_size_table[frame_size_code].width;
684 s->height = svq1_frame_size_table[frame_size_code].height;
689 if (get_bits (bitbuf, 1) == 1) {
690 skip_bits1 (bitbuf); /* use packet checksum if (1) */
691 skip_bits1 (bitbuf); /* component checksums after image data if (1) */
693 if (get_bits (bitbuf, 2) != 0)
697 if (get_bits (bitbuf, 1) == 1) {
699 skip_bits (bitbuf, 4);
701 skip_bits (bitbuf, 2);
703 while (get_bits (bitbuf, 1) == 1) {
704 skip_bits (bitbuf, 8);
711 static int svq1_decode_frame(AVCodecContext *avctx,
712 void *data, int *data_size,
713 uint8_t *buf, int buf_size)
715 MpegEncContext *s=avctx->priv_data;
716 uint8_t *current, *previous;
717 int result, i, x, y, width, height;
718 AVFrame *pict = data;
720 /* initialize bit buffer */
721 init_get_bits(&s->gb,buf,buf_size*8);
723 /* decode frame header */
724 s->f_code = get_bits (&s->gb, 22);
726 if ((s->f_code & ~0x70) || !(s->f_code & 0x60))
729 /* swap some header bytes (why?) */
730 if (s->f_code != 0x20) {
731 uint32_t *src = (uint32_t *) (buf + 4);
733 for (i=0; i < 4; i++) {
734 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
738 result = svq1_decode_frame_header (&s->gb, s);
743 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_frame_header %i\n",result);
748 //FIXME this avoids some confusion for "B frames" without 2 references
749 //this should be removed after libavcodec can handle more flexible picture types & ordering
750 if(s->pict_type==B_TYPE && s->last_picture_ptr==NULL) return buf_size;
752 if(avctx->hurry_up && s->pict_type==B_TYPE) return buf_size;
753 if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
754 ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
755 || avctx->skip_frame >= AVDISCARD_ALL)
758 if(MPV_frame_start(s, avctx) < 0)
761 /* decode y, u and v components */
762 for (i=0; i < 3; i++) {
765 width = (s->width+15)&~15;
766 height = (s->height+15)&~15;
767 linesize= s->linesize;
769 if(s->flags&CODEC_FLAG_GRAY) break;
770 width = (s->width/4+15)&~15;
771 height = (s->height/4+15)&~15;
772 linesize= s->uvlinesize;
775 current = s->current_picture.data[i];
777 if(s->pict_type==B_TYPE){
778 previous = s->next_picture.data[i];
780 previous = s->last_picture.data[i];
783 if (s->pict_type == I_TYPE) {
785 for (y=0; y < height; y+=16) {
786 for (x=0; x < width; x+=16) {
787 result = svq1_decode_block_intra (&s->gb, ¤t[x], linesize);
791 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_block %i (keyframe)\n",result);
796 current += 16*linesize;
799 svq1_pmv_t pmv[width/8+3];
801 memset (pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv_t));
803 for (y=0; y < height; y+=16) {
804 for (x=0; x < width; x+=16) {
805 result = svq1_decode_delta_block (s, &s->gb, ¤t[x], previous,
806 linesize, pmv, x, y);
810 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_delta_block %i\n",result);
819 current += 16*linesize;
824 *pict = *(AVFrame*)&s->current_picture;
829 *data_size=sizeof(AVFrame);
833 static int svq1_decode_init(AVCodecContext *avctx)
835 MpegEncContext *s = avctx->priv_data;
838 MPV_decode_defaults(s);
841 s->width = (avctx->width+3)&~3;
842 s->height = (avctx->height+3)&~3;
843 s->codec_id= avctx->codec->id;
844 avctx->pix_fmt = PIX_FMT_YUV410P;
845 avctx->has_b_frames= 1; // not true, but DP frames and these behave like unidirectional b frames
846 s->flags= avctx->flags;
847 if (MPV_common_init(s) < 0) return -1;
849 init_vlc(&svq1_block_type, 2, 4,
850 &svq1_block_type_vlc[0][1], 2, 1,
851 &svq1_block_type_vlc[0][0], 2, 1, 1);
853 init_vlc(&svq1_motion_component, 7, 33,
855 &mvtab[0][0], 2, 1, 1);
857 for (i = 0; i < 6; i++) {
858 init_vlc(&svq1_intra_multistage[i], 3, 8,
859 &svq1_intra_multistage_vlc[i][0][1], 2, 1,
860 &svq1_intra_multistage_vlc[i][0][0], 2, 1, 1);
861 init_vlc(&svq1_inter_multistage[i], 3, 8,
862 &svq1_inter_multistage_vlc[i][0][1], 2, 1,
863 &svq1_inter_multistage_vlc[i][0][0], 2, 1, 1);
866 init_vlc(&svq1_intra_mean, 8, 256,
867 &svq1_intra_mean_vlc[0][1], 4, 2,
868 &svq1_intra_mean_vlc[0][0], 4, 2, 1);
870 init_vlc(&svq1_inter_mean, 9, 512,
871 &svq1_inter_mean_vlc[0][1], 4, 2,
872 &svq1_inter_mean_vlc[0][0], 4, 2, 1);
877 static int svq1_decode_end(AVCodecContext *avctx)
879 MpegEncContext *s = avctx->priv_data;
884 #endif /* CONFIG_DECODERS */
886 #ifdef CONFIG_ENCODERS
887 static void svq1_write_header(SVQ1Context *s, int frame_type)
892 put_bits(&s->pb, 22, 0x20);
894 /* temporal reference (sure hope this is a "don't care") */
895 put_bits(&s->pb, 8, 0x00);
898 put_bits(&s->pb, 2, frame_type - 1);
900 if (frame_type == I_TYPE) {
902 /* no checksum since frame code is 0x20 */
904 /* no embedded string either */
906 /* output 5 unknown bits (2 + 2 + 1) */
907 put_bits(&s->pb, 5, 2); /* 2 needed by quicktime decoder */
909 for (i = 0; i < 7; i++)
911 if ((svq1_frame_size_table[i].width == s->frame_width) &&
912 (svq1_frame_size_table[i].height == s->frame_height))
914 put_bits(&s->pb, 3, i);
921 put_bits(&s->pb, 3, 7);
922 put_bits(&s->pb, 12, s->frame_width);
923 put_bits(&s->pb, 12, s->frame_height);
927 /* no checksum or extra data (next 2 bits get 0) */
928 put_bits(&s->pb, 2, 0);
932 #define QUALITY_THRESHOLD 100
933 #define THRESHOLD_MULTIPLIER 0.6
935 #if defined(HAVE_ALTIVEC)
939 static int encode_block(SVQ1Context *s, uint8_t *src, uint8_t *ref, uint8_t *decoded, int stride, int level, int threshold, int lambda, int intra){
940 int count, y, x, i, j, split, best_mean, best_score, best_count;
942 int block_sum[7]= {0, 0, 0, 0, 0, 0};
943 int w= 2<<((level+2)>>1);
944 int h= 2<<((level+1)>>1);
946 int16_t block[7][256];
947 const int8_t *codebook_sum, *codebook;
948 const uint16_t (*mean_vlc)[2];
949 const uint8_t (*multistage_vlc)[2];
952 //FIXME optimize, this doenst need to be done multiple times
954 codebook_sum= svq1_intra_codebook_sum[level];
955 codebook= svq1_intra_codebooks[level];
956 mean_vlc= svq1_intra_mean_vlc;
957 multistage_vlc= svq1_intra_multistage_vlc[level];
960 int v= src[x + y*stride];
961 block[0][x + w*y]= v;
967 codebook_sum= svq1_inter_codebook_sum[level];
968 codebook= svq1_inter_codebooks[level];
969 mean_vlc= svq1_inter_mean_vlc + 256;
970 multistage_vlc= svq1_inter_multistage_vlc[level];
973 int v= src[x + y*stride] - ref[x + y*stride];
974 block[0][x + w*y]= v;
982 best_score -= ((block_sum[0]*block_sum[0])>>(level+3));
983 best_mean= (block_sum[0] + (size>>1)) >> (level+3);
986 for(count=1; count<7; count++){
987 int best_vector_score= INT_MAX;
988 int best_vector_sum=-999, best_vector_mean=-999;
989 const int stage= count-1;
990 const int8_t *vector;
993 int sum= codebook_sum[stage*16 + i];
994 int sqr, diff, score;
996 vector = codebook + stage*size*16 + i*size;
997 sqr = s->dsp.ssd_int8_vs_int16(vector, block[stage], size);
998 diff= block_sum[stage] - sum;
999 score= sqr - ((diff*(int64_t)diff)>>(level+3)); //FIXME 64bit slooow
1000 if(score < best_vector_score){
1001 int mean= (diff + (size>>1)) >> (level+3);
1002 assert(mean >-300 && mean<300);
1003 mean= av_clip(mean, intra?0:-256, 255);
1004 best_vector_score= score;
1005 best_vector[stage]= i;
1006 best_vector_sum= sum;
1007 best_vector_mean= mean;
1010 assert(best_vector_mean != -999);
1011 vector= codebook + stage*size*16 + best_vector[stage]*size;
1012 for(j=0; j<size; j++){
1013 block[stage+1][j] = block[stage][j] - vector[j];
1015 block_sum[stage+1]= block_sum[stage] - best_vector_sum;
1016 best_vector_score +=
1017 lambda*(+ 1 + 4*count
1018 + multistage_vlc[1+count][1]
1019 + mean_vlc[best_vector_mean][1]);
1021 if(best_vector_score < best_score){
1022 best_score= best_vector_score;
1024 best_mean= best_vector_mean;
1030 if(best_score > threshold && level){
1032 int offset= (level&1) ? stride*h/2 : w/2;
1033 PutBitContext backup[6];
1035 for(i=level-1; i>=0; i--){
1036 backup[i]= s->reorder_pb[i];
1038 score += encode_block(s, src , ref , decoded , stride, level-1, threshold>>1, lambda, intra);
1039 score += encode_block(s, src + offset, ref + offset, decoded + offset, stride, level-1, threshold>>1, lambda, intra);
1042 if(score < best_score){
1046 for(i=level-1; i>=0; i--){
1047 s->reorder_pb[i]= backup[i];
1052 put_bits(&s->reorder_pb[level], 1, split);
1055 assert((best_mean >= 0 && best_mean<256) || !intra);
1056 assert(best_mean >= -256 && best_mean<256);
1057 assert(best_count >=0 && best_count<7);
1058 assert(level<4 || best_count==0);
1060 /* output the encoding */
1061 put_bits(&s->reorder_pb[level],
1062 multistage_vlc[1 + best_count][1],
1063 multistage_vlc[1 + best_count][0]);
1064 put_bits(&s->reorder_pb[level], mean_vlc[best_mean][1],
1065 mean_vlc[best_mean][0]);
1067 for (i = 0; i < best_count; i++){
1068 assert(best_vector[i]>=0 && best_vector[i]<16);
1069 put_bits(&s->reorder_pb[level], 4, best_vector[i]);
1074 decoded[x + y*stride]= src[x + y*stride] - block[best_count][x + w*y] + best_mean;
1083 static int svq1_encode_plane(SVQ1Context *s, int plane, unsigned char *src_plane, unsigned char *ref_plane, unsigned char *decoded_plane,
1084 int width, int height, int src_stride, int stride)
1088 int block_width, block_height;
1091 const int lambda= (s->picture.quality*s->picture.quality) >> (2*FF_LAMBDA_SHIFT);
1093 /* figure out the acceptable level thresholds in advance */
1094 threshold[5] = QUALITY_THRESHOLD;
1095 for (level = 4; level >= 0; level--)
1096 threshold[level] = threshold[level + 1] * THRESHOLD_MULTIPLIER;
1098 block_width = (width + 15) / 16;
1099 block_height = (height + 15) / 16;
1101 if(s->picture.pict_type == P_TYPE){
1102 s->m.avctx= s->avctx;
1103 s->m.current_picture_ptr= &s->m.current_picture;
1104 s->m.last_picture_ptr = &s->m.last_picture;
1105 s->m.last_picture.data[0]= ref_plane;
1107 s->m.last_picture.linesize[0]=
1108 s->m.new_picture.linesize[0]=
1109 s->m.current_picture.linesize[0]= stride;
1111 s->m.height= height;
1112 s->m.mb_width= block_width;
1113 s->m.mb_height= block_height;
1114 s->m.mb_stride= s->m.mb_width+1;
1115 s->m.b8_stride= 2*s->m.mb_width+1;
1117 s->m.pict_type= s->picture.pict_type;
1118 s->m.me_method= s->avctx->me_method;
1119 s->m.me.scene_change_score=0;
1120 s->m.flags= s->avctx->flags;
1121 // s->m.out_format = FMT_H263;
1122 // s->m.unrestricted_mv= 1;
1124 s->m.lambda= s->picture.quality;
1125 s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
1126 s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
1128 if(!s->motion_val8[plane]){
1129 s->motion_val8 [plane]= av_mallocz((s->m.b8_stride*block_height*2 + 2)*2*sizeof(int16_t));
1130 s->motion_val16[plane]= av_mallocz((s->m.mb_stride*(block_height + 2) + 1)*2*sizeof(int16_t));
1133 s->m.mb_type= s->mb_type;
1135 //dummies, to avoid segfaults
1136 s->m.current_picture.mb_mean= (uint8_t *)s->dummy;
1137 s->m.current_picture.mb_var= (uint16_t*)s->dummy;
1138 s->m.current_picture.mc_mb_var= (uint16_t*)s->dummy;
1139 s->m.current_picture.mb_type= s->dummy;
1141 s->m.current_picture.motion_val[0]= s->motion_val8[plane] + 2;
1142 s->m.p_mv_table= s->motion_val16[plane] + s->m.mb_stride + 1;
1143 s->m.dsp= s->dsp; //move
1146 s->m.me.dia_size= s->avctx->dia_size;
1147 s->m.first_slice_line=1;
1148 for (y = 0; y < block_height; y++) {
1149 uint8_t src[stride*16];
1151 s->m.new_picture.data[0]= src - y*16*stride; //ugly
1154 for(i=0; i<16 && i + 16*y<height; i++){
1155 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
1156 for(x=width; x<16*block_width; x++)
1157 src[i*stride+x]= src[i*stride+x-1];
1159 for(; i<16 && i + 16*y<16*block_height; i++)
1160 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
1162 for (x = 0; x < block_width; x++) {
1164 ff_init_block_index(&s->m);
1165 ff_update_block_index(&s->m);
1167 ff_estimate_p_frame_motion(&s->m, x, y);
1169 s->m.first_slice_line=0;
1172 ff_fix_long_p_mvs(&s->m);
1173 ff_fix_long_mvs(&s->m, NULL, 0, s->m.p_mv_table, s->m.f_code, CANDIDATE_MB_TYPE_INTER, 0);
1176 s->m.first_slice_line=1;
1177 for (y = 0; y < block_height; y++) {
1178 uint8_t src[stride*16];
1180 for(i=0; i<16 && i + 16*y<height; i++){
1181 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
1182 for(x=width; x<16*block_width; x++)
1183 src[i*stride+x]= src[i*stride+x-1];
1185 for(; i<16 && i + 16*y<16*block_height; i++)
1186 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
1189 for (x = 0; x < block_width; x++) {
1190 uint8_t reorder_buffer[3][6][7*32];
1192 int offset = y * 16 * stride + x * 16;
1193 uint8_t *decoded= decoded_plane + offset;
1194 uint8_t *ref= ref_plane + offset;
1195 int score[4]={0,0,0,0}, best;
1196 uint8_t temp[16*stride];
1198 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 3000){ //FIXME check size
1199 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
1204 ff_init_block_index(&s->m);
1205 ff_update_block_index(&s->m);
1207 if(s->picture.pict_type == I_TYPE || (s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTRA)){
1209 init_put_bits(&s->reorder_pb[i], reorder_buffer[0][i], 7*32);
1211 if(s->picture.pict_type == P_TYPE){
1212 const uint8_t *vlc= svq1_block_type_vlc[SVQ1_BLOCK_INTRA];
1213 put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
1214 score[0]= vlc[1]*lambda;
1216 score[0]+= encode_block(s, src+16*x, NULL, temp, stride, 5, 64, lambda, 1);
1218 count[0][i]= put_bits_count(&s->reorder_pb[i]);
1219 flush_put_bits(&s->reorder_pb[i]);
1226 if(s->picture.pict_type == P_TYPE){
1227 const uint8_t *vlc= svq1_block_type_vlc[SVQ1_BLOCK_INTER];
1228 int mx, my, pred_x, pred_y, dxy;
1229 int16_t *motion_ptr;
1231 motion_ptr= h263_pred_motion(&s->m, 0, 0, &pred_x, &pred_y);
1232 if(s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTER){
1234 init_put_bits(&s->reorder_pb[i], reorder_buffer[1][i], 7*32);
1236 put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
1238 s->m.pb= s->reorder_pb[5];
1241 assert(mx>=-32 && mx<=31);
1242 assert(my>=-32 && my<=31);
1243 assert(pred_x>=-32 && pred_x<=31);
1244 assert(pred_y>=-32 && pred_y<=31);
1245 ff_h263_encode_motion(&s->m, mx - pred_x, 1);
1246 ff_h263_encode_motion(&s->m, my - pred_y, 1);
1247 s->reorder_pb[5]= s->m.pb;
1248 score[1] += lambda*put_bits_count(&s->reorder_pb[5]);
1250 dxy= (mx&1) + 2*(my&1);
1252 s->dsp.put_pixels_tab[0][dxy](temp+16, ref + (mx>>1) + stride*(my>>1), stride, 16);
1254 score[1]+= encode_block(s, src+16*x, temp+16, decoded, stride, 5, 64, lambda, 0);
1255 best= score[1] <= score[0];
1257 vlc= svq1_block_type_vlc[SVQ1_BLOCK_SKIP];
1258 score[2]= s->dsp.sse[0](NULL, src+16*x, ref, stride, 16);
1259 score[2]+= vlc[1]*lambda;
1260 if(score[2] < score[best] && mx==0 && my==0){
1262 s->dsp.put_pixels_tab[0][0](decoded, ref, stride, 16);
1266 put_bits(&s->pb, vlc[1], vlc[0]);
1272 count[1][i]= put_bits_count(&s->reorder_pb[i]);
1273 flush_put_bits(&s->reorder_pb[i]);
1276 motion_ptr[0 ] = motion_ptr[1 ]=
1277 motion_ptr[2 ] = motion_ptr[3 ]=
1278 motion_ptr[0+2*s->m.b8_stride] = motion_ptr[1+2*s->m.b8_stride]=
1279 motion_ptr[2+2*s->m.b8_stride] = motion_ptr[3+2*s->m.b8_stride]=0;
1283 s->rd_total += score[best];
1285 for(i=5; i>=0; i--){
1286 ff_copy_bits(&s->pb, reorder_buffer[best][i], count[best][i]);
1289 s->dsp.put_pixels_tab[0][0](decoded, temp, stride, 16);
1292 s->m.first_slice_line=0;
1297 static int svq1_encode_init(AVCodecContext *avctx)
1299 SVQ1Context * const s = avctx->priv_data;
1301 dsputil_init(&s->dsp, avctx);
1302 avctx->coded_frame= (AVFrame*)&s->picture;
1304 s->frame_width = avctx->width;
1305 s->frame_height = avctx->height;
1307 s->y_block_width = (s->frame_width + 15) / 16;
1308 s->y_block_height = (s->frame_height + 15) / 16;
1310 s->c_block_width = (s->frame_width / 4 + 15) / 16;
1311 s->c_block_height = (s->frame_height / 4 + 15) / 16;
1315 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
1316 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
1317 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
1318 s->mb_type = av_mallocz((s->y_block_width+1)*s->y_block_height*sizeof(int16_t));
1319 s->dummy = av_mallocz((s->y_block_width+1)*s->y_block_height*sizeof(int32_t));
1320 h263_encode_init(&s->m); //mv_penalty
1325 static int svq1_encode_frame(AVCodecContext *avctx, unsigned char *buf,
1326 int buf_size, void *data)
1328 SVQ1Context * const s = avctx->priv_data;
1329 AVFrame *pict = data;
1330 AVFrame * const p= (AVFrame*)&s->picture;
1334 if(avctx->pix_fmt != PIX_FMT_YUV410P){
1335 av_log(avctx, AV_LOG_ERROR, "unsupported pixel format\n");
1339 if(!s->current_picture.data[0]){
1340 avctx->get_buffer(avctx, &s->current_picture);
1341 avctx->get_buffer(avctx, &s->last_picture);
1344 temp= s->current_picture;
1345 s->current_picture= s->last_picture;
1346 s->last_picture= temp;
1348 init_put_bits(&s->pb, buf, buf_size);
1351 p->pict_type = avctx->gop_size && avctx->frame_number % avctx->gop_size ? P_TYPE : I_TYPE;
1352 p->key_frame = p->pict_type == I_TYPE;
1354 svq1_write_header(s, p->pict_type);
1356 if(svq1_encode_plane(s, i,
1357 s->picture.data[i], s->last_picture.data[i], s->current_picture.data[i],
1358 s->frame_width / (i?4:1), s->frame_height / (i?4:1),
1359 s->picture.linesize[i], s->current_picture.linesize[i]) < 0)
1363 // align_put_bits(&s->pb);
1364 while(put_bits_count(&s->pb) & 31)
1365 put_bits(&s->pb, 1, 0);
1367 flush_put_bits(&s->pb);
1369 return (put_bits_count(&s->pb) / 8);
1372 static int svq1_encode_end(AVCodecContext *avctx)
1374 SVQ1Context * const s = avctx->priv_data;
1377 av_log(avctx, AV_LOG_DEBUG, "RD: %f\n", s->rd_total/(double)(avctx->width*avctx->height*avctx->frame_number));
1379 av_freep(&s->m.me.scratchpad);
1380 av_freep(&s->m.me.map);
1381 av_freep(&s->m.me.score_map);
1382 av_freep(&s->mb_type);
1383 av_freep(&s->dummy);
1386 av_freep(&s->motion_val8[i]);
1387 av_freep(&s->motion_val16[i]);
1393 #endif //CONFIG_ENCODERS
1395 #ifdef CONFIG_DECODERS
1396 AVCodec svq1_decoder = {
1400 sizeof(MpegEncContext),
1406 .flush= ff_mpeg_flush,
1407 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, -1},
1411 #ifdef CONFIG_ENCODERS
1413 AVCodec svq1_encoder = {
1417 sizeof(SVQ1Context),
1421 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, -1},
1424 #endif //CONFIG_ENCODERS