~ubuntu-branches/ubuntu/feisty/avidemux/feisty

« back to all changes in this revision

Viewing changes to avidemux/ADM_lavcodec/svq1.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel T Chen
  • Date: 2006-12-15 17:13:20 UTC
  • mfrom: (1.1.6 upstream)
  • Revision ID: james.westby@ubuntu.com-20061215171320-w79pvpehxx2fr217
Tags: 1:2.3.0-0.0ubuntu1
* Merge from debian-multimedia.org, remaining Ubuntu change:
  - desktop file,
  - no support for ccache and make -j.
* Closes Ubuntu: #69614.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *
 
3
 * Copyright (C) 2002 the xine project
 
4
 * Copyright (C) 2002 the ffmpeg project
 
5
 *
 
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.
 
10
 *
 
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.
 
15
 *
 
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
19
 *
 
20
 * (SVQ1 Decoder)
 
21
 * Ported to mplayer by Arpi <arpi@thot.banki.hu>
 
22
 * Ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
 
23
 *
 
24
 * SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
 
25
 */
 
26
 
 
27
/**
 
28
 * @file svq1.c
 
29
 * Sorenson Vector Quantizer #1 (SVQ1) video codec.
 
30
 * For more information of the SVQ1 algorithm, visit:
 
31
 *   http://www.pcisys.net/~melanson/codecs/
 
32
 */
 
33
 
 
34
 
 
35
//#define DEBUG_SVQ1
 
36
#include <stdio.h>
 
37
#include <stdlib.h>
 
38
#include <string.h>
 
39
#include <unistd.h>
 
40
#include <limits.h>
 
41
 
 
42
#include "common.h"
 
43
#include "avcodec.h"
 
44
#include "dsputil.h"
 
45
#include "mpegvideo.h"
 
46
#include "bswap.h"
 
47
 
 
48
#undef NDEBUG
 
49
#include <assert.h>
 
50
 
 
51
extern const uint8_t mvtab[33][2];
 
52
 
 
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;
 
59
 
 
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
 
64
 
 
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;
 
68
    DSPContext dsp;
 
69
    AVFrame picture;
 
70
    AVFrame current_picture;
 
71
    AVFrame last_picture;
 
72
    PutBitContext pb;
 
73
    GetBitContext gb;
 
74
 
 
75
    PutBitContext reorder_pb[6]; //why ooh why this sick breadth first order, everything is slower and more complex
 
76
 
 
77
    int frame_width;
 
78
    int frame_height;
 
79
 
 
80
    /* Y plane block dimensions */
 
81
    int y_block_width;
 
82
    int y_block_height;
 
83
 
 
84
    /* U & V plane (C planes) block dimensions */
 
85
    int c_block_width;
 
86
    int c_block_height;
 
87
 
 
88
    uint16_t *mb_type;
 
89
    uint32_t *dummy;
 
90
    int16_t (*motion_val8[3])[2];
 
91
    int16_t (*motion_val16[3])[2];
 
92
 
 
93
    int64_t rd_total;
 
94
} SVQ1Context;
 
95
 
 
96
/* motion vector (prediction) */
 
97
typedef struct svq1_pmv_s {
 
98
  int           x;
 
99
  int           y;
 
100
} svq1_pmv_t;
 
101
 
 
102
#include "svq1_cb.h"
 
103
#include "svq1_vlc.h"
 
104
 
 
105
static const uint16_t checksum_table[256] = {
 
106
  0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
 
107
  0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
 
108
  0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
 
109
  0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
 
110
  0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
 
111
  0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
 
112
  0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
 
113
  0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
 
114
  0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
 
115
  0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
 
116
  0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
 
117
  0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
 
118
  0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
 
119
  0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
 
120
  0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
 
121
  0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
 
122
  0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
 
123
  0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
 
124
  0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
 
125
  0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
 
126
  0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
 
127
  0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
 
128
  0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
 
129
  0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
 
130
  0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
 
131
  0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
 
132
  0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
 
133
  0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
 
134
  0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
 
135
  0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
 
136
  0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
 
137
  0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
 
138
};
 
139
 
 
140
static const uint8_t string_table[256] = {
 
141
  0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
 
142
  0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
 
143
  0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
 
144
  0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
 
145
  0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
 
146
  0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
 
147
  0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
 
148
  0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
 
149
  0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
 
150
  0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
 
151
  0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
 
152
  0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
 
153
  0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
 
154
  0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
 
155
  0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
 
156
  0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
 
157
  0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
 
158
  0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
 
159
  0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
 
160
  0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
 
161
  0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
 
162
  0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
 
163
  0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
 
164
  0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
 
165
  0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
 
166
  0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
 
167
  0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
 
168
  0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
 
169
  0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
 
170
  0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
 
171
  0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
 
172
  0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
 
173
};
 
174
 
 
175
#define SVQ1_PROCESS_VECTOR()\
 
176
    for (; level > 0; i++) {\
 
177
      /* process next depth */\
 
178
      if (i == m) {\
 
179
        m = n;\
 
180
        if (--level == 0)\
 
181
          break;\
 
182
      }\
 
183
      /* divide block if next bit set */\
 
184
      if (get_bits (bitbuf, 1) == 0)\
 
185
        break;\
 
186
      /* add child nodes */\
 
187
      list[n++] = list[i];\
 
188
      list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
 
189
    }
 
190
 
 
191
#define SVQ1_ADD_CODEBOOK()\
 
192
          /* add codebook entries to vector */\
 
193
          for (j=0; j < stages; j++) {\
 
194
            n3  = codebook[entries[j]] ^ 0x80808080;\
 
195
            n1 += ((n3 & 0xFF00FF00) >> 8);\
 
196
            n2 +=  (n3 & 0x00FF00FF);\
 
197
          }\
 
198
\
 
199
          /* clip to [0..255] */\
 
200
          if (n1 & 0xFF00FF00) {\
 
201
            n3  = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
 
202
            n1 += 0x7F007F00;\
 
203
            n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
 
204
            n1 &= (n3 & 0x00FF00FF);\
 
205
          }\
 
206
\
 
207
          if (n2 & 0xFF00FF00) {\
 
208
            n3  = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
 
209
            n2 += 0x7F007F00;\
 
210
            n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
 
211
            n2 &= (n3 & 0x00FF00FF);\
 
212
          }
 
213
 
 
214
#define SVQ1_DO_CODEBOOK_INTRA()\
 
215
      for (y=0; y < height; y++) {\
 
216
        for (x=0; x < (width / 4); x++, codebook++) {\
 
217
        n1 = n4;\
 
218
        n2 = n4;\
 
219
        SVQ1_ADD_CODEBOOK()\
 
220
        /* store result */\
 
221
        dst[x] = (n1 << 8) | n2;\
 
222
        }\
 
223
        dst += (pitch / 4);\
 
224
      }
 
225
 
 
226
#define SVQ1_DO_CODEBOOK_NONINTRA()\
 
227
      for (y=0; y < height; y++) {\
 
228
        for (x=0; x < (width / 4); x++, codebook++) {\
 
229
        n3 = dst[x];\
 
230
        /* add mean value to vector */\
 
231
        n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
 
232
        n2 =  (n3 & 0x00FF00FF)          + n4;\
 
233
        SVQ1_ADD_CODEBOOK()\
 
234
        /* store result */\
 
235
        dst[x] = (n1 << 8) | n2;\
 
236
        }\
 
237
        dst += (pitch / 4);\
 
238
      }
 
