Statistics
| Branch: | Revision:

ffmpeg / libavcodec / svq3.c @ 2264c110

History | View | Annotate | Download (39.7 KB)

1 8b82a956 Michael Niedermayer
/*
2 406792e7 Diego Biurrun
 * Copyright (c) 2003 The FFmpeg Project
3 8b82a956 Michael Niedermayer
 *
4 b78e7197 Diego Biurrun
 * This file is part of FFmpeg.
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
7 8b82a956 Michael Niedermayer
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9 b78e7197 Diego Biurrun
 * version 2.1 of the License, or (at your option) any later version.
10 8b82a956 Michael Niedermayer
 *
11 b78e7197 Diego Biurrun
 * FFmpeg is distributed in the hope that it will be useful,
12 8b82a956 Michael Niedermayer
 * 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 b78e7197 Diego Biurrun
 * License along with FFmpeg; if not, write to the Free Software
18 5509bffa Diego Biurrun
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 e5a389a1 Diego Biurrun
 */
20
21
/*
22 8b82a956 Michael Niedermayer
 * How to use this decoder:
23
 * SVQ3 data is transported within Apple Quicktime files. Quicktime files
24 89a79364 Mike Melanson
 * have stsd atoms to describe media trak properties. A stsd atom for a
25
 * video trak contains 1 or more ImageDescription atoms. These atoms begin
26
 * with the 4-byte length of the atom followed by the codec fourcc. Some
27
 * decoders need information in this atom to operate correctly. Such
28
 * is the case with SVQ3. In order to get the best use out of this decoder,
29
 * the calling app must make the SVQ3 ImageDescription atom available
30 8b82a956 Michael Niedermayer
 * via the AVCodecContext's extradata[_size] field:
31
 *
32 115329f1 Diego Biurrun
 * AVCodecContext.extradata = pointer to ImageDescription, first characters
33 89a79364 Mike Melanson
 * are expected to be 'S', 'V', 'Q', and '3', NOT the 4-byte atom length
34 115329f1 Diego Biurrun
 * AVCodecContext.extradata_size = size of ImageDescription atom memory
35
 * buffer (which will be the same as the ImageDescription atom size field
36 89a79364 Mike Melanson
 * from the QT file, minus 4 bytes since the length is missing)
37
 *
38
 * You will know you have these parameters passed correctly when the decoder
39
 * correctly decodes this file:
40 ddaf298c Diego Biurrun
 *  http://samples.mplayerhq.hu/V-codecs/SVQ3/Vertical400kbit.sorenson3.mov
41 8b82a956 Michael Niedermayer
 */
42 903d58f6 Michael Niedermayer
#include "internal.h"
43
#include "dsputil.h"
44
#include "avcodec.h"
45
#include "mpegvideo.h"
46
#include "h264.h"
47
48
#include "h264data.h" //FIXME FIXME FIXME
49
50 188d3c51 Michael Niedermayer
#include "h264_mvpred.h"
51 903d58f6 Michael Niedermayer
#include "golomb.h"
52
#include "rectangle.h"
53
#include "vdpau_internal.h"
54
55 b250f9c6 Aurelien Jacobs
#if CONFIG_ZLIB
56 c4864924 Baptiste Coudurier
#include <zlib.h>
57
#endif
58
59 2be3fe39 Diego Biurrun
#include "svq1.h"
60
61 8b82a956 Michael Niedermayer
/**
62 ba87f080 Diego Biurrun
 * @file
63 8b82a956 Michael Niedermayer
 * svq3 decoder.
64
 */
