3
* ported to MPlayer by Arpi <arpi@thot.banki.hu>
4
* ported to libavcodec by Nick Kurshev <nickols_k@mail.ru>
6
* Copyright (C) 2002 the xine project
7
* Copyright (C) 2002 the ffmpeg project
9
* SVQ1 Encoder (c) 2004 Mike Melanson <melanson@pcisys.net>
11
* This file is part of FFmpeg.
13
* FFmpeg is free software; you can redistribute it and/or
14
* modify it under the terms of the GNU Lesser General Public
15
* License as published by the Free Software Foundation; either
16
* version 2.1 of the License, or (at your option) any later version.
18
* FFmpeg is distributed in the hope that it will be useful,
19
* but WITHOUT ANY WARRANTY; without even the implied warranty of
20
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
* Lesser General Public License for more details.
23
* You should have received a copy of the GNU Lesser General Public
24
* License along with FFmpeg; if not, write to the Free Software
25
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30
* Sorenson Vector Quantizer #1 (SVQ1) video codec.
31
* For more information of the SVQ1 algorithm, visit:
32
* http://www.pcisys.net/~melanson/codecs/
39
#include "mpegvideo.h"
46
extern const uint8_t mvtab[33][2];
48
static VLC svq1_block_type;
49
static VLC svq1_motion_component;
50
static VLC svq1_intra_multistage[6];
51
static VLC svq1_inter_multistage[6];
52
static VLC svq1_intra_mean;
53
static VLC svq1_inter_mean;
55
/* motion vector (prediction) */
56
typedef struct svq1_pmv_s {
61
static const uint16_t checksum_table[256] = {
62
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
63
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
64
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
65
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
66
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
67
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
68
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
69
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
70
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
71
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
72
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
73
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
74
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
75
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
76
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
77
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
78
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
79
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
80
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
81
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
82
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
83
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
84
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
85
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
86
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
87
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
88
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
89
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
90
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
91
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
92
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
93
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
96
static const uint8_t string_table[256] = {
97
0x00, 0xD5, 0x7F, 0xAA, 0xFE, 0x2B, 0x81, 0x54,
98
0x29, 0xFC, 0x56, 0x83, 0xD7, 0x02, 0xA8, 0x7D,
99
0x52, 0x87, 0x2D, 0xF8, 0xAC, 0x79, 0xD3, 0x06,
100
0x7B, 0xAE, 0x04, 0xD1, 0x85, 0x50, 0xFA, 0x2F,
101
0xA4, 0x71, 0xDB, 0x0E, 0x5A, 0x8F, 0x25, 0xF0,
102
0x8D, 0x58, 0xF2, 0x27, 0x73, 0xA6, 0x0C, 0xD9,
103
0xF6, 0x23, 0x89, 0x5C, 0x08, 0xDD, 0x77, 0xA2,
104
0xDF, 0x0A, 0xA0, 0x75, 0x21, 0xF4, 0x5E, 0x8B,
105
0x9D, 0x48, 0xE2, 0x37, 0x63, 0xB6, 0x1C, 0xC9,
106
0xB4, 0x61, 0xCB, 0x1E, 0x4A, 0x9F, 0x35, 0xE0,
107
0xCF, 0x1A, 0xB0, 0x65, 0x31, 0xE4, 0x4E, 0x9B,
108
0xE6, 0x33, 0x99, 0x4C, 0x18, 0xCD, 0x67, 0xB2,
109
0x39, 0xEC, 0x46, 0x93, 0xC7, 0x12, 0xB8, 0x6D,
110
0x10, 0xC5, 0x6F, 0xBA, 0xEE, 0x3B, 0x91, 0x44,
111
0x6B, 0xBE, 0x14, 0xC1, 0x95, 0x40, 0xEA, 0x3F,
112
0x42, 0x97, 0x3D, 0xE8, 0xBC, 0x69, 0xC3, 0x16,
113
0xEF, 0x3A, 0x90, 0x45, 0x11, 0xC4, 0x6E, 0xBB,
114
0xC6, 0x13, 0xB9, 0x6C, 0x38, 0xED, 0x47, 0x92,
115
0xBD, 0x68, 0xC2, 0x17, 0x43, 0x96, 0x3C, 0xE9,
116
0x94, 0x41, 0xEB, 0x3E, 0x6A, 0xBF, 0x15, 0xC0,
117
0x4B, 0x9E, 0x34, 0xE1, 0xB5, 0x60, 0xCA, 0x1F,
118
0x62, 0xB7, 0x1D, 0xC8, 0x9C, 0x49, 0xE3, 0x36,
119
0x19, 0xCC, 0x66, 0xB3, 0xE7, 0x32, 0x98, 0x4D,
120
0x30, 0xE5, 0x4F, 0x9A, 0xCE, 0x1B, 0xB1, 0x64,
121
0x72, 0xA7, 0x0D, 0xD8, 0x8C, 0x59, 0xF3, 0x26,
122
0x5B, 0x8E, 0x24, 0xF1, 0xA5, 0x70, 0xDA, 0x0F,
123
0x20, 0xF5, 0x5F, 0x8A, 0xDE, 0x0B, 0xA1, 0x74,
124
0x09, 0xDC, 0x76, 0xA3, 0xF7, 0x22, 0x88, 0x5D,
125
0xD6, 0x03, 0xA9, 0x7C, 0x28, 0xFD, 0x57, 0x82,
126
0xFF, 0x2A, 0x80, 0x55, 0x01, 0xD4, 0x7E, 0xAB,
127
0x84, 0x51, 0xFB, 0x2E, 0x7A, 0xAF, 0x05, 0xD0,
128
0xAD, 0x78, 0xD2, 0x07, 0x53, 0x86, 0x2C, 0xF9
131
#define SVQ1_PROCESS_VECTOR()\
132
for (; level > 0; i++) {\
133
/* process next depth */\
139
/* divide block if next bit set */\
140
if (get_bits1 (bitbuf) == 0)\
142
/* add child nodes */\
143
list[n++] = list[i];\
144
list[n++] = list[i] + (((level & 1) ? pitch : 1) << ((level / 2) + 1));\
147
#define SVQ1_ADD_CODEBOOK()\
148
/* add codebook entries to vector */\
149
for (j=0; j < stages; j++) {\
150
n3 = codebook[entries[j]] ^ 0x80808080;\
151
n1 += ((n3 & 0xFF00FF00) >> 8);\
152
n2 += (n3 & 0x00FF00FF);\
155
/* clip to [0..255] */\
156
if (n1 & 0xFF00FF00) {\
157
n3 = ((( n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
159
n1 |= (((~n1 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
160
n1 &= (n3 & 0x00FF00FF);\
163
if (n2 & 0xFF00FF00) {\
164
n3 = ((( n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
166
n2 |= (((~n2 >> 15) & 0x00010001) | 0x01000100) - 0x00010001;\
167
n2 &= (n3 & 0x00FF00FF);\
170
#define SVQ1_DO_CODEBOOK_INTRA()\
171
for (y=0; y < height; y++) {\
172
for (x=0; x < (width / 4); x++, codebook++) {\
177
dst[x] = (n1 << 8) | n2;\
182
#define SVQ1_DO_CODEBOOK_NONINTRA()\
183
for (y=0; y < height; y++) {\
184
for (x=0; x < (width / 4); x++, codebook++) {\
186
/* add mean value to vector */\
187
n1 = ((n3 & 0xFF00FF00) >> 8) + n4;\
188
n2 = (n3 & 0x00FF00FF) + n4;\
191
dst[x] = (n1 << 8) | n2;\
196
#define SVQ1_CALC_CODEBOOK_ENTRIES(cbook)\
197
codebook = (const uint32_t *) cbook[level];\
198
bit_cache = get_bits (bitbuf, 4*stages);\
199
/* calculate codebook entries for this vector */\
200
for (j=0; j < stages; j++) {\
201
entries[j] = (((bit_cache >> (4*(stages - j - 1))) & 0xF) + 16*j) << (level + 1);\
203
mean -= (stages * 128);\
204
n4 = ((mean + (mean >> 31)) << 16) | (mean & 0xFFFF);
206
static int svq1_decode_block_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
210
const uint32_t *codebook;
214
unsigned x, y, width, height, level;
215
uint32_t n1, n2, n3, n4;
217
/* initialize list for breadth first processing of vectors */
220
/* recursively process vector */
221
for (i=0, m=1, n=1, level=5; i < n; i++) {
222
SVQ1_PROCESS_VECTOR();
224
/* destination address and vector size */
225
dst = (uint32_t *) list[i];
226
width = 1 << ((4 + level) /2);
227
height = 1 << ((3 + level) /2);
229
/* get number of stages (-1 skips vector, 0 for mean only) */
230
stages = get_vlc2(bitbuf, svq1_intra_multistage[level].table, 3, 3) - 1;
233
for (y=0; y < height; y++) {
234
memset (&dst[y*(pitch / 4)], 0, width);
236
continue; /* skip vector */
239
if ((stages > 0) && (level >= 4)) {
241
av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_intra): invalid vector: stages=%i level=%i\n",stages,level);
243
return -1; /* invalid vector */
246
mean = get_vlc2(bitbuf, svq1_intra_mean.table, 8, 3);
249
for (y=0; y < height; y++) {
250
memset (&dst[y*(pitch / 4)], mean, width);
253
SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_intra_codebooks);
254
SVQ1_DO_CODEBOOK_INTRA()
261
static int svq1_decode_block_non_intra (GetBitContext *bitbuf, uint8_t *pixels, int pitch ) {
265
const uint32_t *codebook;
269
int x, y, width, height, level;
270
uint32_t n1, n2, n3, n4;
272
/* initialize list for breadth first processing of vectors */
275
/* recursively process vector */
276
for (i=0, m=1, n=1, level=5; i < n; i++) {
277
SVQ1_PROCESS_VECTOR();
279
/* destination address and vector size */
280
dst = (uint32_t *) list[i];
281
width = 1 << ((4 + level) /2);
282
height = 1 << ((3 + level) /2);
284
/* get number of stages (-1 skips vector, 0 for mean only) */
285
stages = get_vlc2(bitbuf, svq1_inter_multistage[level].table, 3, 2) - 1;
287
if (stages == -1) continue; /* skip vector */
289
if ((stages > 0) && (level >= 4)) {
291
av_log(s->avctx, AV_LOG_INFO, "Error (svq1_decode_block_non_intra): invalid vector: stages=%i level=%i\n",stages,level);
293
return -1; /* invalid vector */
296
mean = get_vlc2(bitbuf, svq1_inter_mean.table, 9, 3) - 256;
298
SVQ1_CALC_CODEBOOK_ENTRIES(ff_svq1_inter_codebooks);
299
SVQ1_DO_CODEBOOK_NONINTRA()
304
static int svq1_decode_motion_vector (GetBitContext *bitbuf, svq1_pmv_t *mv, svq1_pmv_t **pmv) {
308
for (i=0; i < 2; i++) {
310
/* get motion code */
311
diff = get_vlc2(bitbuf, svq1_motion_component.table, 7, 2);
315
if(get_bits1(bitbuf)) diff= -diff;
318
/* add median of motion vector predictors and clip result */
320
mv->y = ((diff + mid_pred(pmv[0]->y, pmv[1]->y, pmv[2]->y)) << 26) >> 26;
322
mv->x = ((diff + mid_pred(pmv[0]->x, pmv[1]->x, pmv[2]->x)) << 26) >> 26;
328
static void svq1_skip_block (uint8_t *current, uint8_t *previous, int pitch, int x, int y) {
333
src = &previous[x + y*pitch];
336
for (i=0; i < 16; i++) {
337
memcpy (dst, src, 16);
343
static int svq1_motion_inter_block (MpegEncContext *s, GetBitContext *bitbuf,
344
uint8_t *current, uint8_t *previous, int pitch,
345
svq1_pmv_t *motion, int x, int y) {
352
/* predict and decode motion vector */
359
pmv[1] = &motion[(x / 8) + 2];
360
pmv[2] = &motion[(x / 8) + 4];
363
result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
369
motion[(x / 8) + 2].x =
370
motion[(x / 8) + 3].x = mv.x;
372
motion[(x / 8) + 2].y =
373
motion[(x / 8) + 3].y = mv.y;
375
if(y + (mv.y >> 1)<0)
377
if(x + (mv.x >> 1)<0)
381
int w= (s->width+15)&~15;
382
int h= (s->height+15)&~15;
383
if(x + (mv.x >> 1)<0 || y + (mv.y >> 1)<0 || x + (mv.x >> 1) + 16 > w || y + (mv.y >> 1) + 16> h)
384
av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mv.x >> 1), y + (mv.y >> 1));
387
src = &previous[(x + (mv.x >> 1)) + (y + (mv.y >> 1))*pitch];
390
s->dsp.put_pixels_tab[0][((mv.y & 1) << 1) | (mv.x & 1)](dst,src,pitch,16);
395
static int svq1_motion_inter_4v_block (MpegEncContext *s, GetBitContext *bitbuf,
396
uint8_t *current, uint8_t *previous, int pitch,
397
svq1_pmv_t *motion,int x, int y) {
404
/* predict and decode motion vector (0) */
411
pmv[1] = &motion[(x / 8) + 2];
412
pmv[2] = &motion[(x / 8) + 4];
415
result = svq1_decode_motion_vector (bitbuf, &mv, pmv);
420
/* predict and decode motion vector (1) */
427
pmv[1] = &motion[(x / 8) + 3];
429
result = svq1_decode_motion_vector (bitbuf, &motion[0], pmv);
434
/* predict and decode motion vector (2) */
436
pmv[2] = &motion[(x / 8) + 1];
438
result = svq1_decode_motion_vector (bitbuf, &motion[(x / 8) + 2], pmv);
443
/* predict and decode motion vector (3) */
444
pmv[2] = &motion[(x / 8) + 2];
445
pmv[3] = &motion[(x / 8) + 3];
447
result = svq1_decode_motion_vector (bitbuf, pmv[3], pmv);
452
/* form predictions */
453
for (i=0; i < 4; i++) {
454
int mvx= pmv[i]->x + (i&1)*16;
455
int mvy= pmv[i]->y + (i>>1)*16;
457
///XXX /FIXME clipping or padding?
464
int w= (s->width+15)&~15;
465
int h= (s->height+15)&~15;
466
if(x + (mvx >> 1)<0 || y + (mvy >> 1)<0 || x + (mvx >> 1) + 8 > w || y + (mvy >> 1) + 8> h)
467
av_log(s->avctx, AV_LOG_INFO, "%d %d %d %d\n", x, y, x + (mvx >> 1), y + (mvy >> 1));
469
src = &previous[(x + (mvx >> 1)) + (y + (mvy >> 1))*pitch];
472
s->dsp.put_pixels_tab[1][((mvy & 1) << 1) | (mvx & 1)](dst,src,pitch,8);
474
/* select next block */
476
current += 8*(pitch - 1);
485
static int svq1_decode_delta_block (MpegEncContext *s, GetBitContext *bitbuf,
486
uint8_t *current, uint8_t *previous, int pitch,
487
svq1_pmv_t *motion, int x, int y) {
492
block_type = get_vlc2(bitbuf, svq1_block_type.table, 2, 2);
494
/* reset motion vectors */
495
if (block_type == SVQ1_BLOCK_SKIP || block_type == SVQ1_BLOCK_INTRA) {
498
motion[(x / 8) + 2].x =
499
motion[(x / 8) + 2].y =
500
motion[(x / 8) + 3].x =
501
motion[(x / 8) + 3].y = 0;
504
switch (block_type) {
505
case SVQ1_BLOCK_SKIP:
506
svq1_skip_block (current, previous, pitch, x, y);
509
case SVQ1_BLOCK_INTER:
510
result = svq1_motion_inter_block (s, bitbuf, current, previous, pitch, motion, x, y);
515
av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_block %i\n",result);
519
result = svq1_decode_block_non_intra (bitbuf, current, pitch);
522
case SVQ1_BLOCK_INTER_4V:
523
result = svq1_motion_inter_4v_block (s, bitbuf, current, previous, pitch, motion, x, y);
528
av_log(s->avctx, AV_LOG_INFO, "Error in svq1_motion_inter_4v_block %i\n",result);
532
result = svq1_decode_block_non_intra (bitbuf, current, pitch);
535
case SVQ1_BLOCK_INTRA:
536
result = svq1_decode_block_intra (bitbuf, current, pitch);
543
static uint16_t svq1_packet_checksum (const uint8_t *data, const int length, int value) {
546
for (i=0; i < length; i++) {
547
value = checksum_table[data[i] ^ (value >> 8)] ^ ((value & 0xFF) << 8);
553
static void svq1_parse_string (GetBitContext *bitbuf, uint8_t *out) {
557
out[0] = get_bits (bitbuf, 8);
559
seed = string_table[out[0]];
561
for (i=1; i <= out[0]; i++) {
562
out[i] = get_bits (bitbuf, 8) ^ seed;
563
seed = string_table[out[i] ^ seed];
567
static int svq1_decode_frame_header (GetBitContext *bitbuf,MpegEncContext *s) {
569
int temporal_reference;
571
temporal_reference = get_bits (bitbuf, 8);
574
s->pict_type= get_bits (bitbuf, 2)+1;
578
if (s->pict_type == FF_I_TYPE) {
581
if (s->f_code == 0x50 || s->f_code == 0x60) {
582
int csum = get_bits (bitbuf, 16);
584
csum = svq1_packet_checksum (bitbuf->buffer, bitbuf->size_in_bits>>3, csum);
586
// av_log(s->avctx, AV_LOG_INFO, "%s checksum (%02x) for packet data\n",
587
// (csum == 0) ? "correct" : "incorrect", csum);
590
if ((s->f_code ^ 0x10) >= 0x50) {
593
svq1_parse_string (bitbuf, msg);
595
av_log(s->avctx, AV_LOG_INFO, "embedded message: \"%s\"\n", (char *) msg);
598
skip_bits (bitbuf, 2);
599
skip_bits (bitbuf, 2);
602
/* load frame size */
603
frame_size_code = get_bits (bitbuf, 3);
605
if (frame_size_code == 7) {
606
/* load width, height (12 bits each) */
607
s->width = get_bits (bitbuf, 12);
608
s->height = get_bits (bitbuf, 12);
610
if (!s->width || !s->height)
613
/* get width, height from table */
614
s->width = ff_svq1_frame_size_table[frame_size_code].width;
615
s->height = ff_svq1_frame_size_table[frame_size_code].height;
620
if (get_bits1 (bitbuf) == 1) {
621
skip_bits1 (bitbuf); /* use packet checksum if (1) */
622
skip_bits1 (bitbuf); /* component checksums after image data if (1) */
624
if (get_bits (bitbuf, 2) != 0)
628
if (get_bits1 (bitbuf) == 1) {
630
skip_bits (bitbuf, 4);
632
skip_bits (bitbuf, 2);
634
while (get_bits1 (bitbuf) == 1) {
635
skip_bits (bitbuf, 8);
642
static int svq1_decode_frame(AVCodecContext *avctx,
643
void *data, int *data_size,
644
const uint8_t *buf, int buf_size)
646
MpegEncContext *s=avctx->priv_data;
647
uint8_t *current, *previous;
648
int result, i, x, y, width, height;
649
AVFrame *pict = data;
651
/* initialize bit buffer */
652
init_get_bits(&s->gb,buf,buf_size*8);
654
/* decode frame header */
655
s->f_code = get_bits (&s->gb, 22);
657
if ((s->f_code & ~0x70) || !(s->f_code & 0x60))
660
/* swap some header bytes (why?) */
661
if (s->f_code != 0x20) {
662
uint32_t *src = (uint32_t *) (buf + 4);
664
for (i=0; i < 4; i++) {
665
src[i] = ((src[i] << 16) | (src[i] >> 16)) ^ src[7 - i];
669
result = svq1_decode_frame_header (&s->gb, s);
674
av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_frame_header %i\n",result);
679
//FIXME this avoids some confusion for "B frames" without 2 references
680
//this should be removed after libavcodec can handle more flexible picture types & ordering
681
if(s->pict_type==FF_B_TYPE && s->last_picture_ptr==NULL) return buf_size;
683
if(avctx->hurry_up && s->pict_type==FF_B_TYPE) return buf_size;
684
if( (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==FF_B_TYPE)
685
||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=FF_I_TYPE)
686
|| avctx->skip_frame >= AVDISCARD_ALL)
689
if(MPV_frame_start(s, avctx) < 0)
692
/* decode y, u and v components */
693
for (i=0; i < 3; i++) {
696
width = (s->width+15)&~15;
697
height = (s->height+15)&~15;
698
linesize= s->linesize;
700
if(s->flags&CODEC_FLAG_GRAY) break;
701
width = (s->width/4+15)&~15;
702
height = (s->height/4+15)&~15;
703
linesize= s->uvlinesize;
706
current = s->current_picture.data[i];
708
if(s->pict_type==FF_B_TYPE){
709
previous = s->next_picture.data[i];
711
previous = s->last_picture.data[i];
714
if (s->pict_type == FF_I_TYPE) {
716
for (y=0; y < height; y+=16) {
717
for (x=0; x < width; x+=16) {
718
result = svq1_decode_block_intra (&s->gb, ¤t[x], linesize);
722
av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_block %i (keyframe)\n",result);
727
current += 16*linesize;
730
svq1_pmv_t pmv[width/8+3];
732
memset (pmv, 0, ((width / 8) + 3) * sizeof(svq1_pmv_t));
734
for (y=0; y < height; y+=16) {
735
for (x=0; x < width; x+=16) {
736
result = svq1_decode_delta_block (s, &s->gb, ¤t[x], previous,
737
linesize, pmv, x, y);
741
av_log(s->avctx, AV_LOG_INFO, "Error in svq1_decode_delta_block %i\n",result);
750
current += 16*linesize;
755
*pict = *(AVFrame*)&s->current_picture;
760
*data_size=sizeof(AVFrame);
764
static av_cold int svq1_decode_init(AVCodecContext *avctx)
766
MpegEncContext *s = avctx->priv_data;
769
MPV_decode_defaults(s);
772
s->width = (avctx->width+3)&~3;
773
s->height = (avctx->height+3)&~3;
774
s->codec_id= avctx->codec->id;
775
avctx->pix_fmt = PIX_FMT_YUV410P;
776
avctx->has_b_frames= 1; // not true, but DP frames and these behave like unidirectional b frames
777
s->flags= avctx->flags;
778
if (MPV_common_init(s) < 0) return -1;
780
init_vlc(&svq1_block_type, 2, 4,
781
&ff_svq1_block_type_vlc[0][1], 2, 1,
782
&ff_svq1_block_type_vlc[0][0], 2, 1, 1);
784
init_vlc(&svq1_motion_component, 7, 33,
786
&mvtab[0][0], 2, 1, 1);
788
for (i = 0; i < 6; i++) {
789
init_vlc(&svq1_intra_multistage[i], 3, 8,
790
&ff_svq1_intra_multistage_vlc[i][0][1], 2, 1,
791
&ff_svq1_intra_multistage_vlc[i][0][0], 2, 1, 1);
792
init_vlc(&svq1_inter_multistage[i], 3, 8,
793
&ff_svq1_inter_multistage_vlc[i][0][1], 2, 1,
794
&ff_svq1_inter_multistage_vlc[i][0][0], 2, 1, 1);
797
init_vlc(&svq1_intra_mean, 8, 256,
798
&ff_svq1_intra_mean_vlc[0][1], 4, 2,
799
&ff_svq1_intra_mean_vlc[0][0], 4, 2, 1);
801
init_vlc(&svq1_inter_mean, 9, 512,
802
&ff_svq1_inter_mean_vlc[0][1], 4, 2,
803
&ff_svq1_inter_mean_vlc[0][0], 4, 2, 1);
808
static av_cold int svq1_decode_end(AVCodecContext *avctx)
810
MpegEncContext *s = avctx->priv_data;
817
AVCodec svq1_decoder = {
821
sizeof(MpegEncContext),
827
.flush= ff_mpeg_flush,
828
.pix_fmts= (enum PixelFormat[]){PIX_FMT_YUV410P, -1},
829
.long_name= "Sorenson Vector Quantizer 1",