239
 
 
240
#define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
 
241
      codebook = (const uint32_t *) cbook[level];\
 
242
      bit_cache = get_bits (bitbuf, 4*stages);\
 
243
      /* calculate codebook entries for this vector */\
 
244
      for (j=0; j < stages; j++) {\
 
245
        entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
 
246
      }\
 
247
      mean -= (stages * 128);\
 
248
      n4    = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
 
249
 
 
250
static int svq1_decode_block_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
 
251
  uint32_t    bit_cache;
 
252
  uint8_t    *list[63];
 
253
  uint32_t   *dst;
 
254
  const uint32_t *codebook;
 
255
  int         entries[6];
 
256
  int         i, j, m, n;
 
257
  int         mean, stages;
 
258
  unsigned    x, y, width, height, level;
 
259
  uint32_t    n1, n2, n3, n4;
 
260
 
 
261
  /* initialize list for breadth first processing of vectors */
 
262
  list[0] = pixels;
 
263
 
 
264
  /* recursively process vector */
 
265
  for (i=0, m=1, n=1, level=5; i < n; i++) {
 
266
    SVQ1_PROCESS_VECTOR();
 
267
 
 
268
    /* destination address and vector size */
 
269
    dst = (uint32_t *) list[i];
 
270
    width = 1 << ((4 + level) /2);
 
271
    height = 1 << ((3 + level) /2);
 
272
 
 
273
    /* get number of stages (-1 skips vector, 0 for mean only) */
 
274
    stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
 
275
 
 
276
    if (stages == -1) {
 
277
        for (y=0; y < height; y++) {
 
278
          memset (&dst[y*(pitch / 4)], 0, width);
 
279
        }
 
280
      continue;                 /* skip vector */
 
281
    }
 
282
 
 
283
    if ((stages > 0) && (level >= 4)) {
 
284
#ifdef DEBUG_SVQ1
 
285
    av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",stages,level);
 
286
#endif
 
287
      return -1;        /* invalid vector */
 
288
    }
 
289
 
 
290
    mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
 
291
 
 
292
    if (stages == 0) {
 
293
      for (y=0; y < height; y++) {
 
294
        memset (&dst[y*(pitch / 4)], mean, width);
 
295
      }
 
296
    } else {
 
297
      SVQ1_CALC_CODEBOOK_ENTRIES(svq1_intra_codebooks);
 
298
      SVQ1_DO_CODEBOOK_INTRA()
 
299
    }
 
300
  }
 
301
 
 
302
  return 0;
 
303
}
 
304
 
 
305
static int svq1_decode_block_non_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
 
306
  uint32_t    bit_cache;
 
307
  uint8_t    *list[63];
 
308
  uint32_t   *dst;
 
309
  const uint32_t *codebook;
 
310
  int         entries[6];
 
311
  int         i, j, m, n;
 
312
  int         mean, stages;
 
313
  int         x, y, width, height, level;
 
314
  uint32_t    n1, n2, n3, n4;
 
315
 
 
316
  /* initialize list for breadth first processing of vectors */
 
317
  list[0] = pixels;
 
318
 
 
319
  /* recursively process vector */
 
320
  for (i=0, m=1, n=1, level=5; i < n; i++) {
 
321
    SVQ1_PROCESS_VECTOR();
 
322
 
 
323
    /* destination address and vector size */
 
324
    dst = (uint32_t *) list[i];
 
325
    width = 1 << ((4 + level) /2);
 
326
    height = 1 << ((3 + level) /2);
 
327
 
 
328
    /* get number of stages (-1 skips vector, 0 for mean only) */
 
329
    stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
 
330
 
 
331
    if (stages == -1) continue; /* skip vector */
 
332
 
 
333
    if ((stages > 0) && (level >= 4)) {
 
334
#ifdef DEBUG_SVQ1
 
335
    av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",stages,level);
 
336
#endif
 
337
      return -1;        /* invalid vector */
 
338
    }
 
339
 
 
340
    mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
 
341
 
 
342
    SVQ1_CALC_CODEBOOK_ENTRIES(svq1_inter_codebooks);
 
343
    SVQ1_DO_CODEBOOK_NONINTRA()
 
344
  }
 
345
  return 0;
 
346
}
 
347
 
 
348
static int svq1_decode_motion_vector (GetBitContext *bitbuf, svq1_pmv_t *mv, svq1_pmv_t **pmv) {
 
349
  int        diff;
 
350
  int        i;
 
351
 
 
352
  for (i=0; i < 2; i++) {
 
353
 
 
354
    /* get motion code */
 
355
    diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
 
356
    if(diff<0)
 
357
        return -1;
 
358
    else if(diff){
 
359
        if(get_bits1(bitbuf)) diff= -diff;
 
360
    }
 
361
 
 
362
    /* add median of motion vector predictors and clip result */
 
363
    if (i == 1)
 
364
      mv->y = ((diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y)) << 26) >> 26;
 
365
    else
 
366
      mv->x = ((diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x)) << 26) >> 26;
 
367
  }
 
368
 
 
369
  return 0;
 
370
}
 
371
 
 
372
static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
 
373
  uint8_t *src;
 
374
  uint8_t *dst;
 
375
  int      i;
 
376
 
 
377
  src = &previous[x + y*pitch];
 
378
  dst = current;
 
379
 
 
380
  for (i=0; i < 16; i++) {
 
381
    memcpy (dst, src, 16);
 
382
    src += pitch;
 
383
    dst += pitch;
 
384
  }
 
385
}
 
386
 
 
387
static int svq1_motion_inter_block (MpegEncContext *s, GetBitContext *bitbuf,
 
388
                               uint8_t *current, uint8_t *previous, int pitch,
 
389
                               svq1_pmv_t *motion, int x, int y) {
 
390
  uint8_t    *src;
 
391
  uint8_t    *dst;
 
392
  svq1_pmv_t  mv;
 
393
  svq1_pmv_t *pmv[3];
 
394
  int         result;
 
395
 
 
396
  /* predict and decode motion vector */
 
397
  pmv[0] = &motion[0];
 
398
  if (y == 0) {
 
399
    pmv[1] =
 
400
    pmv[2] = pmv[0];
 
401
  }
 
402
  else {
 
403
    pmv[1] = &motion[(x / 8) + 2];
 
404
    pmv[2] = &motion[(x / 8) + 4];
 
405
  }
 
406
 
 
407
  result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
 
408
 
 
409
  if (result != 0)
 
410
    return result;
 
411
 
 
412
  motion[0].x                =
 
413
  motion[(x / 8) + 2].x      =
 
414
  motion[(x / 8) + 3].x      = mv.x;
 
415
  motion[0].y                =
 
416
  motion[(x / 8) + 2].y      =
 
417
  motion[(x / 8) + 3].y      = mv.y;
 
418
 
 
419
  if(y + (mv.y >> 1)<0)
 
420
     mv.y= 0;
 
421
  if(x + (mv.x >> 1)<0)
 
422
     mv.x= 0;
 
423
 
 
424
#if 0
 
425
  int w= (s->width+15)&~15;
 
426
  int h= (s->height+15)&~15;
 
427
  if(x + (mv.x >> 1)<0 || y + (mv.y >> 1)<0 || x + (mv.x >> 1) + 16 > w || y + (mv.y >> 1) + 16> h)
 
428
      av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mv.x >> 1), y + (mv.y >> 1));
 