65
66 8811679c Baptiste Coudurier
typedef struct {
67
    H264Context h;
68
    int halfpel_flag;
69
    int thirdpel_flag;
70
    int unknown_flag;
71
    int next_slice_index;
72
    uint32_t watermark_key;
73 2264c110 Baptiste Coudurier
    uint8_t *buf;
74
    int buf_size;
75 8811679c Baptiste Coudurier
} SVQ3Context;
76
77 115329f1 Diego Biurrun
#define FULLPEL_MODE  1
78
#define HALFPEL_MODE  2
79 94d44f45 Michael Niedermayer
#define THIRDPEL_MODE 3
80 2e26c8d2 Mike Melanson
#define PREDICT_MODE  4
81 115329f1 Diego Biurrun
82 f7a8c179 Michael Niedermayer
/* dual scan (from some older h264 draft)
83
 o-->o-->o   o
84
         |  /|
85
 o   o   o / o
86
 | / |   |/  |
87
 o   o   o   o
88 115329f1 Diego Biurrun
   /
89 f7a8c179 Michael Niedermayer
 o-->o-->o-->o
90
*/
91 76de302d Diego Biurrun
static const uint8_t svq3_scan[16] = {
92
    0+0*4, 1+0*4, 2+0*4, 2+1*4,
93
    2+2*4, 3+0*4, 3+1*4, 3+2*4,
94
    0+1*4, 0+2*4, 1+1*4, 1+2*4,
95
    0+3*4, 1+3*4, 2+3*4, 3+3*4,
96 8b82a956 Michael Niedermayer
};
97
98
static const uint8_t svq3_pred_0[25][2] = {
99 76de302d Diego Biurrun
    { 0, 0 },
100
    { 1, 0 }, { 0, 1 },
101
    { 0, 2 }, { 1, 1 }, { 2, 0 },
102
    { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
103
    { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
104
    { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
105
    { 2, 4 }, { 3, 3 }, { 4, 2 },
106
    { 4, 3 }, { 3, 4 },
107
    { 4, 4 }
108 8b82a956 Michael Niedermayer
};
109
110
static const int8_t svq3_pred_1[6][6][5] = {
111 76de302d Diego Biurrun
    { { 2,-1,-1,-1,-1 }, { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 },
112
      { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, { 1, 2,-1,-1,-1 } },
113
    { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
114
      { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
115
    { { 2, 0,-1,-1,-1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
116
      { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
117
    { { 2, 0,-1,-1,-1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
118
      { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
119
    { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
120
      { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
121
    { { 0, 2,-1,-1,-1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
122
      { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
123 8b82a956 Michael Niedermayer
};
124
125
static const struct { uint8_t run; uint8_t level; } svq3_dct_tables[2][16] = {
126 76de302d Diego Biurrun
    { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
127
      { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
128
    { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
129
      { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
130 8b82a956 Michael Niedermayer
};
131
132
static const uint32_t svq3_dequant_coeff[32] = {
133 76de302d Diego Biurrun
     3881,  4351,  4890,  5481,  6154,  6914,  7761,  8718,
134
     9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
135
    24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
136
    61694, 68745, 77615, 89113,100253,109366,126635,141533
137 8b82a956 Michael Niedermayer
};
138
139 290fabc6 Jason Garrett-Glaser
void ff_svq3_luma_dc_dequant_idct_c(DCTELEM *output, DCTELEM *input, int qp){
140 76de302d Diego Biurrun
    const int qmul = svq3_dequant_coeff[qp];
141 8b82a956 Michael Niedermayer
#define stride 16
142
    int i;
143
    int temp[16];
144 290fabc6 Jason Garrett-Glaser
    static const uint8_t x_offset[4]={0, 1*stride, 4*stride, 5*stride};
145 76de302d Diego Biurrun
146 290fabc6 Jason Garrett-Glaser
    for(i=0; i<4; i++){
147
        const int z0 = 13*(input[4*i+0] +    input[4*i+2]);
148
        const int z1 = 13*(input[4*i+0] -    input[4*i+2]);
149
        const int z2 =  7* input[4*i+1] - 17*input[4*i+3];
150
        const int z3 = 17* input[4*i+1] +  7*input[4*i+3];
151 76de302d Diego Biurrun
152
        temp[4*i+0] = z0+z3;
153
        temp[4*i+1] = z1+z2;
154
        temp[4*i+2] = z1-z2;
155
        temp[4*i+3] = z0-z3;
156 8b82a956 Michael Niedermayer
    }
157
158 290fabc6 Jason Garrett-Glaser
    for(i=0; i<4; i++){
159
        const int offset= x_offset[i];
160
        const int z0= 13*(temp[4*0+i] +    temp[4*2+i]);
161
        const int z1= 13*(temp[4*0+i] -    temp[4*2+i]);
162
        const int z2=  7* temp[4*1+i] - 17*temp[4*3+i];
163
        const int z3= 17* temp[4*1+i] +  7*temp[4*3+i];
164
165
        output[stride* 0+offset] = ((z0 + z3)*qmul + 0x80000) >> 20;
166
        output[stride* 2+offset] = ((z1 + z2)*qmul + 0x80000) >> 20;
167
        output[stride* 8+offset] = ((z1 - z2)*qmul + 0x80000) >> 20;
168
        output[stride*10+offset] = ((z0 - z3)*qmul + 0x80000) >> 20;
169 8b82a956 Michael Niedermayer
    }
170
}
171
#undef stride
172
173 881b5b80 Rafaël Carré
void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp,
174 76de302d Diego Biurrun
                            int dc)
175 7f8205da Diego Biurrun
{
176 76de302d Diego Biurrun
    const int qmul = svq3_dequant_coeff[qp];
177 8b82a956 Michael Niedermayer
    int i;
178 55fde95e Måns Rullgård
    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
179 8b82a956 Michael Niedermayer
180
    if (dc) {
181
        dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
182
        block[0] = 0;
183
    }
184
185 76de302d Diego Biurrun
    for (i = 0; i < 4; i++) {
186
        const int z0 = 13*(block[0 + 4*i] +    block[2 + 4*i]);
187
        const int z1 = 13*(block[0 + 4*i] -    block[2 + 4*i]);
188
        const int z2 =  7* block[1 + 4*i] - 17*block[3 + 4*i];
189
        const int z3 = 17* block[1 + 4*i] +  7*block[3 + 4*i];
190 8b82a956 Michael Niedermayer
191 76de302d Diego Biurrun
        block[0 + 4*i] = z0 + z3;
192
        block[1 + 4*i] = z1 + z2;
193
        block[2 + 4*i] = z1 - z2;
194
        block[3 + 4*i] = z0 - z3;
195 8b82a956 Michael Niedermayer
    }
196
197 76de302d Diego Biurrun
    for (i = 0; i < 4; i++) {
198
        const int z0 = 13*(block[i + 4*0] +    block[i + 4*2]);
199
        const int z1 = 13*(block[i + 4*0] -    block[i + 4*2]);
200
        const int z2 =  7* block[i + 4*1] - 17*block[i + 4*3];
201
        const int z3 = 17* block[i + 4*1] +  7*block[i + 4*3];
202
        const int rr = (dc + 0x80000);
203
204
        dst[i + stride*0] = cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ];
205
        dst[i + stride*1] = cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ];
206
        dst[i + stride*2] = cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ];
207
        dst[i + stride*3] = cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ];
208 8b82a956 Michael Niedermayer
    }
209
}
210
211 7f8205da Diego Biurrun
static inline int svq3_decode_block(GetBitContext *gb, DCTELEM *block,
212
                                    int index, const int type)
213
{
214 76de302d Diego Biurrun
    static const uint8_t *const scan_patterns[4] =
215
    { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan };
216 8b82a956 Michael Niedermayer
217 76de302d Diego Biurrun
    int run, level, sign, vlc, limit;
218
    const int intra = (3 * type) >> 2;
219
    const uint8_t *const scan = scan_patterns[type];
220 8b82a956 Michael Niedermayer
221 76de302d Diego Biurrun
    for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
222
        for (; (vlc = svq3_get_ue_golomb(gb)) != 0; index++) {
223 8b82a956 Michael Niedermayer
224 76de302d Diego Biurrun
          if (vlc == INVALID_VLC)
225
              return -1;
226 8b82a956 Michael Niedermayer
227 76de302d Diego Biurrun
          sign = (vlc & 0x1) - 1;
228
          vlc  = (vlc + 1) >> 1;
229
230
          if (type == 3) {
231
              if (vlc < 3) {
232
                  run   = 0;
233
                  level = vlc;
234
              } else if (vlc < 4) {
235
                  run   = 1;
236
                  level = 1;
237
              } else {
238
                  run   = (vlc & 0x3);
239
                  level = ((vlc + 9) >> 2) - run;
240
              }
241
          } else {
242
              if (vlc < 16) {
243
                  run   = svq3_dct_tables[intra][vlc].run;
244
                  level = svq3_dct_tables[intra][vlc].level;
245
              } else if (intra) {
246
                  run   = (vlc & 0x7);
247
                  level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
248
              } else {
249
                  run   = (vlc & 0xF);
250
                  level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
251
              }
252
          }
253 8b82a956 Michael Niedermayer
254 76de302d Diego Biurrun
          if ((index += run) >= limit)
255
              return -1;
256 8b82a956 Michael Niedermayer
257 76de302d Diego Biurrun
          block[scan[index]] = (level ^ sign) - sign;
258
        }
259 8b82a956 Michael Niedermayer
260 76de302d Diego Biurrun
        if (type != 2) {
261
            break;
262
        }
263 8b82a956 Michael Niedermayer
    }
264
265 76de302d Diego Biurrun
    return 0;
266 8b82a956 Michael Niedermayer
}
267
268 7f8205da Diego Biurrun
static inline void svq3_mc_dir_part(MpegEncContext *s,
269
                                    int x, int y, int width, int height,
270
                                    int mx, int my, int dxy,
271
                                    int thirdpel, int dir, int avg)
272
{
273 76de302d Diego Biurrun
    const Picture *pic = (dir == 0) ? &s->last_picture : &s->next_picture;
274
    uint8_t *src, *dest;
275
    int i, emu = 0;
276
    int blocksize = 2 - (width>>3); //16->0, 8->1, 4->2
277
278
    mx += x;
279
    my += y;
280 8b82a956 Michael Niedermayer
281 76de302d Diego Biurrun
    if (mx < 0 || mx >= (s->h_edge_pos - width  - 1) ||
282
        my < 0 || my >= (s->v_edge_pos - height - 1)) {
283 115329f1 Diego Biurrun
284 76de302d Diego Biurrun
        if ((s->flags & CODEC_FLAG_EMU_EDGE)) {
285
            emu = 1;
286
        }
287 8b82a956 Michael Niedermayer
288 76de302d Diego Biurrun
        mx = av_clip (mx, -16, (s->h_edge_pos - width  + 15));
289
        my = av_clip (my, -16, (s->v_edge_pos - height + 15));
290 8b82a956 Michael Niedermayer
    }
291
292 76de302d Diego Biurrun
    /* form component predictions */
293
    dest = s->current_picture.data[0] + x + y*s->linesize;
294
    src  = pic->data[0] + mx + my*s->linesize;
295
296
    if (emu) {
297 d23e3e5f Ronald S. Bultje
        s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, (width + 1), (height + 1),
298 76de302d Diego Biurrun
                            mx, my, s->h_edge_pos, s->v_edge_pos);
299 a7d3e772 Mike Melanson
        src = s->edge_emu_buffer;
300 8b82a956 Michael Niedermayer
    }
301 76de302d Diego Biurrun
    if (thirdpel)
302
        (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize, width, height);
303
    else
304
        (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize, height);
305
306
    if (!(s->flags & CODEC_FLAG_GRAY)) {
307
        mx     = (mx + (mx < (int) x)) >> 1;
308
        my     = (my + (my < (int) y)) >> 1;
309
        width  = (width  >> 1);
310
        height = (height >> 1);
311
        blocksize++;
312
313
        for (i = 1; i < 3; i++) {
314
            dest = s->current_picture.data[i] + (x >> 1) + (y >> 1)*s->uvlinesize;
315
            src  = pic->data[i] + mx + my*s->uvlinesize;
316
317
            if (emu) {
318 d23e3e5f Ronald S. Bultje
                s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->uvlinesize, (width + 1), (height + 1),
319 76de302d Diego Biurrun
                                    mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1));
320
                src = s->edge_emu_buffer;
321
            }
322
            if (thirdpel)
323
                (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->uvlinesize, width, height);
324
            else
325
                (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height);
326
        }
327
    }
328 8b82a956 Michael Niedermayer
}
329
330 7f8205da Diego Biurrun
static inline int svq3_mc_dir(H264Context *h, int size, int mode, int dir,
331
                              int avg)
332
{
333 76de302d Diego Biurrun
    int i, j, k, mx, my, dx, dy, x, y;
334
    MpegEncContext *const s = (MpegEncContext *) h;
335
    const int part_width  = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
336
    const int part_height = 16 >> ((unsigned) (size + 1) / 3);
337
    const int extra_width = (mode == PREDICT_MODE) ? -16*6 : 0;
338
    const int h_edge_pos  = 6*(s->h_edge_pos - part_width ) - extra_width;
339
    const int v_edge_pos  = 6*(s->v_edge_pos - part_height) - extra_width;
340
341
    for (i = 0; i < 16; i += part_height) {
342
        for (j = 0; j < 16; j += part_width) {
343
            const int b_xy = (4*s->mb_x + (j >> 2)) + (4*s->mb_y + (i >> 2))*h->b_stride;
344
            int dxy;
345
            x = 16*s->mb_x + j;
346
            y = 16*s->mb_y + i;
347
            k = ((j >> 2) & 1) + ((i >> 1) & 2) + ((j >> 1) & 4) + (i & 8);
348
349
            if (mode != PREDICT_MODE) {
350
                pred_motion(h, k, (part_width >> 2), dir, 1, &mx, &my);
351
            } else {
352
                mx = s->next_picture.motion_val[0][b_xy][0]<<1;
353
                my = s->next_picture.motion_val[0][b_xy][1]<<1;
354
355
                if (dir == 0) {
356
                    mx = ((mx * h->frame_num_offset) / h->prev_frame_num_offset + 1) >> 1;
357
                    my = ((my * h->frame_num_offset) / h->prev_frame_num_offset + 1) >> 1;
358
                } else {
359
                    mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1) >> 1;
360
                    my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1) >> 1;
361
                }
362
            }
363
364
            /* clip motion vector prediction to frame border */
365
            mx = av_clip(mx, extra_width - 6*x, h_edge_pos - 6*x);
366
            my = av_clip(my, extra_width - 6*y, v_edge_pos - 6*y);
367
368
            /* get (optional) motion vector differential */
369
            if (mode == PREDICT_MODE) {
370
                dx = dy = 0;
371
            } else {
372
                dy = svq3_get_se_golomb(&s->gb);
373
                dx = svq3_get_se_golomb(&s->gb);
374
375
                if (dx == INVALID_VLC || dy == INVALID_VLC) {
376
                    av_log(h->s.avctx, AV_LOG_ERROR, "invalid MV vlc\n");
377
                    return -1;
378
                }
379
            }
380
381
            /* compute motion vector */
382
            if (mode == THIRDPEL_MODE) {
383
                int fx, fy;
384
                mx  = ((mx + 1)>>1) + dx;
385
                my  = ((my + 1)>>1) + dy;
386
                fx  = ((unsigned)(mx + 0x3000))/3 - 0x1000;
387
                fy  = ((unsigned)(my + 0x3000))/3 - 0x1000;
388
                dxy = (mx - 3*fx) + 4*(my - 3*fy);
389
390
                svq3_mc_dir_part(s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg);
391
                mx += mx;
392
                my += my;
393
            } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
394
                mx  = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
395
                my  = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
396
                dxy = (mx&1) + 2*(my&1);
397
398
                svq3_mc_dir_part(s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg);
399
                mx *= 3;
400
                my *= 3;
401
            } else {
402
                mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
403
                my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;
404
405
                svq3_mc_dir_part(s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg);
406
                mx *= 6;
407
                my *= 6;
408
            }
409
410
            /* update mv_cache */
411
            if (mode != PREDICT_MODE) {
412
                int32_t mv = pack16to32(mx,my);
413
414
                if (part_height == 8 && i < 8) {
415
                    *(int32_t *) h->mv_cache[dir][scan8[k] + 1*8] = mv;
416
417
                    if (part_width == 8 && j < 8) {
418
                        *(int32_t *) h->mv_cache[dir][scan8[k] + 1 + 1*8] = mv;
419
                    }
420
                }
421
                if (part_width == 8 && j < 8) {
422
                    *(int32_t *) h->mv_cache[dir][scan8[k] + 1] = mv;
423
                }
424
                if (part_width == 4 || part_height == 4) {
425
                    *(int32_t *) h->mv_cache[dir][scan8[k]] = mv;
426
                }
427
            }
428
429
            /* write back motion vectors */
430
            fill_rectangle(s->current_picture.motion_val[dir][b_xy], part_width>>2, part_height>>2, h->b_stride, pack16to32(mx,my), 4);
431 bb270c08 Diego Biurrun
        }
432 2e26c8d2 Mike Melanson
    }
433
434 76de302d Diego Biurrun
    return 0;
435 2e26c8d2 Mike Melanson
}
436
437 8811679c Baptiste Coudurier
static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
438 7f8205da Diego Biurrun
{
439 8811679c Baptiste Coudurier
    H264Context *h = &svq3->h;
440 76de302d Diego Biurrun
    int i, j, k, m, dir, mode;
441
    int cbp = 0;
442
    uint32_t vlc;
443
    int8_t *top, *left;
444
    MpegEncContext *const s = (MpegEncContext *) h;
445
    const int mb_xy = h->mb_xy;
446
    const int b_xy  = 4*s->mb_x + 4*s->mb_y*h->b_stride;
447
448
    h->top_samples_available      = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
449
    h->left_samples_available     = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
450
    h->topright_samples_available = 0xFFFF;
451
452
    if (mb_type == 0) {           /* SKIP */
453 ce5e49b0 Stefano Sabatini
        if (s->pict_type == AV_PICTURE_TYPE_P || s->next_picture.mb_type[mb_xy] == -1) {
454 76de302d Diego Biurrun
            svq3_mc_dir_part(s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0);
455
456 ce5e49b0 Stefano Sabatini
            if (s->pict_type == AV_PICTURE_TYPE_B) {
457 76de302d Diego Biurrun
                svq3_mc_dir_part(s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 1, 1);
458
            }
459
460
            mb_type = MB_TYPE_SKIP;
461
        } else {
462
            mb_type = FFMIN(s->next_picture.mb_type[mb_xy], 6);
463
            if (svq3_mc_dir(h, mb_type, PREDICT_MODE, 0, 0) < 0)
464
                return -1;
465
            if (svq3_mc_dir(h, mb_type, PREDICT_MODE, 1, 1) < 0)
466
                return -1;
467 8b82a956 Michael Niedermayer
468 76de302d Diego Biurrun
            mb_type = MB_TYPE_16x16;
469 bb270c08 Diego Biurrun
        }
470 76de302d Diego Biurrun
    } else if (mb_type < 8) {     /* INTER */
471 8811679c Baptiste Coudurier
        if (svq3->thirdpel_flag && svq3->halfpel_flag == !get_bits1 (&s->gb)) {
472 76de302d Diego Biurrun
            mode = THIRDPEL_MODE;
473 8811679c Baptiste Coudurier
        } else if (svq3->halfpel_flag && svq3->thirdpel_flag == !get_bits1 (&s->gb)) {
474 76de302d Diego Biurrun
            mode = HALFPEL_MODE;
475
        } else {
476
            mode = FULLPEL_MODE;
477 bb270c08 Diego Biurrun
        }
478 8b82a956 Michael Niedermayer
479 76de302d Diego Biurrun
        /* fill caches */
480
        /* note ref_cache should contain here:
481
            ????????
482
            ???11111
483
            N??11111
484
            N??11111
485
            N??11111
486
        */
487
488
        for (m = 0; m < 2; m++) {
489 3b606e71 Michael Niedermayer
            if (s->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6] != -1) {
490 76de302d Diego Biurrun
                for (i = 0; i < 4; i++) {
491
                    *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - 1 + i*h->b_stride];
492
                }
493
            } else {
494
                for (i = 0; i < 4; i++) {
495
                    *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0;
496
                }
497
            }
498
            if (s->mb_y > 0) {
499
                memcpy(h->mv_cache[m][scan8[0] - 1*8], s->current_picture.motion_val[m][b_xy - h->b_stride], 4*2*sizeof(int16_t));
500 3b606e71 Michael Niedermayer
                memset(&h->ref_cache[m][scan8[0] - 1*8], (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
501 76de302d Diego Biurrun
502
                if (s->mb_x < (s->mb_width - 1)) {
503
                    *(uint32_t *) h->mv_cache[m][scan8[0] + 4 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride + 4];
504
                    h->ref_cache[m][scan8[0] + 4 - 1*8] =
505 3b606e71 Michael Niedermayer
                        (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride + 1]+6] == -1 ||
506
                         h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride    ]  ] == -1) ? PART_NOT_AVAILABLE : 1;
507 76de302d Diego Biurrun
                }else
508
                    h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
509
                if (s->mb_x > 0) {
510
                    *(uint32_t *) h->mv_cache[m][scan8[0] - 1 - 1*8] = *(uint32_t *) s->current_picture.motion_val[m][b_xy - h->b_stride - 1];
511 3b606e71 Michael Niedermayer
                    h->ref_cache[m][scan8[0] - 1 - 1*8] = (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1]+3] == -1) ? PART_NOT_AVAILABLE : 1;
512 76de302d Diego Biurrun
                }else
513
                    h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
514
            }else
515
                memset(&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);
516
517 ce5e49b0 Stefano Sabatini
            if (s->pict_type != AV_PICTURE_TYPE_B)
518 76de302d Diego Biurrun
                break;
519 bb270c08 Diego Biurrun
        }
520 8b82a956 Michael Niedermayer
521 76de302d Diego Biurrun
        /* decode motion vector(s) and form prediction(s) */
522 ce5e49b0 Stefano Sabatini
        if (s->pict_type == AV_PICTURE_TYPE_P) {
523 76de302d Diego Biurrun
            if (svq3_mc_dir(h, (mb_type - 1), mode, 0, 0) < 0)
524
                return -1;
525 ce5e49b0 Stefano Sabatini
        } else {        /* AV_PICTURE_TYPE_B */
526 76de302d Diego Biurrun
            if (mb_type != 2) {
527
                if (svq3_mc_dir(h, 0, mode, 0, 0) < 0)
528
                    return -1;
529
            } else {
530
                for (i = 0; i < 4; i++) {
531
                    memset(s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
532
                }
533
            }
534
            if (mb_type != 1) {
535
                if (svq3_mc_dir(h, 0, mode, 1, (mb_type == 3)) < 0)
536
                    return -1;
537
            } else {
538
                for (i = 0; i < 4; i++) {
539
                    memset(s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
540
                }
541
            }
542 bb270c08 Diego Biurrun
        }
543 8b82a956 Michael Niedermayer
544 76de302d Diego Biurrun
        mb_type = MB_TYPE_16x16;
545
    } else if (mb_type == 8 || mb_type == 33) {   /* INTRA4x4 */
546
        memset(h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t));
547
548
        if (mb_type == 8) {
549
            if (s->mb_x > 0) {
550
                for (i = 0; i < 4; i++) {
551 3b606e71 Michael Niedermayer
                    h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6-i];
552 76de302d Diego Biurrun
                }
553
                if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) {
554
                    h->left_samples_available = 0x5F5F;
555
                }
556
            }
557
            if (s->mb_y > 0) {
558 3b606e71 Michael Niedermayer
                h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+0];
559
                h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+1];
560
                h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+2];
561
                h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+3];
562 76de302d Diego Biurrun
563
                if (h->intra4x4_pred_mode_cache[4+8*0] == -1) {
564
                    h->top_samples_available = 0x33FF;
565
                }
566
            }
567
568
            /* decode prediction codes for luma blocks */
569
            for (i = 0; i < 16; i+=2) {
570
                vlc = svq3_get_ue_golomb(&s->gb);
571
572
                if (vlc >= 25){
573
                    av_log(h->s.avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc);
574
                    return -1;
575
                }
576
577
                left    = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
578
                top     = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
579
580
                left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
581
                left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
582
583
                if (left[1] == -1 || left[2] == -1){
584
                    av_log(h->s.avctx, AV_LOG_ERROR, "weird prediction\n");
585
                    return -1;
586
                }
587
            }
588
        } else {    /* mb_type == 33, DC_128_PRED block type */
589
            for (i = 0; i < 4; i++) {
590
                memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4);
591
            }
