3 * Copyright (C) 2002 the xine project
4 * Copyright (C) 2002 the ffmpeg project
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 * Ported to mplayer by Arpi <arpi@thot.banki.hu>
22 * Ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
24 * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
29 * Sorenson Vector Quantizer #1 (SVQ1) video codec.
30 * For more information of the SVQ1 algorithm, visit:
31 * http://www.pcisys.net/~melanson/codecs/
45 #include "mpegvideo.h"
51 extern const uint8_t mvtab[33][2];
53 static VLC svq1_block_type;
54 static VLC svq1_motion_component;
55 static VLC svq1_intra_multistage[6];
56 static VLC svq1_inter_multistage[6];
57 static VLC svq1_intra_mean;
58 static VLC svq1_inter_mean;
60 #define SVQ1_BLOCK_SKIP 0
61 #define SVQ1_BLOCK_INTER 1
62 #define SVQ1_BLOCK_INTER_4V 2
63 #define SVQ1_BLOCK_INTRA 3
65 typedef struct SVQ1Context {
66 MpegEncContext m; // needed for motion estimation, should not be used for anything else, the idea is to make the motion estimation eventually independant of MpegEncContext, so this will be removed then (FIXME/XXX)
67 AVCodecContext *avctx;
70 AVFrame current_picture;
75 PutBitContext reorder_pb[6]; //why ooh why this sick breadth first order, everything is slower and more complex
80 /* Y plane block dimensions */
84 /* U & V plane (C planes) block dimensions */
88 unsigned char *c_plane;
92 int16_t (*motion_val8[3])[2];
93 int16_t (*motion_val16[3])[2];
98 /* motion vector (prediction) */
99 typedef struct svq1_pmv_s {
105 #include "svq1_vlc.h"
107 static const uint16_t checksum_table[256] = {
108 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
109 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
110 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
111 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
112 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
113 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
114 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
115 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
116 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
117 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
118 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
119 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
120 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
121 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
122 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
123 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
124 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
125 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
126 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
127 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
128 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
129 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
130 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
131 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
132 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
133 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
134 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
135 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
136 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
137 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
138 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
139 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
142 static const uint8_t string_table[256] = {
143 0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
144 0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
145 0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
146 0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
147 0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
148 0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
149 0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
150 0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
151 0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
152 0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
153 0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
154 0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
155 0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
156 0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
157 0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
158 0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
159 0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
160 0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
161 0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
162 0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
163 0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
164 0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
165 0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
166 0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
167 0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
168 0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
169 0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
170 0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
171 0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
172 0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
173 0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
174 0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
177 #define SVQ1_PROCESS_VECTOR()\
178 for (; level > 0; i++) {\
179 /* process next depth */\
185 /* divide block if next bit set */\
186 if (get_bits (bitbuf, 1) == 0)\
188 /* add child nodes */\
189 list[n++] = list[i];\
190 list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
193 #define SVQ1_ADD_CODEBOOK()\
194 /* add codebook entries to vector */\
195 for (j=0; j < stages; j++) {\
196 n3 = codebook[entries[j]] ^ 0x80808080;\
197 n1 += ((n3 & 0xFF00FF00) >> 8);\
198 n2 += (n3 & 0x00FF00FF);\
201 /* clip to [0..255] */\
202 if (n1 & 0xFF00FF00) {\
203 n3 = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
205 n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
206 n1 &= (n3 & 0x00FF00FF);\
209 if (n2 & 0xFF00FF00) {\
210 n3 = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
212 n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
213 n2 &= (n3 & 0x00FF00FF);\
216 #define SVQ1_DO_CODEBOOK_INTRA()\
217 for (y=0; y < height; y++) {\
218 for (x=0; x < (width / 4); x++, codebook++) {\
223 dst[x] = (n1 << 8) | n2;\
228 #define SVQ1_DO_CODEBOOK_NONINTRA()\
229 for (y=0; y < height; y++) {\
230 for (x=0; x < (width / 4); x++, codebook++) {\
232 /* add mean value to vector */\
233 n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
234 n2 = (n3 & 0x00FF00FF) + n4;\
237 dst[x] = (n1 << 8) | n2;\
242 #define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
243 codebook = (const uint32_t *) cbook[level];\
244 bit_cache = get_bits (bitbuf, 4*stages);\
245 /* calculate codebook entries for this vector */\
246 for (j=0; j < stages; j++) {\
247 entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
249 mean -= (stages * 128);\
250 n4 = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
252 static int svq1_decode_block_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
256 const uint32_t *codebook;
260 unsigned x, y, width, height, level;
261 uint32_t n1, n2, n3, n4;
263 /* initialize list for breadth first processing of vectors */
266 /* recursively process vector */
267 for (i=0, m=1, n=1, level=5; i < n; i++) {
268 SVQ1_PROCESS_VECTOR();
270 /* destination address and vector size */
271 dst = (uint32_t *) list[i];
272 width = 1 << ((4 + level) /2);
273 height = 1 << ((3 + level) /2);
275 /* get number of stages (-1 skips vector, 0 for mean only) */
276 stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
279 for (y=0; y < height; y++) {
280 memset (&dst[y*(pitch / 4)], 0, width);
282 continue; /* skip vector */
285 if ((stages > 0) && (level >= 4)) {
287 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",stages,level);
289 return -1; /* invalid vector */
292 mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
295 for (y=0; y < height; y++) {
296 memset (&dst[y*(pitch / 4)], mean, width);
299 SVQ1_CALC_CODEBOOK_ENTRIES(svq1_intra_codebooks);
300 SVQ1_DO_CODEBOOK_INTRA()
307 static int svq1_decode_block_non_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
311 const uint32_t *codebook;
315 int x, y, width, height, level;
316 uint32_t n1, n2, n3, n4;
318 /* initialize list for breadth first processing of vectors */
321 /* recursively process vector */
322 for (i=0, m=1, n=1, level=5; i < n; i++) {
323 SVQ1_PROCESS_VECTOR();
325 /* destination address and vector size */
326 dst = (uint32_t *) list[i];
327 width = 1 << ((4 + level) /2);
328 height = 1 << ((3 + level) /2);
330 /* get number of stages (-1 skips vector, 0 for mean only) */
331 stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
333 if (stages == -1) continue; /* skip vector */
335 if ((stages > 0) && (level >= 4)) {
337 av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",stages,level);
339 return -1; /* invalid vector */
342 mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
344 SVQ1_CALC_CODEBOOK_ENTRIES(svq1_inter_codebooks);
345 SVQ1_DO_CODEBOOK_NONINTRA()
350 static int svq1_decode_motion_vector (GetBitContext *bitbuf, svq1_pmv_t *mv, svq1_pmv_t **pmv) {
354 for (i=0; i < 2; i++) {
356 /* get motion code */
357 diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
361 if(get_bits1(bitbuf)) diff= -diff;
364 /* add median of motion vector predictors and clip result */
366 mv->y = ((diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y)) << 26) >> 26;
368 mv->x = ((diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x)) << 26) >> 26;
374 static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
379 src = &previous[x + y*pitch];
382 for (i=0; i < 16; i++) {
383 memcpy (dst, src, 16);
389 static int svq1_motion_inter_block (MpegEncContext *s, GetBitContext *bitbuf,
390 uint8_t *current, uint8_t *previous, int pitch,
391 svq1_pmv_t *motion, int x, int y) {
398 /* predict and decode motion vector */
405 pmv[1] = &motion[(x / 8) + 2];
406 pmv[2] = &motion[(x / 8) + 4];
409 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
415 motion[(x / 8) + 2].x =
416 motion[(x / 8) + 3].x = mv.x;
418 motion[(x / 8) + 2].y =
419 motion[(x / 8) + 3].y = mv.y;
421 if(y + (mv.y >> 1)<0)
423 if(x + (mv.x >> 1)<0)
427 int w= (s->width+15)&~15;
428 int h= (s->height+15)&~15;
429 if(x + (mv.x >> 1)<0 || y + (mv.y >> 1)<0 || x + (mv.x >> 1) + 16 > w || y + (mv.y >> 1) + 16> h)
430 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mv.x >> 1), y + (mv.y >> 1));
433 src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
436 s->dsp.put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
441 static int svq1_motion_inter_4v_block (MpegEncContext *s, GetBitContext *bitbuf,
442 uint8_t *current, uint8_t *previous, int pitch,
443 svq1_pmv_t *motion,int x, int y) {
450 /* predict and decode motion vector (0) */
457 pmv[1] = &motion[(x / 8) + 2];
458 pmv[2] = &motion[(x / 8) + 4];
461 result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
466 /* predict and decode motion vector (1) */
473 pmv[1] = &motion[(x / 8) + 3];
475 result = svq1_decode_motion_vector (bitbuf, &motion[0], pmv);
480 /* predict and decode motion vector (2) */
482 pmv[2] = &motion[(x / 8) + 1];
484 result = svq1_decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
489 /* predict and decode motion vector (3) */
490 pmv[2] = &motion[(x / 8) + 2];
491 pmv[3] = &motion[(x / 8) + 3];
493 result = svq1_decode_motion_vector (bitbuf, pmv[3], pmv);
498 /* form predictions */
499 for (i=0; i < 4; i++) {
500 int mvx= pmv[i]->x + (i&1)*16;
501 int mvy= pmv[i]->y + (i>>1)*16;
503 ///XXX /FIXME cliping or padding?
510 int w= (s->width+15)&~15;
511 int h= (s->height+15)&~15;
512 if(x + (mvx >> 1)<0 || y + (mvy >> 1)<0 || x + (mvx >> 1) + 8 > w || y + (mvy >> 1) + 8> h)
513 av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mvx >> 1), y + (mvy >> 1));
515 src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch];
518 s->dsp.put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst,src,pitch,8);
520 /* select next block */
522 current += 8*(pitch - 1);
531 static int svq1_decode_delta_block (MpegEncContext *s, GetBitContext *bitbuf,
532 uint8_t *current, uint8_t *previous, int pitch,
533 svq1_pmv_t *motion, int x, int y) {
538 block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
540 /* reset motion vectors */
541 if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
544 motion[(x / 8) + 2].x =
545 motion[(x / 8) + 2].y =
546 motion[(x / 8) + 3].x =
547 motion[(x / 8) + 3].y = 0;
550 switch (block_type) {
551 case SVQ1_BLOCK_SKIP:
552 svq1_skip_block (current, previous, pitch, x, y);
555 case SVQ1_BLOCK_INTER:
556 result = svq1_motion_inter_block (s, bitbuf, current, previous, pitch, motion, x, y);
561 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_block %i\n",result);
565 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
568 case SVQ1_BLOCK_INTER_4V:
569 result = svq1_motion_inter_4v_block (s, bitbuf, current, previous, pitch, motion, x, y);
574 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_4v_block %i\n",result);
578 result = svq1_decode_block_non_intra (bitbuf, current, pitch);
581 case SVQ1_BLOCK_INTRA:
582 result = svq1_decode_block_intra (bitbuf, current, pitch);
589 /* standard video sizes */
590 static struct { int width; int height; } svq1_frame_size_table[8] = {
591 { 160, 120 }, { 128, 96 }, { 176, 144 }, { 352, 288 },
592 { 704, 576 }, { 240, 180 }, { 320, 240 }, { -1, -1 }
595 static uint16_t svq1_packet_checksum (uint8_t *data, int length, int value) {
598 for (i=0; i < length; i++) {
599 value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
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);
620 static void svq1_parse_string (GetBitContext *bitbuf, uint8_t *out) {
624 out[0] = get_bits (bitbuf, 8);
626 seed = string_table[out[0]];
628 for (i=1; i <= out[0]; i++) {
629 out[i] = get_bits (bitbuf, 8) ^ seed;
630 seed = string_table[out[i] ^ seed];
634 static int svq1_decode_frame_header (GetBitContext *bitbuf,MpegEncContext *s) {
636 int temporal_reference;
638 temporal_reference = get_bits (bitbuf, 8);
641 s->pict_type= get_bits (bitbuf, 2)+1;
645 if (s->pict_type == I_TYPE) {
648 if (s->f_code == 0x50 || s->f_code == 0x60) {
649 int csum = get_bits (bitbuf, 16);
651 csum = svq1_packet_checksum ((uint8_t *)bitbuf->buffer, bitbuf->size_in_bits>>3, csum);
653 // av_log(s->avctx, AV_LOG_INFO, "%s checksum (%02x) for packet data\n",
654 // (csum == 0) ? "correct" : "incorrect", csum);
657 if ((s->f_code ^ 0x10) >= 0x50) {
660 svq1_parse_string (bitbuf, (char *) msg);
662 av_log(s->avctx, AV_LOG_INFO, "embedded message: \"%s\"\n", (char *) msg);
665 skip_bits (bitbuf, 2);
666 skip_bits (bitbuf, 2);
669 /* load frame size */
670 frame_size_code = get_bits (bitbuf, 3);
672 if (frame_size_code == 7) {
673 /* load width, height (12 bits each) */
674 s->width = get_bits (bitbuf, 12);
675 s->height = get_bits (bitbuf, 12);
677 if (!s->width || !s->height)
680 /* get width, height from table */
681 s->width = svq1_frame_size_table[frame_size_code].width;
682 s->height = svq1_frame_size_table[frame_size_code].height;
687 if (get_bits (bitbuf, 1) == 1) {
688 skip_bits1 (bitbuf); /* use packet checksum if (1) */
689 skip_bits1 (bitbuf); /* component checksums after image data if (1) */
691 if (get_bits (bitbuf, 2) != 0)
695 if (get_bits (bitbuf, 1) == 1) {
697 skip_bits (bitbuf, 4);
699 skip_bits (bitbuf, 2);
701 while (get_bits (bitbuf, 1) == 1) {
702 skip_bits (bitbuf, 8);
709 static int svq1_decode_frame(AVCodecContext *avctx,
710 void *data, int *data_size,
711 uint8_t *buf, int buf_size)
713 MpegEncContext *s=avctx->priv_data;
714 uint8_t *current, *previous;
715 int result, i, x, y, width, height;
716 AVFrame *pict = data;
720 if(buf==NULL && buf_size==0){
724 /* initialize bit buffer */
725 init_get_bits(&s->gb,buf,buf_size*8);
727 /* decode frame header */
728 s->f_code = get_bits (&s->gb, 22);
730 if ((s->f_code & ~0x70) || !(s->f_code & 0x60))
733 /* swap some header bytes (why?) */
734 if (s->f_code != 0x20) {
735 uint32_t *src = (uint32_t *) (buf + 4);
737 for (i=0; i < 4; i++) {
738 src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
742 result = svq1_decode_frame_header (&s->gb, s);
747 av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_frame_header %i\n",result);
752 //FIXME this avoids some confusion for "B frames" without 2 references
753 //this should be removed after libavcodec can handle more flexible picture types & ordering
754 if(s->pict_type==B_TYPE && s->last_picture_ptr==NULL) return buf_size;
756 if(avctx->hurry_up && s->pict_type==B_TYPE) return buf_size;
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);
853 init_vlc(&svq1_motion_component, 7, 33,
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);
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);
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);
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);
877 static int svq1_decode_end(AVCodecContext *avctx)
879 MpegEncContext *s = avctx->priv_data;
885 static void svq1_write_header(SVQ1Context *s, int frame_type)
888 put_bits(&s->pb, 22, 0x20);
890 /* temporal reference (sure hope this is a "don't care") */
891 put_bits(&s->pb, 8, 0x00);
894 put_bits(&s->pb, 2, frame_type - 1);
896 if (frame_type == I_TYPE) {
898 /* no checksum since frame code is 0x20 */
900 /* no embedded string either */
902 /* output 5 unknown bits (2 + 2 + 1) */
903 put_bits(&s->pb, 5, 0);
905 /* forget about matching up resolutions, just use the free-form
906 * resolution code (7) for now */
907 put_bits(&s->pb, 3, 7);
908 put_bits(&s->pb, 12, s->frame_width);
909 put_bits(&s->pb, 12, s->frame_height);
913 /* no checksum or extra data (next 2 bits get 0) */
914 put_bits(&s->pb, 2, 0);
917 int level_sizes[6] = { 8, 16, 32, 64, 128, 256 };
918 int level_log2_sizes[6] = { 3, 4, 5, 6, 7, 8 };
920 #define IABS(x) ((x < 0) ? (-(x)) : x)
924 //#define USE_MAD_ALGORITHM
926 #ifdef USE_MAD_ALGORITHM
928 #define QUALITY_THRESHOLD 100
929 #define THRESHOLD_MULTIPLIER 0.6
931 /* This function calculates vector differences using mean absolute
932 * difference (MAD). */
934 static int encode_vector(SVQ1Context *s, unsigned char *vector,
935 unsigned int level, int threshold)
939 signed short work_vector[256];
942 int multistage_codebooks[6];
943 int number_of_stages = 0;
944 int8_t *current_codebook;
949 av_log(s->avctx, AV_LOG_INFO, " ** recursive entry point: encoding level %d vector at threshold %d\n",
953 av_log(s->avctx, AV_LOG_INFO, " help! level %d > 5\n", level);
958 for (i = 0; i < level_sizes[level]; i++)
959 av_log(s->avctx, AV_LOG_INFO, " %02X", vector[i]);
960 av_log(s->avctx, AV_LOG_INFO, "\n");
963 /* calculate the mean */
965 for (i = 0; i < level_sizes[level]; i++)
967 mean >>= level_log2_sizes[level];
970 av_log(s->avctx, AV_LOG_INFO, " vector mean = 0x%02X\n", mean);
973 /* remove the mean from the vector */
975 for (i = 0; i < level_sizes[level]; i++) {
976 work_vector[i] = (signed short)vector[i] - mean;
977 total_deviation += IABS(work_vector[i]);
979 av_log(s->avctx, AV_LOG_INFO, " %d", work_vector[i]);
984 av_log(s->avctx, AV_LOG_INFO, "\n total deviation = %d\n", total_deviation);
987 if (total_deviation < threshold) {
990 av_log(s->avctx, AV_LOG_INFO, " mean-only encoding found for level %d vector, mean = %d\n",
994 /* indicate that this is the end of the subdivisions */
996 put_bits(&s->pb, 1, 0);
998 /* index 1 in the table indicates mean-only encoding */
999 put_bits(&s->pb, svq1_intra_multistage_vlc[level][1][1],
1000 svq1_intra_multistage_vlc[level][1][0]);
1001 put_bits(&s->pb, svq1_intra_mean_vlc[mean][1],
1002 svq1_intra_mean_vlc[mean][0]);
1005 av_log(s->avctx, AV_LOG_INFO, " mean-only L%d, VLC = (0x%X, %d), mean = %d (0x%X, %d)\n",
1007 svq1_intra_multistage_vlc[level][1 + number_of_stages][0],
1008 svq1_intra_multistage_vlc[level][1 + number_of_stages][1],
1010 svq1_intra_mean_vlc[mean][0],
1011 svq1_intra_mean_vlc[mean][1]);
1021 av_log(s->avctx, AV_LOG_INFO, " multistage VQ search...\n");
1023 /* conduct multistage VQ search, for each stage... */
1024 for (i = 0; i < 6; i++) {
1027 best_score = 0x7FFFFFFF;
1028 /* for each codebook in stage */
1029 for (j = 0; j < 16; j++) {
1031 total_deviation = 0;
1033 &svq1_intra_codebooks[level]
1034 [i * level_sizes[level] * 16 + j * level_sizes[level]];
1035 /* calculate the total deviation for the vector */
1036 for (k = 0; k < level_sizes[level]; k++) {
1038 IABS(work_vector[k] - current_codebook[k]);
1041 /* lowest score so far? */
1042 if (total_deviation < best_score) {
1043 best_score = total_deviation;
1047 av_log(s->avctx, AV_LOG_INFO, " after %d, %d, best codebook is %d with a score of %d (score was %d)\n",
1048 i, j, best_codebook, best_score, total_deviation);
1052 /* apply the winning codebook to the work vector and check if
1053 * the vector meets the quality threshold */
1054 total_deviation = 0;
1056 &svq1_intra_codebooks[level]
1057 [i * level_sizes[level] * 16 + j * level_sizes[level]];
1058 multistage_codebooks[number_of_stages++] = best_codebook;
1059 for (j = 0; j < level_sizes[level]; j++) {
1060 work_vector[j] = work_vector[j] - current_codebook[j];
1061 total_deviation += IABS(work_vector[j]);
1064 /* do not go forward with the rest of the search if an acceptable
1065 * codebook combination has been found */
1066 if (total_deviation < threshold)
1071 if ((total_deviation < threshold) || (level == 0)) {
1073 av_log(s->avctx, AV_LOG_INFO, " level %d VQ encoding found using mean %d and codebooks", level, mean);
1074 for (i = 0; i < number_of_stages; i++)
1075 av_log(s->avctx, AV_LOG_INFO, " %d", multistage_codebooks[i]);
1076 av_log(s->avctx, AV_LOG_INFO, "\n");
1079 /* indicate that this is the end of the subdivisions */
1081 put_bits(&s->pb, 1, 0);
1083 /* output the encoding */
1085 svq1_intra_multistage_vlc[level][1 + number_of_stages][1],
1086 svq1_intra_multistage_vlc[level][1 + number_of_stages][0]);
1087 put_bits(&s->pb, svq1_intra_mean_vlc[mean][1],
1088 svq1_intra_mean_vlc[mean][0]);
1090 av_log(s->avctx, AV_LOG_INFO, " L%d: multistage = %d (0x%X, %d), mean = %d (0x%X, %d), codebooks = ",
1093 svq1_intra_multistage_vlc[level][1 + number_of_stages][0],
1094 svq1_intra_multistage_vlc[level][1 + number_of_stages][1],
1096 svq1_intra_mean_vlc[mean][0],
1097 svq1_intra_mean_vlc[mean][1]);
1100 for (i = 0; i < number_of_stages; i++)
1103 av_log(s->avctx, AV_LOG_INFO, "%d ", multistage_codebooks[i]);
1105 put_bits(&s->pb, 4, multistage_codebooks[i]);
1108 av_log(s->avctx, AV_LOG_INFO, "\n");
1115 /* output a subdivision bit to the encoded stream and signal to
1116 * the calling function that this vector could not be
1117 * coded at the requested threshold and needs to be subdivided */
1118 put_bits(&s->pb, 1, 1);
1128 #define QUALITY_THRESHOLD 100
1129 #define THRESHOLD_MULTIPLIER 0.6
1131 /* This function calculates vector differences using mean square
1134 static int encode_vector(SVQ1Context *s, unsigned char *vector,
1135 unsigned int level, int threshold)
1139 signed short work_vector[256];
1142 int multistage_codebooks[6];
1143 int number_of_stages = 0;
1144 int8_t *current_codebook;
1150 av_log(s->avctx, AV_LOG_INFO, " ** recursive entry point: encoding level %d vector at threshold %d\n",
1154 av_log(s->avctx, AV_LOG_INFO, " help! level %d > 5\n", level);
1159 for (i = 0; i < level_sizes[level]; i++)
1160 av_log(s->avctx, AV_LOG_INFO, " %02X", vector[i]);
1161 av_log(s->avctx, AV_LOG_INFO, "\n");
1164 /* calculate the mean */
1166 for (i = 0; i < level_sizes[level]; i++)
1168 mean >>= level_log2_sizes[level];
1171 av_log(s->avctx, AV_LOG_INFO, " vector mean = 0x%02X\n", mean);
1174 /* remove the mean from the vector and compute the resulting MSE */
1176 for (i = 0; i < level_sizes[level]; i++) {
1177 work_vector[i] = (signed short)vector[i] - mean;
1178 mse += (work_vector[i] * work_vector[i]);
1180 av_log(s->avctx, AV_LOG_INFO, " %d", work_vector[i]);
1183 mse >>= level_log2_sizes[level];
1186 av_log(s->avctx, AV_LOG_INFO, "\n MSE = %d\n", mse);
1189 if (mse < threshold) {
1192 av_log(s->avctx, AV_LOG_INFO, " mean-only encoding found for level %d vector, mean = %d\n",
1196 /* indicate that this is the end of the subdivisions */
1198 put_bits(&s->pb, 1, 0);
1200 /* index 1 in the table indicates mean-only encoding */
1201 put_bits(&s->pb, svq1_intra_multistage_vlc[level][1][1],
1202 svq1_intra_multistage_vlc[level][1][0]);
1203 put_bits(&s->pb, svq1_intra_mean_vlc[mean][1],
1204 svq1_intra_mean_vlc[mean][0]);
1207 av_log(s->avctx, AV_LOG_INFO, " mean-only L%d, VLC = (0x%X, %d), mean = %d (0x%X, %d)\n",
1209 svq1_intra_multistage_vlc[level][1 + number_of_stages][0],
1210 svq1_intra_multistage_vlc[level][1 + number_of_stages][1],
1212 svq1_intra_mean_vlc[mean][0],
1213 svq1_intra_mean_vlc[mean][1]);
1223 av_log(s->avctx, AV_LOG_INFO, " multistage VQ search...\n");
1225 /* conduct multistage VQ search, for each stage... */
1226 for (i = 0; i < 6; i++) {
1229 best_score = 0x7FFFFFFF;
1230 /* for each codebook in stage */
1231 for (j = 0; j < 16; j++) {
1235 &svq1_intra_codebooks[level]
1236 [i * level_sizes[level] * 16 + j * level_sizes[level]];
1237 /* calculate the MSE for this vector */
1238 for (k = 0; k < level_sizes[level]; k++) {
1239 diff = work_vector[k] - current_codebook[k];
1240 mse += (diff * diff);
1242 mse >>= level_log2_sizes[level];
1244 /* lowest score so far? */
1245 if (mse < best_score) {
1250 av_log(s->avctx, AV_LOG_INFO, " after %d, %d, best codebook is %d with a score of %d (score was %d)\n",
1251 i, j, best_codebook, best_score, mse);
1255 /* apply the winning codebook to the work vector and check if
1256 * the vector meets the quality threshold */
1259 &svq1_intra_codebooks[level]
1260 [i * level_sizes[level] * 16 + j * level_sizes[level]];
1261 multistage_codebooks[number_of_stages++] = best_codebook;
1262 for (j = 0; j < level_sizes[level]; j++) {
1263 work_vector[j] = work_vector[j] - current_codebook[j];
1264 mse += (work_vector[j] * work_vector[j]);
1266 mse >>= level_log2_sizes[level];
1268 /* do not go forward with the rest of the search if an acceptable
1269 * codebook combination has been found */
1270 if (mse < threshold)
1275 if ((mse < threshold) || (level == 0)) {
1277 av_log(s->avctx, AV_LOG_INFO, " level %d VQ encoding found using mean %d and codebooks", level, mean);
1278 for (i = 0; i < number_of_stages; i++)
1279 av_log(s->avctx, AV_LOG_INFO, " %d", multistage_codebooks[i]);
1280 av_log(s->avctx, AV_LOG_INFO, "\n");
1283 /* indicate that this is the end of the subdivisions */
1285 put_bits(&s->pb, 1, 0);
1287 /* output the encoding */
1289 svq1_intra_multistage_vlc[level][1 + number_of_stages][1],
1290 svq1_intra_multistage_vlc[level][1 + number_of_stages][0]);
1291 put_bits(&s->pb, svq1_intra_mean_vlc[mean][1],
1292 svq1_intra_mean_vlc[mean][0]);
1294 av_log(s->avctx, AV_LOG_INFO, " L%d: multistage = %d (0x%X, %d), mean = %d (0x%X, %d), codebooks = ",
1297 svq1_intra_multistage_vlc[level][1 + number_of_stages][0],
1298 svq1_intra_multistage_vlc[level][1 + number_of_stages][1],
1300 svq1_intra_mean_vlc[mean][0],
1301 svq1_intra_mean_vlc[mean][1]);
1304 for (i = 0; i < number_of_stages; i++)
1307 av_log(s->avctx, AV_LOG_INFO, "%d ", multistage_codebooks[i]);
1309 put_bits(&s->pb, 4, multistage_codebooks[i]);
1312 av_log(s->avctx, AV_LOG_INFO, "\n");
1319 /* output a subdivision bit to the encoded stream and signal to
1320 * the calling function that this vector could not be
1321 * coded at the requested threshold and needs to be subdivided */
1322 put_bits(&s->pb, 1, 1);
1331 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){
1332 int count, y, x, i, j, split, best_mean, best_score, best_count;
1334 int block_sum[7]= {0, 0, 0, 0, 0, 0};
1335 int w= 2<<((level+2)>>1);
1336 int h= 2<<((level+1)>>1);
1338 int16_t block[7][256];
1339 const int8_t *codebook_sum, *codebook;
1340 const uint16_t (*mean_vlc)[2];
1341 const uint8_t (*multistage_vlc)[2];
1344 //FIXME optimize, this doenst need to be done multiple times
1346 codebook_sum= svq1_intra_codebook_sum[level];
1347 codebook= svq1_intra_codebooks[level];
1348 mean_vlc= svq1_intra_mean_vlc;
1349 multistage_vlc= svq1_intra_multistage_vlc[level];
1352 int v= src[x + y*stride];
1353 block[0][x + w*y]= v;
1359 codebook_sum= svq1_inter_codebook_sum[level];
1360 codebook= svq1_inter_codebooks[level];
1361 mean_vlc= svq1_inter_mean_vlc + 256;
1362 multistage_vlc= svq1_inter_multistage_vlc[level];
1365 int v= src[x + y*stride] - ref[x + y*stride];
1366 block[0][x + w*y]= v;
1374 best_score -= ((block_sum[0]*block_sum[0])>>(level+3));
1375 best_mean= (block_sum[0] + (size>>1)) >> (level+3);
1378 for(count=1; count<7; count++){
1379 int best_vector_score= INT_MAX;
1380 int best_vector_sum=-999, best_vector_mean=-999;
1381 const int stage= count-1;
1382 const int8_t *vector;
1384 for(i=0; i<16; i++){
1385 int sum= codebook_sum[stage*16 + i];
1387 int diff, mean, score;
1389 vector = codebook + stage*size*16 + i*size;
1391 for(j=0; j<size; j++){
1393 sqr += (v - block[stage][j])*(v - block[stage][j]);
1395 diff= block_sum[stage] - sum;
1396 mean= (diff + (size>>1)) >> (level+3);
1397 assert(mean >-300 && mean<300);
1398 if(intra) mean= clip(mean, 0, 255);
1399 else mean= clip(mean, -256, 255);
1400 score= sqr - ((diff*(int64_t)diff)>>(level+3)); //FIXME 64bit slooow
1401 if(score < best_vector_score){
1402 best_vector_score= score;
1403 best_vector[stage]= i;
1404 best_vector_sum= sum;
1405 best_vector_mean= mean;
1408 assert(best_vector_mean != -999);
1409 vector= codebook + stage*size*16 + best_vector[stage]*size;
1410 for(j=0; j<size; j++){
1411 block[stage+1][j] = block[stage][j] - vector[j];
1413 block_sum[stage+1]= block_sum[stage] - best_vector_sum;
1414 best_vector_score +=
1415 lambda*(+ 1 + 4*count
1416 + multistage_vlc[1+count][1]
1417 + mean_vlc[best_vector_mean][1]);
1419 if(best_vector_score < best_score){
1420 best_score= best_vector_score;
1422 best_mean= best_vector_mean;
1428 if(best_score > threshold && level){
1430 int offset= (level&1) ? stride*h/2 : w/2;
1431 PutBitContext backup[6];
1433 for(i=level-1; i>=0; i--){
1434 backup[i]= s->reorder_pb[i];
1436 score += encode_block(s, src , ref , decoded , stride, level-1, threshold>>1, lambda, intra);
1437 score += encode_block(s, src + offset, ref + offset, decoded + offset, stride, level-1, threshold>>1, lambda, intra);
1440 if(score < best_score){
1444 for(i=level-1; i>=0; i--){
1445 s->reorder_pb[i]= backup[i];
1450 put_bits(&s->reorder_pb[level], 1, split);
1453 assert((best_mean >= 0 && best_mean<256) || !intra);
1454 assert(best_mean >= -256 && best_mean<256);
1455 assert(best_count >=0 && best_count<7);
1456 assert(level<4 || best_count==0);
1458 /* output the encoding */
1459 put_bits(&s->reorder_pb[level],
1460 multistage_vlc[1 + best_count][1],
1461 multistage_vlc[1 + best_count][0]);
1462 put_bits(&s->reorder_pb[level], mean_vlc[best_mean][1],
1463 mean_vlc[best_mean][0]);
1465 for (i = 0; i < best_count; i++){
1466 assert(best_vector[i]>=0 && best_vector[i]<16);
1467 put_bits(&s->reorder_pb[level], 4, best_vector[i]);
1472 decoded[x + y*stride]= src[x + y*stride] - block[best_count][x + w*y] + best_mean;
1480 static void svq1_encode_plane(SVQ1Context *s, int plane, unsigned char *src_plane, unsigned char *ref_plane, unsigned char *decoded_plane,
1481 int width, int height, int src_stride, int stride)
1483 unsigned char buffer0[256];
1484 unsigned char buffer1[256];
1486 unsigned char *vector;
1487 unsigned char *subvectors;
1489 int subvector_count;
1492 int block_width, block_height;
1496 const int lambda= (s->picture.quality*s->picture.quality) >> (2*FF_LAMBDA_SHIFT);
1498 static int frame = 0;
1501 av_log(s->avctx, AV_LOG_INFO, "********* frame #%d\n", frame++);
1504 /* figure out the acceptable level thresholds in advance */
1505 threshold[5] = QUALITY_THRESHOLD;
1506 for (level = 4; level >= 0; level--)
1507 threshold[level] = threshold[level + 1] * THRESHOLD_MULTIPLIER;
1509 block_width = (width + 15) / 16;
1510 block_height = (height + 15) / 16;
1512 if(s->picture.pict_type == P_TYPE){
1513 s->m.avctx= s->avctx;
1514 s->m.current_picture_ptr= &s->m.current_picture;
1515 s->m.last_picture_ptr = &s->m.last_picture;
1516 s->m.last_picture.data[0]= ref_plane;
1518 s->m.last_picture.linesize[0]=
1519 s->m.new_picture.linesize[0]=
1520 s->m.current_picture.linesize[0]= stride;
1522 s->m.height= height;
1523 s->m.mb_width= block_width;
1524 s->m.mb_height= block_height;
1525 s->m.mb_stride= s->m.mb_width+1;
1526 s->m.b8_stride= 2*s->m.mb_width+1;
1528 s->m.pict_type= s->picture.pict_type;
1529 s->m.qscale= s->picture.quality/FF_QP2LAMBDA;
1530 s->m.me_method= s->avctx->me_method;
1532 if(!s->motion_val8[plane]){
1533 s->motion_val8 [plane]= av_mallocz(s->m.b8_stride*block_height*2*2*sizeof(int16_t));
1534 s->motion_val16[plane]= av_mallocz(s->m.mb_stride*block_height*2*sizeof(int16_t));
1537 s->m.mb_type= s->mb_type;
1539 //dummies, to avoid segfaults
1540 s->m.current_picture.mb_mean= s->dummy;
1541 s->m.current_picture.mb_var= s->dummy;
1542 s->m.current_picture.mc_mb_var= s->dummy;
1543 s->m.current_picture.mb_type= s->dummy;
1545 s->m.current_picture.motion_val[0]= s->motion_val8[plane];
1546 s->m.p_mv_table= s->motion_val16[plane];
1547 s->m.dsp= s->dsp; //move
1550 s->m.me.dia_size= s->avctx->dia_size;
1551 s->m.first_slice_line=1;
1552 for (y = 0; y < block_height; y++) {
1553 uint8_t src[stride*16];
1555 s->m.new_picture.data[0]= src - y*16*stride; //ugly
1558 for(i=0; i<16 && i + 16*y<height; i++){
1559 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
1560 for(x=width; x<16*block_width; x++)
1561 src[i*stride+x]= src[i*stride+x-1];
1563 for(; i<16 && i + 16*y<16*block_height; i++)
1564 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
1566 for (x = 0; x < block_width; x++) {
1568 ff_init_block_index(&s->m);
1569 ff_update_block_index(&s->m);
1571 ff_estimate_p_frame_motion(&s->m, x, y);
1573 s->m.first_slice_line=0;
1576 ff_fix_long_p_mvs(&s->m);
1577 ff_fix_long_mvs(&s->m, NULL, 0, s->m.p_mv_table, s->m.f_code, CANDIDATE_MB_TYPE_INTER, 0);
1580 s->m.first_slice_line=1;
1581 for (y = 0; y < block_height; y++) {
1582 uint8_t src[stride*16];
1584 for(i=0; i<16 && i + 16*y<height; i++){
1585 memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
1586 for(x=width; x<16*block_width; x++)
1587 src[i*stride+x]= src[i*stride+x-1];
1589 for(; i<16 && i + 16*y<16*block_height; i++)
1590 memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
1593 for (x = 0; x < block_width; x++) {
1594 uint8_t reorder_buffer[3][6][7*32];
1596 int offset = y * 16 * stride + x * 16;
1597 uint8_t *decoded= decoded_plane + offset;
1598 uint8_t *ref= ref_plane + offset;
1599 int score[4]={0,0,0,0}, best;
1600 uint8_t temp[16*stride];
1603 ff_init_block_index(&s->m);
1604 ff_update_block_index(&s->m);
1606 av_log(s->avctx, AV_LOG_INFO, "* level 5 vector @ %d, %d:\n", x * 16, y * 16);
1609 if(s->picture.pict_type == I_TYPE || (s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTRA)){
1611 init_put_bits(&s->reorder_pb[i], reorder_buffer[0][i], 7*32);
1613 if(s->picture.pict_type == P_TYPE){
1614 const uint8_t *vlc= svq1_block_type_vlc[SVQ1_BLOCK_INTRA];
1615 put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
1616 score[0]= vlc[1]*lambda;
1618 score[0]+= encode_block(s, src+16*x, NULL, temp, stride, 5, 64, lambda, 1);
1620 count[0][i]= put_bits_count(&s->reorder_pb[i]);
1621 flush_put_bits(&s->reorder_pb[i]);
1628 if(s->picture.pict_type == P_TYPE){
1629 const uint8_t *vlc= svq1_block_type_vlc[SVQ1_BLOCK_INTER];
1630 int mx, my, pred_x, pred_y, dxy;
1631 int16_t *motion_ptr;
1633 motion_ptr= h263_pred_motion(&s->m, 0, 0, &pred_x, &pred_y);
1634 if(s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTER){
1636 init_put_bits(&s->reorder_pb[i], reorder_buffer[1][i], 7*32);
1638 put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
1640 s->m.pb= s->reorder_pb[5];
1643 assert(mx>=-32 && mx<=31);
1644 assert(my>=-32 && my<=31);
1645 assert(pred_x>=-32 && pred_x<=31);
1646 assert(pred_y>=-32 && pred_y<=31);
1647 ff_h263_encode_motion(&s->m, mx - pred_x, 1);
1648 ff_h263_encode_motion(&s->m, my - pred_y, 1);
1649 s->reorder_pb[5]= s->m.pb;
1650 score[1] += lambda*put_bits_count(&s->reorder_pb[5]);
1652 dxy= (mx&1) + 2*(my&1);
1654 s->dsp.put_pixels_tab[0][dxy](temp+16, ref + (mx>>1) + stride*(my>>1), stride, 16);
1656 score[1]+= encode_block(s, src+16*x, temp+16, decoded, stride, 5, 64, lambda, 0);
1657 best= score[1] <= score[0];
1659 vlc= svq1_block_type_vlc[SVQ1_BLOCK_SKIP];
1660 score[2]= s->dsp.sse[0](NULL, src+16*x, ref, stride, 16);
1661 score[2]+= vlc[1]*lambda;
1662 if(score[2] < score[best] && mx==0 && my==0){
1664 s->dsp.put_pixels_tab[0][0](decoded, ref, stride, 16);
1668 put_bits(&s->pb, vlc[1], vlc[0]);
1674 count[1][i]= put_bits_count(&s->reorder_pb[i]);
1675 flush_put_bits(&s->reorder_pb[i]);
1678 motion_ptr[0 ] = motion_ptr[1 ]=
1679 motion_ptr[2 ] = motion_ptr[3 ]=
1680 motion_ptr[0+2*s->m.b8_stride] = motion_ptr[1+2*s->m.b8_stride]=
1681 motion_ptr[2+2*s->m.b8_stride] = motion_ptr[3+2*s->m.b8_stride]=0;
1685 s->rd_total += score[best];
1687 for(i=5; i>=0; i--){
1688 ff_copy_bits(&s->pb, reorder_buffer[best][i], count[best][i]);
1691 s->dsp.put_pixels_tab[0][0](decoded, temp, stride, 16);
1695 for (i = 0; i < 256; i += 16) {
1696 memcpy(&buffer0[i], &plane[left_edge], 16);
1697 left_edge += stride;
1699 current_buffer = 1; /* this will toggle to 0 immediately */
1701 /* perform a breadth-first tree encoding for each vector level */
1702 subvector_count = 1; /* one subvector at level 5 */
1703 for (level = 5; level >= 0; level--) {
1705 vector_count = subvector_count;
1706 subvector_count = 0;
1708 if (current_buffer == 0) {
1711 subvectors = buffer0;
1715 subvectors = buffer1;
1718 /* iterate through each vector in the list */
1719 for (i = 0; i < vector_count; i++) {
1721 if (encode_vector(s, vector, level, threshold[level])) {
1724 av_log(s->avctx, AV_LOG_INFO, " split to level %d\n", level - 1);
1726 /* subdivide into 2 subvectors for later processing */
1727 subvector_count += 2;
1729 if (level - 1 == 3) {
1730 /* subdivide 16x8 -> 2 8x8 */
1731 for (j = 0; j < 8; j++) {
1733 memcpy(subvectors + j * 8, vector + j * 16, 8);
1735 memcpy(subvectors + 64 + j * 8,
1736 vector + 8 + j * 16, 8);
1739 } else if (level - 1 == 1) {
1740 /* subdivide 8x4 -> 2 4x4 */
1741 for (j = 0; j < 4; j++) {
1743 memcpy(subvectors + j * 4, vector + j * 8, 4);
1745 memcpy(subvectors + 16 + j * 4,
1746 vector + 4 + j * 8, 4);
1751 memcpy(subvectors, vector, level_sizes[level - 1]);
1752 subvectors += level_sizes[level - 1];
1754 memcpy(subvectors, vector + level_sizes[level - 1],
1755 level_sizes[level - 1]);
1756 subvectors += level_sizes[level - 1];
1760 vector += level_sizes[level];
1763 /* if there are no more subvectors, break early */
1764 if (!subvector_count)
1769 s->m.first_slice_line=0;
1773 /* output a plane with a constant mean value; good for debugging and for
1774 * greyscale encoding but only valid for intra frames */
1775 static void svq1_output_intra_constant_mean(SVQ1Context *s, int block_width,
1776 int block_height, unsigned char mean)
1780 /* for each level 5 vector, output the specified mean value */
1781 for (i = 0; i < block_width * block_height; i++) {
1783 /* output a 0 before each vector indicating no subdivision */
1784 put_bits(&s->pb, 1, 0);
1786 /* output a 0 indicating mean-only encoding; use index 1 as that
1788 put_bits(&s->pb, svq1_intra_multistage_vlc[5][1][1],
1789 svq1_intra_multistage_vlc[5][1][0]);
1791 /* output a constant mean */
1792 put_bits(&s->pb, svq1_intra_mean_vlc[mean][1],
1793 svq1_intra_mean_vlc[mean][0]);
1795 av_log(s->avctx, AV_LOG_INFO, " const L5 %d/%d: multistage = 0 (0x%X, %d), mean = %d (0x%X, %d)\n",
1796 i, block_width * block_height,
1797 svq1_intra_multistage_vlc[5][1][0],
1798 svq1_intra_multistage_vlc[5][1][1],
1800 svq1_intra_mean_vlc[mean][0],
1801 svq1_intra_mean_vlc[mean][1]);
1806 static int svq1_encode_init(AVCodecContext *avctx)
1808 SVQ1Context * const s = avctx->priv_data;
1810 unsigned char least_bits_value = 0;
1813 dsputil_init(&s->dsp, avctx);
1814 avctx->coded_frame= (AVFrame*)&s->picture;
1816 s->frame_width = avctx->width;
1817 s->frame_height = avctx->height;
1819 s->y_block_width = (s->frame_width + 15) / 16;
1820 s->y_block_height = (s->frame_height + 15) / 16;
1822 s->c_block_width = (s->frame_width / 4 + 15) / 16;
1823 s->c_block_height = (s->frame_height / 4 + 15) / 16;
1826 s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
1827 s->m.me.map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
1828 s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
1829 s->mb_type = av_mallocz((s->y_block_width+1)*s->y_block_height*sizeof(int16_t));
1830 s->dummy = av_mallocz((s->y_block_width+1)*s->y_block_height*sizeof(int32_t));
1831 h263_encode_init(&s->m); //mv_penalty
1833 av_log(s->avctx, AV_LOG_INFO, " Hey: %d x %d, %d x %d, %d x %d\n",
1834 s->frame_width, s->frame_height,
1835 s->y_block_width, s->y_block_height,
1836 s->c_block_width, s->c_block_height);
1838 /* allocate a plane for the U & V planes (color, or C, planes) and
1839 * initialize them to the value that is represented by the fewest bits
1840 * in the mean table; the reasoning behind this is that when the border
1841 * vectors are operated upon and possibly subdivided, the mean will be
1842 * removed resulting in a perfect deviation score of 0 and encoded with
1843 * the minimal possible bits */
1844 s->c_plane = av_malloc(s->c_block_width * s->c_block_height * 16 * 16);
1846 for (i = 0; i < 256; i++)
1847 if (svq1_intra_mean_vlc[i][1] < least_bits) {
1848 least_bits = svq1_intra_mean_vlc[i][1];
1849 least_bits_value = i;
1851 memset(s->c_plane, least_bits_value,
1852 s->c_block_width * s->c_block_height * 16 * 16);
1857 static int svq1_encode_frame(AVCodecContext *avctx, unsigned char *buf,
1858 int buf_size, void *data)
1860 SVQ1Context * const s = avctx->priv_data;
1861 AVFrame *pict = data;
1862 AVFrame * const p= (AVFrame*)&s->picture;
1866 if(avctx->pix_fmt != PIX_FMT_YUV410P){
1867 av_log(avctx, AV_LOG_ERROR, "unsupported pixel format\n");
1871 if(!s->current_picture.data[0]){
1872 avctx->get_buffer(avctx, &s->current_picture);
1873 avctx->get_buffer(avctx, &s->last_picture);
1876 temp= s->current_picture;
1877 s->current_picture= s->last_picture;
1878 s->last_picture= temp;
1880 init_put_bits(&s->pb, buf, buf_size);
1883 p->pict_type = avctx->frame_number % avctx->gop_size ? P_TYPE : I_TYPE;
1884 p->key_frame = p->pict_type == I_TYPE;
1886 svq1_write_header(s, p->pict_type);
1888 svq1_encode_plane(s, i,
1889 s->picture.data[i], s->last_picture.data[i], s->current_picture.data[i],
1890 s->frame_width / (i?4:1), s->frame_height / (i?4:1),
1891 s->picture.linesize[i], s->current_picture.linesize[i]);
1894 // align_put_bits(&s->pb);
1895 while(put_bits_count(&s->pb) & 31)
1896 put_bits(&s->pb, 1, 0);
1898 flush_put_bits(&s->pb);
1900 return (put_bits_count(&s->pb) / 8);
1903 static int svq1_encode_end(AVCodecContext *avctx)
1905 SVQ1Context * const s = avctx->priv_data;
1908 av_log(avctx, AV_LOG_DEBUG, "RD: %f\n", s->rd_total/(double)(avctx->width*avctx->height*avctx->frame_number));
1910 av_freep(&s->c_plane);
1911 av_freep(&s->m.me.scratchpad);
1912 av_freep(&s->m.me.map);
1913 av_freep(&s->m.me.score_map);
1914 av_freep(&s->mb_type);
1915 av_freep(&s->dummy);
1918 av_freep(&s->motion_val8[i]);
1919 av_freep(&s->motion_val16[i]);
1925 AVCodec svq1_decoder = {
1929 sizeof(MpegEncContext),
1935 .flush= ff_mpeg_flush,
1936 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, -1},
1939 #ifdef CONFIG_ENCODERS
1941 AVCodec svq1_encoder = {
1945 sizeof(SVQ1Context),
1949 .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, -1},
1952 #endif //CONFIG_ENCODERS