429
#endif
 
430
 
 
431
  src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
 
432
  dst = current;
 
433
 
 
434
  s->dsp.put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
 
435
 
 
436
  return 0;
 
437
}
 
438
 
 
439
static int svq1_motion_inter_4v_block (MpegEncContext *s, GetBitContext *bitbuf,
 
440
                                  uint8_t *current, uint8_t *previous, int pitch,
 
441
                                  svq1_pmv_t *motion,int x, int y) {
 
442
  uint8_t    *src;
 
443
  uint8_t    *dst;
 
444
  svq1_pmv_t  mv;
 
445
  svq1_pmv_t *pmv[4];
 
446
  int         i, result;
 
447
 
 
448
  /* predict and decode motion vector (0) */
 
449
  pmv[0] = &motion[0];
 
450
  if (y == 0) {
 
451
    pmv[1] =
 
452
    pmv[2] = pmv[0];
 
453
  }
 
454
  else {
 
455
    pmv[1] = &motion[(x / 8) + 2];
 
456
    pmv[2] = &motion[(x / 8) + 4];
 
457
  }
 
458
 
 
459
  result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
 
460
 
 
461
  if (result != 0)
 
462
    return result;
 
463
 
 
464
  /* predict and decode motion vector (1) */
 
465
  pmv[0] = &mv;
 
466
  if (y == 0) {
 
467
    pmv[1] =
 
468
    pmv[2] = pmv[0];
 
469
  }
 
470
  else {
 
471
    pmv[1] = &motion[(x / 8) + 3];
 
472
  }
 
473
  result = svq1_decode_motion_vector (bitbuf, &motion[0], pmv);
 
474
 
 
475
  if (result != 0)
 
476
    return result;
 
477
 
 
478
  /* predict and decode motion vector (2) */
 
479
  pmv[1] = &motion[0];
 
480
  pmv[2] = &motion[(x / 8) + 1];
 
481
 
 
482
  result = svq1_decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
 
483
 
 
484
  if (result != 0)
 
485
    return result;
 
486
 
 
487
  /* predict and decode motion vector (3) */
 
488
  pmv[2] = &motion[(x / 8) + 2];
 
489
  pmv[3] = &motion[(x / 8) + 3];
 
490
 
 
491
  result = svq1_decode_motion_vector (bitbuf, pmv[3], pmv);
 
492
 
 
493
  if (result != 0)
 
494
    return result;
 
495
 
 
496
  /* form predictions */
 
497
  for (i=0; i < 4; i++) {
 
498
    int mvx= pmv[i]->x + (i&1)*16;
 
499
    int mvy= pmv[i]->y + (i>>1)*16;
 
500
 
 
501
    ///XXX /FIXME cliping or padding?
 
502
    if(y + (mvy >> 1)<0)
 
503
       mvy= 0;
 
504
    if(x + (mvx >> 1)<0)
 
505
       mvx= 0;
 
506
 
 
507
#if 0
 
508
  int w= (s->width+15)&~15;
 
509
  int h= (s->height+15)&~15;
 
510
  if(x + (mvx >> 1)<0 || y + (mvy >> 1)<0 || x + (mvx >> 1) + 8 > w || y + (mvy >> 1) + 8> h)
 
511
      av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mvx >> 1), y + (mvy >> 1));
 
512
#endif
 
513
    src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch];
 
514
    dst = current;
 
515
 
 
516
    s->dsp.put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst,src,pitch,8);
 
517
 
 
518
    /* select next block */
 
519
    if (i & 1) {
 
520
      current  += 8*(pitch - 1);
 
521
    } else {
 
522
      current  += 8;
 
523
    }
 
524
  }
 
525
 
 
526
  return 0;
 
527
}
 
528
 
 
529
static int svq1_decode_delta_block (MpegEncContext *s, GetBitContext *bitbuf,
 
530
                        uint8_t *current, uint8_t *previous, int pitch,
 
531
                        svq1_pmv_t *motion, int x, int y) {
 
532
  uint32_t block_type;
 
533
  int      result = 0;
 
534
 
 
535
  /* get block type */
 
536
  block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
 
537
 
 
538
  /* reset motion vectors */
 
539
  if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
 
540
    motion[0].x                 =
 
541
    motion[0].y                 =
 
542
    motion[(x / 8) + 2].x =
 
543
    motion[(x / 8) + 2].y =
 
544
    motion[(x / 8) + 3].x =
 
545
    motion[(x / 8) + 3].y = 0;
 
546
  }
 
547
 
 
548
  switch (block_type) {
 
549
  case SVQ1_BLOCK_SKIP:
 
550
    svq1_skip_block (current, previous, pitch, x, y);
 
551
    break;
 
552
 
 
553
  case SVQ1_BLOCK_INTER:
 
554
    result = svq1_motion_inter_block (s, bitbuf, current, previous, pitch, motion, x, y);
 
555
 
 
556
    if (result != 0)
 
557
    {
 
558
#ifdef DEBUG_SVQ1
 
559
    av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_block %i\n",result);
 
560
#endif
 
561
      break;
 
562
    }
 
563
    result = svq1_decode_block_non_intra (bitbuf, current, pitch);
 
564
    break;
 
565
 
 
566
  case SVQ1_BLOCK_INTER_4V:
 
567
    result = svq1_motion_inter_4v_block (s, bitbuf, current, previous, pitch, motion, x, y);
 
568
 
 
569
    if (result != 0)
 
570
    {
 
571
#ifdef DEBUG_SVQ1
 
572
    av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_4v_block %i\n",result);
 
573
#endif
 
574
      break;
 
575
    }
 
576
    result = svq1_decode_block_non_intra (bitbuf, current, pitch);
 
577
    break;
 
578
 
 
579
  case SVQ1_BLOCK_INTRA:
 
580
    result = svq1_decode_block_intra (bitbuf, current, pitch);
 
581
    break;
 
582
  }
 
583
 
 
584
  return result;
 
585
}
 
586
 
 
587
/* standard video sizes */
 
588
static struct { int width; int height; } svq1_frame_size_table[8] = {
 
589
  { 160, 120 }, { 128,  96 }, { 176, 144 }, { 352, 288 },
 
590
  { 704, 576 }, { 240, 180 }, { 320, 240 }, {  -1,  -1 }
 
591
};
 
592
 
 
593
static uint16_t svq1_packet_checksum (uint8_t *data, int length, int value) {
 
594
  int i;
 
595
 
 
596
  for (i=0; i < length; i++) {
 
597
    value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
 
598
  }
 
599
 
 
600
  return value;
 
601
}
 
602
 
 
603
#if 0 /* unused, remove? */
 