592 884182b3 Michael Niedermayer
        }
593 8b82a956 Michael Niedermayer
594 903d58f6 Michael Niedermayer
        ff_h264_write_back_intra_pred_mode(h);
595 8b82a956 Michael Niedermayer
596 76de302d Diego Biurrun
        if (mb_type == 8) {
597 2bedc0e8 Michael Niedermayer
            ff_h264_check_intra4x4_pred_mode(h);
598 da3b9756 Mike Melanson
599 76de302d Diego Biurrun
            h->top_samples_available  = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
600
            h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
601
        } else {
602
            for (i = 0; i < 4; i++) {
603
                memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_128_PRED, 4);
604
            }
605 da3b9756 Mike Melanson
606 76de302d Diego Biurrun
            h->top_samples_available  = 0x33FF;
607
            h->left_samples_available = 0x5F5F;
608
        }
609 da3b9756 Mike Melanson
610 76de302d Diego Biurrun
        mb_type = MB_TYPE_INTRA4x4;
611
    } else {                      /* INTRA16x16 */
612
        dir = i_mb_type_info[mb_type - 8].pred_mode;
613
        dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
614 8b82a956 Michael Niedermayer
615 903d58f6 Michael Niedermayer
        if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir)) == -1){
616 76de302d Diego Biurrun
            av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
617
            return -1;
618
        }