604
static uint16_t svq1_component_checksum (uint16_t *pixels, int pitch,
 
605
                                         int width, int height, int value) {
 
606
  int x, y;
 
607
 
 
608
  for (y=0; y < height; y++) {
 
609
    for (x=0; x < width; x++) {
 
610
      value = checksum_table[pixels[x] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
 
611
    }
 
612
 
 
613
    pixels += pitch;
 
614
  }
 
615
 
 
616
  return value;
 
617
}
 
618
#endif
 
619
 
 
620
static void svq1_parse_string (GetBitContext *bitbuf, uint8_t *out) {
 
621
  uint8_t seed;
 
622
  int     i;
 
623
 
 
624
  out[0] = get_bits (bitbuf, 8);
 
625
 
 
626
  seed = string_table[out[0]];
 
627
 
 
628
  for (i=1; i <= out[0]; i++) {
 
629
    out[i] = get_bits (bitbuf, 8) ^ seed;
 
630
    seed   = string_table[out[i] ^ seed];
 
631
  }
 
632
}
 
633
 
 
634
static int svq1_decode_frame_header (GetBitContext *bitbuf,MpegEncContext *s) {
 
635
  int frame_size_code;
 
636
  int temporal_reference;
 
637
 
 
638
  temporal_reference = get_bits (bitbuf, 8);
 
639
 
 
640
  /* frame type */
 
641
  s->pict_type= get_bits (bitbuf, 2)+1;
 
642
  if(s->pict_type==4)
 
643
      return -1;
 
644
 
 
645
  if (s->pict_type == I_TYPE) {
 
646
 
 
647
    /* unknown fields */
 
648
    if (s->f_code == 0x50 || s->f_code == 0x60) {
 
649
      int csum = get_bits (bitbuf, 16);
 
650
 
 
651
      csum = svq1_packet_checksum ((uint8_t *)bitbuf->buffer, bitbuf->size_in_bits>>3, csum);
 
652
 
 
653
//      av_log(s->avctx, AV_LOG_INFO, "%s checksum (%02x) for packet data\n",
 
654
//              (csum == 0) ? "correct" : "incorrect", csum);
 
655
    }
 
656
 
 
657
    if ((s->f_code ^ 0x10) >= 0x50) {
 
658
      char msg[256];
 
659
 
 
660
      svq1_parse_string (bitbuf, (char *) msg);
 
661
 
 
662
      av_log(s->avctx, AV_LOG_INFO, "embedded message: \"%s\"\n", (char *) msg);
 
663
    }
 
664
 
 
665
    skip_bits (bitbuf, 2);
 
666
    skip_bits (bitbuf, 2);
 
667
    skip_bits1 (bitbuf);
 
668
 
 
669
    /* load frame size */
 
670
    frame_size_code = get_bits (bitbuf, 3);
 
671
 
 
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);
 
676
 
 
677
      if (!s->width || !s->height)
 
678
        return -1;
 
679
    } else {
 
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;
 
683
    }
 
684
  }
 
685
 
 
686
  /* unknown fields */
 
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) */
 
690
 
 
691
    if (get_bits (bitbuf, 2) != 0)
 
692
      return -1;
 
693
  }
 
694
 
 
695
  if (get_bits (bitbuf, 1) == 1) {
 
696
    skip_bits1 (bitbuf);
 
697
    skip_bits (bitbuf, 4);
 
698
    skip_bits1 (bitbuf);
 
699
    skip_bits (bitbuf, 2);
 
700
 
 
701
    while (get_bits (bitbuf, 1) == 1) {
 
702
      skip_bits (bitbuf, 8);
 
703
    }
 
704
  }
 
705
 
 
706
  return 0;
 
707
}
 
708
 
 
709
static int svq1_decode_frame(AVCodecContext *avctx,
 
710
                             void *data, int *data_size,
 
711
                             uint8_t *buf, int buf_size)
 
712
{
 
713
  MpegEncContext *s=avctx->priv_data;
 
714
  uint8_t        *current, *previous;
 
715
  int             result, i, x, y, width, height;
 
716
  AVFrame *pict = data;
 
717
 
 
718
  /* initialize bit buffer */
 
719
  init_get_bits(&s->gb,buf,buf_size*8);
 
720
 
 
721
  /* decode frame header */
 
722
  s->f_code = get_bits (&s->gb, 22);
 
723
 
 
724
  if ((s->f_code & ~0x70) || !(s->f_code & 0x60))
 
725
    return -1;
 
726
 
 
727
  /* swap some header bytes (why?) */
 
728
  if (s->f_code != 0x20) {
 
729
    uint32_t *src = (uint32_t *) (buf + 4);
 
730
 
 
731
    for (i=0; i < 4; i++) {
 
732
      src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
 
733
    }
 
734
  }
 
735
 
 
736
  result = svq1_decode_frame_header (&s->gb, s);
 
737
 
 
738
  if (result != 0)
 
739
  {
 
740
#ifdef DEBUG_SVQ1
 
741
    av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_frame_header %i\n",result);
 
742
#endif
 
743
    return result;
 
744
  }
 
745
 
 
746
  //FIXME this avoids some confusion for "B frames" without 2 references
 
747
  //this should be removed after libavcodec can handle more flexible picture types & ordering
 
748
  if(s->pict_type==B_TYPE && s->last_picture_ptr==NULL) return buf_size;
 
749
 
 
750
  if(avctx->hurry_up && s->pict_type==B_TYPE) return buf_size;
 
751
  if(  (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
 
752
     ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
 
753
     || avctx->skip_frame >= AVDISCARD_ALL)
 
754
      return buf_size;
 
755
 
 
756
  if(MPV_frame_start(s, avctx) < 0)
 
757
      return -1;
 
758
 
 
759
  /* decode y, u and v components */
 
760
  for (i=0; i < 3; i++) {
 
761
    int linesize;
 
762
    if (i == 0) {
 
763
      width  = (s->width+15)&~15;
 
764
      height = (s->height+15)&~15;
 
765
      linesize= s->linesize;
 
766
    } else {
 
767
      if(s->flags&CODEC_FLAG_GRAY) break;
 
768
      width  = (s->width/4+15)&~15;
 
769
      height = (s->height/4+15)&~15;
 
770
      linesize= s->uvlinesize;
 
771
    }
 
772
 
 
773
    current  = s->current_picture.data[i];
 
774
 
 
775
    if(s->pict_type==B_TYPE){
 
776
        previous = s->next_picture.data[i];
 
777
    }else{
 
778
        previous = s->last_picture.data[i];
 
779
    }
 
780
 
 
781
    if (s->pict_type == I_TYPE) {
 
782
      /* keyframe */
 
783
      for (y=0; y < height; y+=16) {
 
784
        for (x=0; x < width; x+=16) {
 
785
          result = svq1_decode_block_intra (&s->gb, &current[x], linesize);
 
786
          if (result != 0)
 
787
          {
 
788
//#ifdef DEBUG_SVQ1
 
789
            av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_block %i (keyframe)\n",result);
 
790
//#endif
 
791
            return result;
 
792
          }
 
793
        }
 
794
        current += 16*linesize;
 
795
      }
 
796
    } else {
 
797
      svq1_pmv_t pmv[width/8+3];
 
798
      /* delta frame */
 
799
      memset (pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv_t));
 
800
 
 
801
      for (y=0; y < height; y+=16) {
 
802
        for (x=0; x < width; x+=16) {
 
803
          result = svq1_decode_delta_block (s, &s->gb, &current[x], previous,
 
804
                                            linesize, pmv, x, y);
 
805
          if (result != 0)
 
806
          {
 
807
#ifdef DEBUG_SVQ1
 
808
    av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_delta_block %i\n",result);
 
809
#endif
 
810
            return result;
 
811
          }
 
812
        }
 
813
 
 
814
        pmv[0].x =
 
815
        pmv[0].y = 0;
 
816
 
 
817
        current += 16*linesize;
 
818
      }
 
819
    }
 
820
  }
 
821
 
 
822
  *pict = *(AVFrame*)&s->current_picture;
 
823
 
 
824
 
 
825
  MPV_frame_end(s);
 
826
 
 
827
  *data_size=sizeof(AVFrame);
 
828
  return buf_size;
 
829
}
 
830
 
 
831
static int svq1_decode_init(AVCodecContext *avctx)
 
832
{
 
833
    MpegEncContext *s = avctx->priv_data;
 
834
    int i;
 
835
 
 
836
    MPV_decode_defaults(s);
 
837
 
 
838
    s->avctx = avctx;
 
839
    s->width = (avctx->width+3)&~3;
 
840
    s->height = (avctx->height+3)&~3;
 
841
    s->codec_id= avctx->codec->id;
 
842
    avctx->pix_fmt = PIX_FMT_YUV410P;
 
843
    avctx->has_b_frames= 1; // not true, but DP frames and these behave like unidirectional b frames
 
844
    s->flags= avctx->flags;
 
845
    if (MPV_common_init(s) < 0) return -1;
 
846
 
 
847
    init_vlc(&svq1_block_type, 2, 4,
 
848
        &svq1_block_type_vlc[0][1], 2, 1,
 
849
        &svq1_block_type_vlc[0][0], 2, 1, 1);
 
850
 
 
851
    init_vlc(&svq1_motion_component, 7, 33,
 
852
        &mvtab[0][1], 2, 1,
 
853
        &mvtab[0][0], 2, 1, 1);
 
854
 
 
855
    for (i = 0; i < 6; i++) {
 
856
        init_vlc(&svq1_intra_multistage[i], 3, 8,
 
857
            &svq1_intra_multistage_vlc[i][0][1], 2, 1,
 
858
            &svq1_intra_multistage_vlc[i][0][0], 2, 1, 1);
 
859
        init_vlc(&svq1_inter_multistage[i], 3, 8,
 
860
            &svq1_inter_multistage_vlc[i][0][1], 2, 1,
 
861
            &svq1_inter_multistage_vlc[i][0][0], 2, 1, 1);
 
862
    }
 
863
 
 
864
    init_vlc(&svq1_intra_mean, 8, 256,
 
865
        &svq1_intra_mean_vlc[0][1], 4, 2,
 
866
        &svq1_intra_mean_vlc[0][0], 4, 2, 1);
 
867
 
 
868
    init_vlc(&svq1_inter_mean, 9, 512,
 
869
        &svq1_inter_mean_vlc[0][1], 4, 2,
 
870
        &svq1_inter_mean_vlc[0][0], 4, 2, 1);
 
871
 
 
872
    return 0;
 
873
}
 
874
 
 
875
static int svq1_decode_end(AVCodecContext *avctx)
 
876
{
 
877
    MpegEncContext *s = avctx->priv_data;
 
878
 
 
879
    MPV_common_end(s);
 
880
    return 0;
 
881
}
 
882
 
 
883
static void svq1_write_header(SVQ1Context *s, int frame_type)
 
884
{
 
885
    int i;
 
886
 
 
887
    /* frame code */
 
888
    put_bits(&s->pb, 22, 0x20);
 
889
 
 
890
    /* temporal reference (sure hope this is a "don't care") */
 
891
    put_bits(&s->pb, 8, 0x00);
 
892
 
 
893
    /* frame type */
 
894
    put_bits(&s->pb, 2, frame_type - 1);
 
895
 
 
896
    if (frame_type == I_TYPE) {
 
897
 
 
898
        /* no checksum since frame code is 0x20 */
 
899
 
 
900
        /* no embedded string either */
 
901
 
 
902
        /* output 5 unknown bits (2 + 2 + 1) */
 
903
        put_bits(&s->pb, 5, 0);
 
904
 
 
905
        for (i = 0; i < 7; i++)
 
906
        {
 
907
            if ((svq1_frame_size_table[i].width == s->frame_width) &&
 
908
                (svq1_frame_size_table[i].height == s->frame_height))
 
909
            {
 
910
                put_bits(&s->pb, 3, i);
 
911
                break;
 
912
            }
 
913
        }
 
914
 
 
915
        if (i == 7)
 
916
        {
 
917
            put_bits(&s->pb, 3, 7);
 
918
                put_bits(&s->pb, 12, s->frame_width);
 
919
                put_bits(&s->pb, 12, s->frame_height);
 
920
        }
 
921
    }
 
922
 
 
923
    /* no checksum or extra data (next 2 bits get 0) */
 
924
    put_bits(&s->pb, 2, 0);
 
925
}
 
926
 
 
927
 
 
928
#define QUALITY_THRESHOLD 100
 
929
#define THRESHOLD_MULTIPLIER 0.6
 
930
 
 
931
#if defined(HAVE_ALTIVEC)
 
932
#undef vector
 
933
#endif
 