619 8b82a956 Michael Niedermayer
620 76de302d Diego Biurrun
        cbp = i_mb_type_info[mb_type - 8].cbp;
621
        mb_type = MB_TYPE_INTRA16x16;
622 884182b3 Michael Niedermayer
    }
623 8b82a956 Michael Niedermayer
624 ce5e49b0 Stefano Sabatini
    if (!IS_INTER(mb_type) && s->pict_type != AV_PICTURE_TYPE_I) {
625 76de302d Diego Biurrun
        for (i = 0; i < 4; i++) {
626
            memset(s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
627
        }
628 ce5e49b0 Stefano Sabatini
        if (s->pict_type == AV_PICTURE_TYPE_B) {
629 76de302d Diego Biurrun
            for (i = 0; i < 4; i++) {
630
                memset(s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
631
            }
632
        }
633 8b82a956 Michael Niedermayer
    }
634 76de302d Diego Biurrun
    if (!IS_INTRA4x4(mb_type)) {
635 3b606e71 Michael Niedermayer
        memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy], DC_PRED, 8);
636 da3b9756 Mike Melanson
    }
637 ce5e49b0 Stefano Sabatini
    if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) {
638 76de302d Diego Biurrun
        memset(h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t));
639
        s->dsp.clear_blocks(h->mb);