934
 
 
935
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){
 
936
    int count, y, x, i, j, split, best_mean, best_score, best_count;
 
937
    int best_vector[6];
 
938
    int block_sum[7]= {0, 0, 0, 0, 0, 0};
 
939
    int w= 2<<((level+2)>>1);
 
940
    int h= 2<<((level+1)>>1);
 
941
    int size=w*h;
 
942
    int16_t block[7][256];
 
943
    const int8_t *codebook_sum, *codebook;
 
944
    const uint16_t (*mean_vlc)[2];
 
945
    const uint8_t (*multistage_vlc)[2];
 
946
 
 
947
    best_score=0;
 
948
    //FIXME optimize, this doenst need to be done multiple times
 
949
    if(intra){
 
950
        codebook_sum= svq1_intra_codebook_sum[level];
 
951
        codebook= svq1_intra_codebooks[level];
 
952
        mean_vlc= svq1_intra_mean_vlc;
 
953
        multistage_vlc= svq1_intra_multistage_vlc[level];
 
954
        for(y=0; y<h; y++){
 
955
            for(x=0; x<w; x++){
 
956
                int v= src[x + y*stride];
 
957
                block[0][x + w*y]= v;
 
958
                best_score += v*v;
 
959
                block_sum[0] += v;
 
960
            }
 
961
        }
 
962
    }else{
 
963
        codebook_sum= svq1_inter_codebook_sum[level];
 
964
        codebook= svq1_inter_codebooks[level];
 
965
        mean_vlc= svq1_inter_mean_vlc + 256;
 
966
        multistage_vlc= svq1_inter_multistage_vlc[level];
 
967
        for(y=0; y<h; y++){
 
968
            for(x=0; x<w; x++){
 
969
                int v= src[x + y*stride] - ref[x + y*stride];
 
970
                block[0][x + w*y]= v;
 
971
                best_score += v*v;
 
972
                block_sum[0] += v;
 
973
            }
 
974
        }
 
975
    }
 
976
 
 
977
    best_count=0;
 
978
    best_score -= ((block_sum[0]*block_sum[0])>>(level+3));
 
979
    best_mean= (block_sum[0] + (size>>1)) >> (level+3);
 
980
 
 
981
    if(level<4){
 
982
        for(count=1; count<7; count++){
 
983
            int best_vector_score= INT_MAX;
 
984
            int best_vector_sum=-999, best_vector_mean=-999;
 
985
            const int stage= count-1;
 
986
            const int8_t *vector;
 
987
 
 
988
            for(i=0; i<16; i++){
 
989
                int sum= codebook_sum[stage*16 + i];
 
990
                int sqr=0;
 
991
                int diff, mean, score;
 
992
 
 
993
                vector = codebook + stage*size*16 + i*size;
 
994
 
 
995
                for(j=0; j<size; j++){
 
996
                    int v= vector[j];
 
997
                    sqr += (v - block[stage][j])*(v - block[stage][j]);
 
998
                }
 
999
                diff= block_sum[stage] - sum;
 
1000
                mean= (diff + (size>>1)) >> (level+3);
 
1001
                assert(mean >-300 && mean<300);
 
1002
                if(intra) mean= clip(mean, 0, 255);
 
1003
                else      mean= clip(mean, -256, 255);
 
1004
                score= sqr - ((diff*(int64_t)diff)>>(level+3)); //FIXME 64bit slooow
 
1005
                if(score < best_vector_score){
 
1006
                    best_vector_score= score;
 
1007
                    best_vector[stage]= i;
 
1008
                    best_vector_sum= sum;
 
1009
                    best_vector_mean= mean;
 
1010
                }
 
1011
            }
 
1012
            assert(best_vector_mean != -999);
 
1013
            vector= codebook + stage*size*16 + best_vector[stage]*size;
 
1014
            for(j=0; j<size; j++){
 
1015
                block[stage+1][j] = block[stage][j] - vector[j];
 
1016
            }
 
1017
            block_sum[stage+1]= block_sum[stage] - best_vector_sum;
 
1018
            best_vector_score +=
 
1019
                lambda*(+ 1 + 4*count
 
1020
                        + multistage_vlc[1+count][1]
 
1021
                        + mean_vlc[best_vector_mean][1]);
 
1022
 
 
1023
            if(best_vector_score < best_score){
 
1024
                best_score= best_vector_score;
 
1025
                best_count= count;
 
1026
                best_mean= best_vector_mean;
 
1027
            }
 
1028
        }
 
1029
    }
 
1030
 
 
1031
    split=0;
 
1032
    if(best_score > threshold && level){
 
1033
        int score=0;
 
1034
        int offset= (level&1) ? stride*h/2 : w/2;
 
1035
        PutBitContext backup[6];
 
1036
 
 
1037
        for(i=level-1; i>=0; i--){
 
1038
            backup[i]= s->reorder_pb[i];
 
1039
        }
 
1040
        score += encode_block(s, src         , ref         , decoded         , stride, level-1, threshold>>1, lambda, intra);
 
1041
        score += encode_block(s, src + offset, ref + offset, decoded + offset, stride, level-1, threshold>>1, lambda, intra);
 
1042
        score += lambda;
 
1043
 
 
1044
        if(score < best_score){
 
1045
            best_score= score;
 
1046
            split=1;
 
1047
        }else{
 
1048
            for(i=level-1; i>=0; i--){
 
1049
                s->reorder_pb[i]= backup[i];
 
1050
            }
 
1051
        }
 
1052
    }
 
1053
    if (level > 0)
 
1054
        put_bits(&s->reorder_pb[level], 1, split);
 
1055
 
 
1056
    if(!split){
 
1057
        assert((best_mean >= 0 && best_mean<256) || !intra);
 
1058
        assert(best_mean >= -256 && best_mean<256);
 
1059
        assert(best_count >=0 && best_count<7);
 
1060
        assert(level<4 || best_count==0);
 
1061
 
 
1062
        /* output the encoding */
 
1063
        put_bits(&s->reorder_pb[level],
 
1064
            multistage_vlc[1 + best_count][1],
 
1065
            multistage_vlc[1 + best_count][0]);
 
1066
        put_bits(&s->reorder_pb[level], mean_vlc[best_mean][1],
 
1067
            mean_vlc[best_mean][0]);
 
1068
 
 
1069
        for (i = 0; i < best_count; i++){
 
1070
            assert(best_vector[i]>=0 && best_vector[i]<16);
 
1071
            put_bits(&s->reorder_pb[level], 4, best_vector[i]);
 
1072
        }
 
1073
 
 
1074
        for(y=0; y<h; y++){
 
1075
            for(x=0; x<w; x++){
 
1076
                decoded[x + y*stride]= src[x + y*stride] - block[best_count][x + w*y] + best_mean;
 
1077
            }
 
1078
        }
 
1079
    }
 
1080
 
 
1081
    return best_score;
 
1082
}
 
1083
 
 
1084
#ifdef CONFIG_ENCODERS
 
1085
 
 
1086
static int svq1_encode_plane(SVQ1Context *s, int plane, unsigned char *src_plane, unsigned char *ref_plane, unsigned char *decoded_plane,
 
1087
    int width, int height, int src_stride, int stride)
 
1088
{
 
1089
    int x, y;
 
1090
    int i;
 
1091
    int block_width, block_height;
 
1092
    int level;
 
1093
    int threshold[6];
 
1094
    const int lambda= (s->picture.quality*s->picture.quality) >> (2*FF_LAMBDA_SHIFT);
 
1095
 
 
1096
    /* figure out the acceptable level thresholds in advance */
 
1097
    threshold[5] = QUALITY_THRESHOLD;
 
1098
    for (level = 4; level >= 0; level--)
 
1099
        threshold[level] = threshold[level + 1] * THRESHOLD_MULTIPLIER;
 
1100
 
 
1101
    block_width = (width + 15) / 16;
 
1102
    block_height = (height + 15) / 16;
 
1103
 
 
1104
    if(s->picture.pict_type == P_TYPE){
 
1105
        s->m.avctx= s->avctx;
 
1106
        s->m.current_picture_ptr= &s->m.current_picture;
 
1107
        s->m.last_picture_ptr   = &s->m.last_picture;
 
1108
        s->m.last_picture.data[0]= ref_plane;
 
1109
        s->m.linesize=
 
1110
        s->m.last_picture.linesize[0]=
 
1111
        s->m.new_picture.linesize[0]=
 
1112
        s->m.current_picture.linesize[0]= stride;
 
1113
        s->m.width= width;
 
1114
        s->m.height= height;
 
1115
        s->m.mb_width= block_width;
 
1116
        s->m.mb_height= block_height;
 
1117
        s->m.mb_stride= s->m.mb_width+1;
 
1118
        s->m.b8_stride= 2*s->m.mb_width+1;
 
1119
        s->m.f_code=1;
 
1120
        s->m.pict_type= s->picture.pict_type;
 
1121
        s->m.me_method= s->avctx->me_method;
 
1122
        s->m.me.scene_change_score=0;
 
1123
        s->m.flags= s->avctx->flags;
 
1124
//        s->m.out_format = FMT_H263;
 
1125
//        s->m.unrestricted_mv= 1;
 
1126
 
 
1127
        s->m.lambda= s->picture.quality;
 
1128
        s->m.qscale= (s->m.lambda*139 + FF_LAMBDA_SCALE*64) >> (FF_LAMBDA_SHIFT + 7);
 
1129
        s->m.lambda2= (s->m.lambda*s->m.lambda + FF_LAMBDA_SCALE/2) >> FF_LAMBDA_SHIFT;
 
1130
 
 
1131
        if(!s->motion_val8[plane]){
 
1132
            s->motion_val8 [plane]= av_mallocz((s->m.b8_stride*block_height*2 + 2)*2*sizeof(int16_t));
 
1133
            s->motion_val16[plane]= av_mallocz((s->m.mb_stride*(block_height + 2) + 1)*2*sizeof(int16_t));
 
1134
        }
 
1135
 
 
1136
        s->m.mb_type= s->mb_type;
 
1137
 
 
1138
        //dummies, to avoid segfaults
 
1139
        s->m.current_picture.mb_mean=   (uint8_t *)s->dummy;
 
1140
        s->m.current_picture.mb_var=    (uint16_t*)s->dummy;
 
1141
        s->m.current_picture.mc_mb_var= (uint16_t*)s->dummy;
 
1142
        s->m.current_picture.mb_type= s->dummy;
 
1143
 
 
1144
        s->m.current_picture.motion_val[0]= s->motion_val8[plane] + 2;
 
1145
        s->m.p_mv_table= s->motion_val16[plane] + s->m.mb_stride + 1;
 
1146
        s->m.dsp= s->dsp; //move
 
1147
        ff_init_me(&s->m);
 
1148
 
 
1149
        s->m.me.dia_size= s->avctx->dia_size;
 
1150
        s->m.first_slice_line=1;
 
1151
        for (y = 0; y < block_height; y++) {
 
1152
            uint8_t src[stride*16];
 
1153
 
 
1154
            s->m.new_picture.data[0]= src - y*16*stride; //ugly
 
1155
            s->m.mb_y= y;
 
1156
 
 
1157
            for(i=0; i<16 && i + 16*y<height; i++){
 
1158
                memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
 
1159
                for(x=width; x<16*block_width; x++)
 
1160
                    src[i*stride+x]= src[i*stride+x-1];
 
1161
            }
 
1162
            for(; i<16 && i + 16*y<16*block_height; i++)
 
1163
                memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
 
1164
 
 
1165
            for (x = 0; x < block_width; x++) {
 
1166
                s->m.mb_x= x;
 
1167
                ff_init_block_index(&s->m);
 
1168
                ff_update_block_index(&s->m);
 
1169
 
 
1170
                ff_estimate_p_frame_motion(&s->m, x, y);
 
1171
            }
 
1172
            s->m.first_slice_line=0;
 
1173
        }
 
1174
 
 
1175
        ff_fix_long_p_mvs(&s->m);
 
1176
        ff_fix_long_mvs(&s->m, NULL, 0, s->m.p_mv_table, s->m.f_code, CANDIDATE_MB_TYPE_INTER, 0);
 
1177
    }
 
1178
 
 
1179
    s->m.first_slice_line=1;
 
1180
    for (y = 0; y < block_height; y++) {
 
1181
        uint8_t src[stride*16];
 
1182
 
 
1183
        for(i=0; i<16 && i + 16*y<height; i++){
 
1184
            memcpy(&src[i*stride], &src_plane[(i+16*y)*src_stride], width);
 
1185
            for(x=width; x<16*block_width; x++)
 
1186
                src[i*stride+x]= src[i*stride+x-1];
 
1187
        }
 
1188
        for(; i<16 && i + 16*y<16*block_height; i++)
 
1189
            memcpy(&src[i*stride], &src[(i-1)*stride], 16*block_width);
 
1190
 
 
1191
        s->m.mb_y= y;
 
1192
        for (x = 0; x < block_width; x++) {
 
1193
            uint8_t reorder_buffer[3][6][7*32];
 
1194
            int count[3][6];
 
1195
            int offset = y * 16 * stride + x * 16;
 
1196
            uint8_t *decoded= decoded_plane + offset;
 
1197
            uint8_t *ref= ref_plane + offset;
 
1198
            int score[4]={0,0,0,0}, best;
 
1199
            uint8_t temp[16*stride];
 
1200
 
 
1201
            if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < 3000){ //FIXME check size
 
1202
                av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
 
1203
                return -1;
 
1204
            }
 
1205
 
 
1206
            s->m.mb_x= x;
 
1207
            ff_init_block_index(&s->m);
 
1208
            ff_update_block_index(&s->m);
 
1209
 
 
1210
            if(s->picture.pict_type == I_TYPE || (s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTRA)){
 
1211
                for(i=0; i<6; i++){
 
1212
                    init_put_bits(&s->reorder_pb[i], reorder_buffer[0][i], 7*32);
 
1213
                }
 
1214
                if(s->picture.pict_type == P_TYPE){
 
1215
                    const uint8_t *vlc= svq1_block_type_vlc[SVQ1_BLOCK_INTRA];
 
1216
                    put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
 
1217
                    score[0]= vlc[1]*lambda;
 
1218
                }
 
1219
                score[0]+= encode_block(s, src+16*x, NULL, temp, stride, 5, 64, lambda, 1);
 
1220
                for(i=0; i<6; i++){
 
1221
                    count[0][i]= put_bits_count(&s->reorder_pb[i]);
 
1222
                    flush_put_bits(&s->reorder_pb[i]);
 
1223
                }
 
1224
            }else
 
1225
                score[0]= INT_MAX;
 
1226
 
 
1227
            best=0;
 
1228
 
 
1229
            if(s->picture.pict_type == P_TYPE){
 
1230
                const uint8_t *vlc= svq1_block_type_vlc[SVQ1_BLOCK_INTER];
 
1231
                int mx, my, pred_x, pred_y, dxy;
 
1232
                int16_t *motion_ptr;
 
1233
 
 
1234
                motion_ptr= h263_pred_motion(&s->m, 0, 0, &pred_x, &pred_y);
 
1235
                if(s->m.mb_type[x + y*s->m.mb_stride]&CANDIDATE_MB_TYPE_INTER){
 
1236
                    for(i=0; i<6; i++)
 
1237
                        init_put_bits(&s->reorder_pb[i], reorder_buffer[1][i], 7*32);
 
1238
 
 
1239
                    put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
 
1240
 
 
1241
                    s->m.pb= s->reorder_pb[5];
 
1242
                    mx= motion_ptr[0];
 
1243
                    my= motion_ptr[1];
 
1244
                    assert(mx>=-32 && mx<=31);
 
1245
                    assert(my>=-32 && my<=31);
 
1246
                    assert(pred_x>=-32 && pred_x<=31);
 
1247
                    assert(pred_y>=-32 && pred_y<=31);
 
1248
                    ff_h263_encode_motion(&s->m, mx - pred_x, 1);
 
1249
                    ff_h263_encode_motion(&s->m, my - pred_y, 1);
 
1250
                    s->reorder_pb[5]= s->m.pb;
 
1251
                    score[1] += lambda*put_bits_count(&s->reorder_pb[5]);
 
1252
 
 
1253
                    dxy= (mx&1) + 2*(my&1);
 
1254
 
 
1255
                    s->dsp.put_pixels_tab[0][dxy](temp+16, ref + (mx>>1) + stride*(my>>1), stride, 16);
 
1256
 
 
1257
                    score[1]+= encode_block(s, src+16*x, temp+16, decoded, stride, 5, 64, lambda, 0);
 
1258
                    best= score[1] <= score[0];
 
1259
 
 
1260
                    vlc= svq1_block_type_vlc[SVQ1_BLOCK_SKIP];
 
1261
                    score[2]= s->dsp.sse[0](NULL, src+16*x, ref, stride, 16);
 
1262
                    score[2]+= vlc[1]*lambda;
 
1263
                    if(score[2] < score[best] && mx==0 && my==0){
 
1264
                        best=2;
 
1265
                        s->dsp.put_pixels_tab[0][0](decoded, ref, stride, 16);
 
1266
                        for(i=0; i<6; i++){
 
1267
                            count[2][i]=0;
 
1268
                        }
 
1269
                        put_bits(&s->pb, vlc[1], vlc[0]);
 
1270
                    }
 
1271
                }
 
1272
 
 
1273
                if(best==1){
 
1274
                    for(i=0; i<6; i++){
 
1275
                        count[1][i]= put_bits_count(&s->reorder_pb[i]);
 
1276
                        flush_put_bits(&s->reorder_pb[i]);
 
1277
                    }
 
1278
                }else{
 
1279
                    motion_ptr[0                 ] = motion_ptr[1                 ]=
 
1280
                    motion_ptr[2                 ] = motion_ptr[3                 ]=
 
1281
                    motion_ptr[0+2*s->m.b8_stride] = motion_ptr[1+2*s->m.b8_stride]=
 
1282
                    motion_ptr[2+2*s->m.b8_stride] = motion_ptr[3+2*s->m.b8_stride]=0;
 
1283
                }
 
1284
            }
 
1285
 
 
1286
            s->rd_total += score[best];
 
1287
 
 
1288
            for(i=5; i>=0; i--){
 
1289
                ff_copy_bits(&s->pb, reorder_buffer[best][i], count[best][i]);
 
1290
            }
 
1291
            if(best==0){
 
1292
                s->dsp.put_pixels_tab[0][0](decoded, temp, stride, 16);
 
1293
            }
 
1294
        }
 
1295
        s->m.first_slice_line=0;
 
1296
    }
 