640 884182b3 Michael Niedermayer
    }
641 2e26c8d2 Mike Melanson
642 ce5e49b0 Stefano Sabatini
    if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
643 76de302d Diego Biurrun
        if ((vlc = svq3_get_ue_golomb(&s->gb)) >= 48){
644
            av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc);
645
            return -1;
646
        }
647 8b82a956 Michael Niedermayer
648 76de302d Diego Biurrun
        cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc];
649 884182b3 Michael Niedermayer
    }
650 ce5e49b0 Stefano Sabatini
    if (IS_INTRA16x16(mb_type) || (s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
651 76de302d Diego Biurrun
        s->qscale += svq3_get_se_golomb(&s->gb);
652 8b82a956 Michael Niedermayer
653 76de302d Diego Biurrun
        if (s->qscale > 31){
654
            av_log(h->s.avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
655 bb270c08 Diego Biurrun
            return -1;
656
        }
657 8b82a956 Michael Niedermayer
    }
658 76de302d Diego Biurrun
    if (IS_INTRA16x16(mb_type)) {
659 290fabc6 Jason Garrett-Glaser
        AV_ZERO128(h->mb_luma_dc+0);
660
        AV_ZERO128(h->mb_luma_dc+8);
661
        if (svq3_decode_block(&s->gb, h->mb_luma_dc, 0, 1)){
662 76de302d Diego Biurrun
            av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding intra luma dc\n");
663
            return -1;
664 884182b3 Michael Niedermayer
        }
665 76de302d Diego Biurrun
    }
666 8b82a956 Michael Niedermayer
667 76de302d Diego Biurrun
    if (cbp) {
668
        const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
669
        const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
670
671
        for (i = 0; i < 4; i++) {
672
            if ((cbp & (1 << i))) {
673
                for (j = 0; j < 4; j++) {
674
                    k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j);
675
                    h->non_zero_count_cache[ scan8[k] ] = 1;
676
677
                    if (svq3_decode_block(&s->gb, &h->mb[16*k], index, type)){
678
                        av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding block\n");
679
                        return -1;
680
                    }
681
                }
682
            }
683
        }
684 8b82a956 Michael Niedermayer
685 76de302d Diego Biurrun
        if ((cbp & 0x30)) {
686
            for (i = 0; i < 2; ++i) {
687 772225c0 Ronald S. Bultje
              if (svq3_decode_block(&s->gb, &h->mb[16*(16 + 4*i)], 0, 3)){
688
                av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma dc block\n");
689
                return -1;
690
              }
691 76de302d Diego Biurrun
            }
692
693
            if ((cbp & 0x20)) {
694
                for (i = 0; i < 8; i++) {
695
                    h->non_zero_count_cache[ scan8[16+i] ] = 1;
696
697
                    if (svq3_decode_block(&s->gb, &h->mb[16*(16 + i)], 1, 1)){
698
                        av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma ac block\n");
699
                        return -1;
700
                    }
701
                }
702
            }
703 bb270c08 Diego Biurrun
        }
704 8b82a956 Michael Niedermayer
    }
705
706 2a5a9c28 Michael Niedermayer
    h->cbp= cbp;
707 76de302d Diego Biurrun
    s->current_picture.mb_type[mb_xy] = mb_type;
708 8b82a956 Michael Niedermayer
709 76de302d Diego Biurrun
    if (IS_INTRA(mb_type)) {
710 903d58f6 Michael Niedermayer
        h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8);
711 76de302d Diego Biurrun
    }
712 8b82a956 Michael Niedermayer
713 76de302d Diego Biurrun
    return 0;
714 8b82a956 Michael Niedermayer
}
715
716 8811679c Baptiste Coudurier
static int svq3_decode_slice_header(AVCodecContext *avctx)
717 7f8205da Diego Biurrun
{
718 8811679c Baptiste Coudurier
    SVQ3Context *svq3 = avctx->priv_data;
719
    H264Context *h = &svq3->h;
720
    MpegEncContext *s = &h->s;
721 76de302d Diego Biurrun
    const int mb_xy = h->mb_xy;
722
    int i, header;
723 da3b9756 Mike Melanson
724 76de302d Diego Biurrun
    header = get_bits(&s->gb, 8);
725 da3b9756 Mike Melanson
726 76de302d Diego Biurrun
    if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
727
        /* TODO: what? */
728 8811679c Baptiste Coudurier
        av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
729 76de302d Diego Biurrun
        return -1;
730
    } else {
731
        int length = (header >> 5) & 3;
732 da3b9756 Mike Melanson
733 8811679c Baptiste Coudurier
        svq3->next_slice_index = get_bits_count(&s->gb) + 8*show_bits(&s->gb, 8*length) + 8*length;
734 da3b9756 Mike Melanson
735 8811679c Baptiste Coudurier
        if (svq3->next_slice_index > s->gb.size_in_bits) {
736
            av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
737 76de302d Diego Biurrun
            return -1;
738 303e50e6 Michael Niedermayer
    }
739 da3b9756 Mike Melanson
740 8811679c Baptiste Coudurier
        s->gb.size_in_bits = svq3->next_slice_index - 8*(length - 1);
741 76de302d Diego Biurrun
        skip_bits(&s->gb, 8);
742 da3b9756 Mike Melanson
743 8811679c Baptiste Coudurier
        if (svq3->watermark_key) {
744 76de302d Diego Biurrun
            uint32_t header = AV_RL32(&s->gb.buffer[(get_bits_count(&s->gb)>>3)+1]);
745 8811679c Baptiste Coudurier
            AV_WL32(&s->gb.buffer[(get_bits_count(&s->gb)>>3)+1], header ^ svq3->watermark_key);
746 76de302d Diego Biurrun
        }
747
        if (length > 0) {
748
            memcpy((uint8_t *) &s->gb.buffer[get_bits_count(&s->gb) >> 3],
749
                   &s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1));
750
        }
751 db794291 Måns Rullgård
        skip_bits_long(&s->gb, 0);
752 da3b9756 Mike Melanson
    }
753
754 76de302d Diego Biurrun
    if ((i = svq3_get_ue_golomb(&s->gb)) == INVALID_VLC || i >= 3){
755
        av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i);
756
        return -1;
757
    }
758 da3b9756 Mike Melanson
759 76de302d Diego Biurrun
    h->slice_type = golomb_to_pict_type[i];
760 da3b9756 Mike Melanson
761 76de302d Diego Biurrun
    if ((header & 0x9F) == 2) {
762
        i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1));
763
        s->mb_skip_run = get_bits(&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width));
764
    } else {
765
        skip_bits1(&s->gb);
766
        s->mb_skip_run = 0;
767
    }
768 da3b9756 Mike Melanson
769 76de302d Diego Biurrun
    h->slice_num = get_bits(&s->gb, 8);
770
    s->qscale = get_bits(&s->gb, 5);
771
    s->adaptive_quant = get_bits1(&s->gb);
772 da3b9756 Mike Melanson
773 76de302d Diego Biurrun
    /* unknown fields */
774
    skip_bits1(&s->gb);
775 da3b9756 Mike Melanson
776 8811679c Baptiste Coudurier
    if (svq3->unknown_flag) {
777 76de302d Diego Biurrun
        skip_bits1(&s->gb);
778
    }
779 da3b9756 Mike Melanson
780 76de302d Diego Biurrun
    skip_bits1(&s->gb);
781
    skip_bits(&s->gb, 2);
782 da3b9756 Mike Melanson
783 76de302d Diego Biurrun
    while (get_bits1(&s->gb)) {
784
        skip_bits(&s->gb, 8);
785
    }
786 da3b9756 Mike Melanson
787 76de302d Diego Biurrun
    /* reset intra predictors and invalidate motion vector references */
788 da3b9756 Mike Melanson
    if (s->mb_x > 0) {
789 3b606e71 Michael Niedermayer
        memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - 1      ]+3, -1, 4*sizeof(int8_t));
790
        memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_x]  , -1, 8*sizeof(int8_t)*s->mb_x);
791 76de302d Diego Biurrun
    }
792
    if (s->mb_y > 0) {
793 3b606e71 Michael Niedermayer
        memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x));
794 76de302d Diego Biurrun
795
        if (s->mb_x > 0) {
796 3b606e71 Michael Niedermayer
            h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1]+3] = -1;
797 76de302d Diego Biurrun
        }
798 da3b9756 Mike Melanson
    }
799
800 76de302d Diego Biurrun
    return 0;
801 da3b9756 Mike Melanson
}
802
803 5ef251e5 Daniel Verkamp
static av_cold int svq3_decode_init(AVCodecContext *avctx)
804 7f8205da Diego Biurrun
{
805 8811679c Baptiste Coudurier
    SVQ3Context *svq3 = avctx->priv_data;
806
    H264Context *h = &svq3->h;
807
    MpegEncContext *s = &h->s;
808 f4cca718 Baptiste Coudurier
    int m;
809 76de302d Diego Biurrun
    unsigned char *extradata;
810
    unsigned int size;
811
812 903d58f6 Michael Niedermayer
    if (ff_h264_decode_init(avctx) < 0)
813 f4cca718 Baptiste Coudurier
        return -1;
814
815 76de302d Diego Biurrun
    s->flags  = avctx->flags;
816
    s->flags2 = avctx->flags2;
817
    s->unrestricted_mv = 1;
818 54dab661 Michael Niedermayer
    h->is_complex=1;
819 94621d32 Jai Menon
    avctx->pix_fmt = avctx->codec->pix_fmts[0];
820 76de302d Diego Biurrun
821
    if (!s->context_initialized) {
822
        s->width  = avctx->width;
823
        s->height = avctx->height;
824 8811679c Baptiste Coudurier
        h->chroma_qp[0] = h->chroma_qp[1] = 4;
825
826
        svq3->halfpel_flag = 1;
827
        svq3->thirdpel_flag = 1;
828
        svq3->unknown_flag = 0;
829 76de302d Diego Biurrun
830
        if (MPV_common_init(s) < 0)
831
            return -1;
832 ebcd2f96 Mike Melanson
833 76de302d Diego Biurrun
        h->b_stride = 4*s->mb_width;
834 da3b9756 Mike Melanson
835 903d58f6 Michael Niedermayer
        ff_h264_alloc_tables(h);
836 8b82a956 Michael Niedermayer
837 76de302d Diego Biurrun
        /* prowl for the "SEQH" marker in the extradata */
838
        extradata = (unsigned char *)avctx->extradata;
839
        for (m = 0; m < avctx->extradata_size; m++) {
840
            if (!memcmp(extradata, "SEQH", 4))
841
                break;
842
            extradata++;
843
        }
844 8b82a956 Michael Niedermayer
845 76de302d Diego Biurrun
        /* if a match was found, parse the extra data */
846
        if (extradata && !memcmp(extradata, "SEQH", 4)) {
847 8b82a956 Michael Niedermayer
848 76de302d Diego Biurrun
            GetBitContext gb;
849 faccfeec Ronald S. Bultje
            int frame_size_code;
850 8b82a956 Michael Niedermayer
851 76de302d Diego Biurrun
            size = AV_RB32(&extradata[4]);
852
            init_get_bits(&gb, extradata + 8, size*8);
853 8b82a956 Michael Niedermayer
854 76de302d Diego Biurrun
            /* 'frame size code' and optional 'width, height' */
855 faccfeec Ronald S. Bultje
            frame_size_code = get_bits(&gb, 3);
856
            switch (frame_size_code) {
857
                case 0: avctx->width = 160; avctx->height = 120; break;
858
                case 1: avctx->width = 128; avctx->height =  96; break;
859
                case 2: avctx->width = 176; avctx->height = 144; break;
860
                case 3: avctx->width = 352; avctx->height = 288; break;
861
                case 4: avctx->width = 704; avctx->height = 576; break;
862
                case 5: avctx->width = 240; avctx->height = 180; break;
863
                case 6: avctx->width = 320; avctx->height = 240; break;
864
                case 7:
865
                    avctx->width  = get_bits(&gb, 12);
866
                    avctx->height = get_bits(&gb, 12);
867
                    break;
868 76de302d Diego Biurrun
            }
869 8b82a956 Michael Niedermayer
870 8811679c Baptiste Coudurier
            svq3->halfpel_flag  = get_bits1(&gb);
871
            svq3->thirdpel_flag = get_bits1(&gb);
872 8b82a956 Michael Niedermayer
873 76de302d Diego Biurrun
            /* unknown fields */
874
            skip_bits1(&gb);
875
            skip_bits1(&gb);
876
            skip_bits1(&gb);
877
            skip_bits1(&gb);
878 8b82a956 Michael Niedermayer
879 76de302d Diego Biurrun
            s->low_delay = get_bits1(&gb);
880 1e002b60 Baptiste Coudurier
881 76de302d Diego Biurrun
            /* unknown field */
882
            skip_bits1(&gb);
883
884
            while (get_bits1(&gb)) {
885
                skip_bits(&gb, 8);
886
            }
887
888 8811679c Baptiste Coudurier
            svq3->unknown_flag = get_bits1(&gb);
889 76de302d Diego Biurrun
            avctx->has_b_frames = !s->low_delay;
890 8811679c Baptiste Coudurier
            if (svq3->unknown_flag) {
891 b250f9c6 Aurelien Jacobs
#if CONFIG_ZLIB
892 76de302d Diego Biurrun
                unsigned watermark_width  = svq3_get_ue_golomb(&gb);
893
                unsigned watermark_height = svq3_get_ue_golomb(&gb);
894
                int u1 = svq3_get_ue_golomb(&gb);
895
                int u2 = get_bits(&gb, 8);
896
                int u3 = get_bits(&gb, 2);
897
                int u4 = svq3_get_ue_golomb(&gb);
898 891263ef Baptiste Coudurier
                unsigned long buf_len = watermark_width*watermark_height*4;
899 76de302d Diego Biurrun
                int offset = (get_bits_count(&gb)+7)>>3;
900
                uint8_t *buf;
901
902
                if ((uint64_t)watermark_width*4 > UINT_MAX/watermark_height)
903
                    return -1;
904
905
                buf = av_malloc(buf_len);
906
                av_log(avctx, AV_LOG_DEBUG, "watermark size: %dx%d\n", watermark_width, watermark_height);
907
                av_log(avctx, AV_LOG_DEBUG, "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n", u1, u2, u3, u4, offset);
908 891263ef Baptiste Coudurier
                if (uncompress(buf, &buf_len, extradata + 8 + offset, size - offset) != Z_OK) {
909 76de302d Diego Biurrun
                    av_log(avctx, AV_LOG_ERROR, "could not uncompress watermark logo\n");
910
                    av_free(buf);
911
                    return -1;
912
                }
913 8811679c Baptiste Coudurier
                svq3->watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0);
914
                svq3->watermark_key = svq3->watermark_key << 16 | svq3->watermark_key;
915
                av_log(avctx, AV_LOG_DEBUG, "watermark key %#x\n", svq3->watermark_key);
916 76de302d Diego Biurrun
                av_free(buf);
917 1e002b60 Baptiste Coudurier
#else
918 76de302d Diego Biurrun
                av_log(avctx, AV_LOG_ERROR, "this svq3 file contains watermark which need zlib support compiled in\n");
919
                return -1;
920 1e002b60 Baptiste Coudurier
#endif
921 76de302d Diego Biurrun
            }
922
        }
923 da3b9756 Mike Melanson
    }