1297
    return 0;
 
1298
}
 
1299
 
 
1300
static int svq1_encode_init(AVCodecContext *avctx)
 
1301
{
 
1302
    SVQ1Context * const s = avctx->priv_data;
 
1303
 
 
1304
    dsputil_init(&s->dsp, avctx);
 
1305
    avctx->coded_frame= (AVFrame*)&s->picture;
 
1306
 
 
1307
    s->frame_width = avctx->width;
 
1308
    s->frame_height = avctx->height;
 
1309
 
 
1310
    s->y_block_width = (s->frame_width + 15) / 16;
 
1311
    s->y_block_height = (s->frame_height + 15) / 16;
 
1312
 
 
1313
    s->c_block_width = (s->frame_width / 4 + 15) / 16;
 
1314
    s->c_block_height = (s->frame_height / 4 + 15) / 16;
 
1315
 
 
1316
    s->avctx= avctx;
 
1317
    s->m.avctx= avctx;
 
1318
    s->m.me.scratchpad= av_mallocz((avctx->width+64)*2*16*2*sizeof(uint8_t));
 
1319
    s->m.me.map       = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
 
1320
    s->m.me.score_map = av_mallocz(ME_MAP_SIZE*sizeof(uint32_t));
 
1321
    s->mb_type        = av_mallocz((s->y_block_width+1)*s->y_block_height*sizeof(int16_t));
 
1322
    s->dummy          = av_mallocz((s->y_block_width+1)*s->y_block_height*sizeof(int32_t));
 
1323
    h263_encode_init(&s->m); //mv_penalty
 
1324
 
 
1325
    return 0;
 
1326
}
 
1327
 
 
1328
static int svq1_encode_frame(AVCodecContext *avctx, unsigned char *buf,
 
1329
    int buf_size, void *data)
 
1330
{
 
1331
    SVQ1Context * const s = avctx->priv_data;
 
1332
    AVFrame *pict = data;
 
1333
    AVFrame * const p= (AVFrame*)&s->picture;
 
1334
    AVFrame temp;
 
1335
    int i;
 
1336
 
 
1337
    if(avctx->pix_fmt != PIX_FMT_YUV410P){
 
1338
        av_log(avctx, AV_LOG_ERROR, "unsupported pixel format\n");
 
1339
        return -1;
 
1340
    }
 
1341
 
 
1342
    if(!s->current_picture.data[0]){
 
1343
        avctx->get_buffer(avctx, &s->current_picture);
 
1344
        avctx->get_buffer(avctx, &s->last_picture);
 
1345
    }
 
1346
 
 
1347
    temp= s->current_picture;
 
1348
    s->current_picture= s->last_picture;
 
1349
    s->last_picture= temp;
 
1350
 
 
1351
    init_put_bits(&s->pb, buf, buf_size);
 
1352
 
 
1353
    *p = *pict;
 
1354
    p->pict_type = avctx->frame_number % avctx->gop_size ? P_TYPE : I_TYPE;
 
1355
    p->key_frame = p->pict_type == I_TYPE;
 
1356
 
 
1357
    svq1_write_header(s, p->pict_type);
 
1358
    for(i=0; i<3; i++){
 
1359
        if(svq1_encode_plane(s, i,
 
1360
            s->picture.data[i], s->last_picture.data[i], s->current_picture.data[i],
 
1361
            s->frame_width / (i?4:1), s->frame_height / (i?4:1),
 
1362
            s->picture.linesize[i], s->current_picture.linesize[i]) < 0)
 
1363
                return -1;
 
1364
    }
 
1365
 
 
1366
//    align_put_bits(&s->pb);
 
1367
    while(put_bits_count(&s->pb) & 31)
 
1368
        put_bits(&s->pb, 1, 0);
 
1369
 
 
1370
    flush_put_bits(&s->pb);
 
1371
 
 
1372
    return (put_bits_count(&s->pb) / 8);
 
1373
}
 
1374
 
 
1375
static int svq1_encode_end(AVCodecContext *avctx)
 
1376
{
 
1377
    SVQ1Context * const s = avctx->priv_data;
 
1378
    int i;
 
1379
 
 
1380
    av_log(avctx, AV_LOG_DEBUG, "RD: %f\n", s->rd_total/(double)(avctx->width*avctx->height*avctx->frame_number));
 
1381
 
 
1382
    av_freep(&s->m.me.scratchpad);
 
1383
    av_freep(&s->m.me.map);
 
1384
    av_freep(&s->m.me.score_map);
 
1385
    av_freep(&s->mb_type);
 
1386
    av_freep(&s->dummy);
 
1387
 
 
1388
    for(i=0; i<3; i++){
 
1389
        av_freep(&s->motion_val8[i]);
 
1390
        av_freep(&s->motion_val16[i]);
 
1391
    }
 
1392
 
 
1393
    return 0;
 
1394
}
 
1395
 
 
1396
#endif //CONFIG_ENCODERS
 
1397
 
 
1398
AVCodec svq1_decoder = {
 
1399
    "svq1",
 
1400
    CODEC_TYPE_VIDEO,
 
1401
    CODEC_ID_SVQ1,
 
1402
    sizeof(MpegEncContext),
 
1403
    svq1_decode_init,
 
1404
    NULL,
 
1405
    svq1_decode_end,
 
1406
    svq1_decode_frame,
 
1407
    CODEC_CAP_DR1,
 
1408
    .flush= ff_mpeg_flush,
 
1409
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, -1},
 
1410
};
 
1411
 
 
1412
#ifdef CONFIG_ENCODERS
 
1413
 
 
1414
AVCodec svq1_encoder = {
 
1415
    "svq1",
 
1416
    CODEC_TYPE_VIDEO,
 
1417
    CODEC_ID_SVQ1,
 
1418
    sizeof(SVQ1Context),
 
1419
    svq1_encode_init,
 
1420
    svq1_encode_frame,
 
1421
    svq1_encode_end,
 
1422
    .pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, -1},
 
1423
};
 
1424
 
 
1425
#endif //CONFIG_ENCODERS