924 76de302d Diego Biurrun
925 f4cca718 Baptiste Coudurier
    return 0;
926
}
927
928
static int svq3_decode_frame(AVCodecContext *avctx,
929
                             void *data, int *data_size,
930 7a00bbad Thilo Borgmann
                             AVPacket *avpkt)
931 f4cca718 Baptiste Coudurier
{
932 8811679c Baptiste Coudurier
    SVQ3Context *svq3 = avctx->priv_data;
933
    H264Context *h = &svq3->h;
934
    MpegEncContext *s = &h->s;
935 7a00bbad Thilo Borgmann
    int buf_size = avpkt->size;
936 b0e7a932 Baptiste Coudurier
    int m, mb_type, left;
937 2264c110 Baptiste Coudurier
    uint8_t *buf;
938 f4cca718 Baptiste Coudurier
939 76de302d Diego Biurrun
    /* special case for last picture */
940
    if (buf_size == 0) {
941
        if (s->next_picture_ptr && !s->low_delay) {
942
            *(AVFrame *) data = *(AVFrame *) &s->next_picture;
943
            s->next_picture_ptr = NULL;
944
            *data_size = sizeof(AVFrame);
945
        }
946
        return 0;
947 da3b9756 Mike Melanson
    }
948 8b82a956 Michael Niedermayer
949 76de302d Diego Biurrun
    s->mb_x = s->mb_y = h->mb_xy = 0;
950 8b82a956 Michael Niedermayer
951 2264c110 Baptiste Coudurier
    if (svq3->watermark_key) {
952
        svq3->buf = av_fast_realloc(svq3->buf, &svq3->buf_size,
953
                                    buf_size+FF_INPUT_BUFFER_PADDING_SIZE);
954
        if (!svq3->buf)
955
            return AVERROR(ENOMEM);
956
        memcpy(svq3->buf, avpkt->data, buf_size);
957
        buf = svq3->buf;
958
    } else {
959
        buf = avpkt->data;
960
    }
961
962
    init_get_bits(&s->gb, buf, 8*buf_size);
963
964 8811679c Baptiste Coudurier
    if (svq3_decode_slice_header(avctx))
965 76de302d Diego Biurrun
        return -1;
966 8b82a956 Michael Niedermayer
967 76de302d Diego Biurrun
    s->pict_type = h->slice_type;
968
    s->picture_number = h->slice_num;
969 8b82a956 Michael Niedermayer
970 76de302d Diego Biurrun
    if (avctx->debug&FF_DEBUG_PICT_INFO){
971
        av_log(h->s.avctx, AV_LOG_DEBUG, "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
972 8811679c Baptiste Coudurier
               av_get_picture_type_char(s->pict_type), svq3->halfpel_flag, svq3->thirdpel_flag,
973 76de302d Diego Biurrun
               s->adaptive_quant, s->qscale, h->slice_num);
974
    }
975 8b82a956 Michael Niedermayer
976 8ed2ae09 Anton Khirnov
    /* for skipping the frame */
977 76de302d Diego Biurrun
    s->current_picture.pict_type = s->pict_type;
978 ce5e49b0 Stefano Sabatini
    s->current_picture.key_frame = (s->pict_type == AV_PICTURE_TYPE_I);
979 76de302d Diego Biurrun
980
    /* Skip B-frames if we do not have reference frames. */
981 ce5e49b0 Stefano Sabatini
    if (s->last_picture_ptr == NULL && s->pict_type == AV_PICTURE_TYPE_B)
982 76de302d Diego Biurrun
        return 0;
983 ce5e49b0 Stefano Sabatini
    if (  (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
984
        ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
985 76de302d Diego Biurrun
        || avctx->skip_frame >= AVDISCARD_ALL)
986
        return 0;
987
988
    if (s->next_p_frame_damaged) {
989 ce5e49b0 Stefano Sabatini
        if (s->pict_type == AV_PICTURE_TYPE_B)
990 76de302d Diego Biurrun
            return 0;
991
        else
992
            s->next_p_frame_damaged = 0;
993
    }
994 da3b9756 Mike Melanson
995 903d58f6 Michael Niedermayer
    if (ff_h264_frame_start(h) < 0)
996 76de302d Diego Biurrun
        return -1;
997 8b82a956 Michael Niedermayer
998 ce5e49b0 Stefano Sabatini
    if (s->pict_type == AV_PICTURE_TYPE_B) {
999 76de302d Diego Biurrun
        h->frame_num_offset = (h->slice_num - h->prev_frame_num);
1000 8b82a956 Michael Niedermayer
1001 76de302d Diego Biurrun
        if (h->frame_num_offset < 0) {
1002
            h->frame_num_offset += 256;
1003
        }
1004
        if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) {
1005
            av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
1006
            return -1;
1007
        }
1008
    } else {
1009
        h->prev_frame_num = h->frame_num;
1010
        h->frame_num = h->slice_num;
1011
        h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num);
1012 da3b9756 Mike Melanson
1013 76de302d Diego Biurrun
        if (h->prev_frame_num_offset < 0) {
1014
            h->prev_frame_num_offset += 256;
1015
        }
1016 da3b9756 Mike Melanson
    }
1017
1018 76de302d Diego Biurrun
    for (m = 0; m < 2; m++){
1019
        int i;
1020
        for (i = 0; i < 4; i++){
1021
            int j;
1022
            for (j = -1; j < 4; j++)
1023
                h->ref_cache[m][scan8[0] + 8*i + j]= 1;
1024
            if (i < 3)
1025
                h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
1026
        }
1027 da3b9756 Mike Melanson
    }
1028
1029 76de302d Diego Biurrun
    for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
1030
        for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
1031
            h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
1032 115329f1 Diego Biurrun
1033 76de302d Diego Biurrun
            if ( (get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits &&
1034
                ((get_bits_count(&s->gb) & 7) == 0 || show_bits(&s->gb, (-get_bits_count(&s->gb) & 7)) == 0)) {
1035 da3b9756 Mike Melanson
1036 8811679c Baptiste Coudurier
                skip_bits(&s->gb, svq3->next_slice_index - get_bits_count(&s->gb));
1037 76de302d Diego Biurrun
                s->gb.size_in_bits = 8*buf_size;
1038 da3b9756 Mike Melanson
1039 8811679c Baptiste Coudurier
                if (svq3_decode_slice_header(avctx))
1040 76de302d Diego Biurrun
                    return -1;
1041 da3b9756 Mike Melanson
1042 76de302d Diego Biurrun
                /* TODO: support s->mb_skip_run */
1043
            }
1044 da3b9756 Mike Melanson
1045 76de302d Diego Biurrun
            mb_type = svq3_get_ue_golomb(&s->gb);
1046 da3b9756 Mike Melanson
1047 ce5e49b0 Stefano Sabatini
            if (s->pict_type == AV_PICTURE_TYPE_I) {
1048 76de302d Diego Biurrun
                mb_type += 8;
1049 ce5e49b0 Stefano Sabatini
            } else if (s->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4) {
1050 76de302d Diego Biurrun
                mb_type += 4;
1051
            }
1052 8811679c Baptiste Coudurier
            if (mb_type > 33 || svq3_decode_mb(svq3, mb_type)) {
1053 76de302d Diego Biurrun
                av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
1054
                return -1;
1055
            }
1056 8b82a956 Michael Niedermayer
1057 76de302d Diego Biurrun
            if (mb_type != 0) {
1058 903d58f6 Michael Niedermayer
                ff_h264_hl_decode_mb (h);
1059 76de302d Diego Biurrun
            }
1060 8b82a956 Michael Niedermayer
1061 ce5e49b0 Stefano Sabatini
            if (s->pict_type != AV_PICTURE_TYPE_B && !s->low_delay) {
1062 76de302d Diego Biurrun
                s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride] =
1063 ce5e49b0 Stefano Sabatini
                    (s->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
1064 76de302d Diego Biurrun
            }
1065
        }
1066 2e26c8d2 Mike Melanson
1067 76de302d Diego Biurrun
        ff_draw_horiz_band(s, 16*s->mb_y, 16);
1068 8b82a956 Michael Niedermayer
    }
1069 4c701ac8 Michael Niedermayer
1070 b0e7a932 Baptiste Coudurier
    left = buf_size*8 - get_bits_count(&s->gb);
1071
1072
    if (s->mb_y != s->mb_height || s->mb_x != s->mb_width) {
1073
        av_log(avctx, AV_LOG_INFO, "frame num %d incomplete pic x %d y %d left %d\n", avctx->frame_number, s->mb_y, s->mb_x, left);
1074
        //av_hex_dump(stderr, buf+buf_size-8, 8);
1075
    }
1076
1077
    if (left < 0) {
1078
        av_log(avctx, AV_LOG_ERROR, "frame num %d left %d\n", avctx->frame_number, left);
1079
        return -1;
1080
    }
1081
1082 76de302d Diego Biurrun
    MPV_frame_end(s);
1083 8b82a956 Michael Niedermayer
1084 ce5e49b0 Stefano Sabatini
    if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
1085 76de302d Diego Biurrun
        *(AVFrame *) data = *(AVFrame *) &s->current_picture;
1086
    } else {
1087
        *(AVFrame *) data = *(AVFrame *) &s->last_picture;
1088
    }
1089 da3b9756 Mike Melanson
1090 76de302d Diego Biurrun
    /* Do not output the last pic after seeking. */
1091
    if (s->last_picture_ptr || s->low_delay) {
1092
        *data_size = sizeof(AVFrame);
1093
    }
1094 da3b9756 Mike Melanson
1095 76de302d Diego Biurrun
    return buf_size;
1096 8b82a956 Michael Niedermayer
}
1097
1098 8811679c Baptiste Coudurier
static int svq3_decode_end(AVCodecContext *avctx)
1099
{
1100
    SVQ3Context *svq3 = avctx->priv_data;
1101
    H264Context *h = &svq3->h;
1102
    MpegEncContext *s = &h->s;
1103
1104
    ff_h264_free_context(h);
1105
1106
    MPV_common_end(s);
1107
1108 2264c110 Baptiste Coudurier
    av_freep(&svq3->buf);
1109
    svq3->buf_size = 0;
1110
1111 8811679c Baptiste Coudurier
    return 0;
1112
}
1113 8b82a956 Michael Niedermayer
1114 e7e2df27 Diego Elio Pettenò
AVCodec ff_svq3_decoder = {
1115 8b82a956 Michael Niedermayer
    "svq3",
1116 72415b2a Stefano Sabatini
    AVMEDIA_TYPE_VIDEO,
1117 8b82a956 Michael Niedermayer
    CODEC_ID_SVQ3,
1118 8811679c Baptiste Coudurier
    sizeof(SVQ3Context),
1119 f4cca718 Baptiste Coudurier
    svq3_decode_init,
1120 8b82a956 Michael Niedermayer
    NULL,
1121 8811679c Baptiste Coudurier
    svq3_decode_end,
1122 8b82a956 Michael Niedermayer
    svq3_decode_frame,
1123 934982c4 Michael Niedermayer
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_DELAY,
1124 2917367c Stefano Sabatini
    .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1125 2ba83017 Reimar Döffinger
    .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_NONE},
1126 8b82a956 Michael Niedermayer
};