svq3.c 38.4 KB
Newer Older
M
Michael Niedermayer 已提交
1
/*
2
 * Copyright (c) 2003 The FFmpeg Project
M
Michael Niedermayer 已提交
3
 *
4 5 6
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
M
Michael Niedermayer 已提交
7 8
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
M
Michael Niedermayer 已提交
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
M
Michael Niedermayer 已提交
12 13 14 15 16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 20 21
 */

/*
M
Michael Niedermayer 已提交
22 23
 * How to use this decoder:
 * SVQ3 data is transported within Apple Quicktime files. Quicktime files
24 25 26 27 28 29
 * have stsd atoms to describe media trak properties. A stsd atom for a
 * video trak contains 1 or more ImageDescription atoms. These atoms begin
 * with the 4-byte length of the atom followed by the codec fourcc. Some
 * decoders need information in this atom to operate correctly. Such
 * is the case with SVQ3. In order to get the best use out of this decoder,
 * the calling app must make the SVQ3 ImageDescription atom available
M
Michael Niedermayer 已提交
30 31
 * via the AVCodecContext's extradata[_size] field:
 *
32
 * AVCodecContext.extradata = pointer to ImageDescription, first characters
33
 * are expected to be 'S', 'V', 'Q', and '3', NOT the 4-byte atom length
34 35
 * AVCodecContext.extradata_size = size of ImageDescription atom memory
 * buffer (which will be the same as the ImageDescription atom size field
36 37 38 39
 * from the QT file, minus 4 bytes since the length is missing)
 *
 * You will know you have these parameters passed correctly when the decoder
 * correctly decodes this file:
D
Diego Biurrun 已提交
40
 *  http://samples.mplayerhq.hu/V-codecs/SVQ3/Vertical400kbit.sorenson3.mov
M
Michael Niedermayer 已提交
41
 */
42 43 44 45 46 47 48 49
#include "internal.h"
#include "dsputil.h"
#include "avcodec.h"
#include "mpegvideo.h"
#include "h264.h"

#include "h264data.h" //FIXME FIXME FIXME

50
#include "h264_mvpred.h"
51 52 53 54
#include "golomb.h"
#include "rectangle.h"
#include "vdpau_internal.h"

55
#if CONFIG_ZLIB
56 57 58
#include <zlib.h>
#endif

59 60
#include "svq1.h"

M
Michael Niedermayer 已提交
61
/**
62
 * @file
M
Michael Niedermayer 已提交
63 64 65
 * svq3 decoder.
 */

66 67
#define FULLPEL_MODE  1
#define HALFPEL_MODE  2
M
Michael Niedermayer 已提交
68
#define THIRDPEL_MODE 3
69
#define PREDICT_MODE  4
70

M
Michael Niedermayer 已提交
71 72 73 74 75 76
/* dual scan (from some older h264 draft)
 o-->o-->o   o
         |  /|
 o   o   o / o
 | / |   |/  |
 o   o   o   o
77
   /
M
Michael Niedermayer 已提交
78 79
 o-->o-->o-->o
*/
80 81 82 83 84
static const uint8_t svq3_scan[16] = {
    0+0*4, 1+0*4, 2+0*4, 2+1*4,
    2+2*4, 3+0*4, 3+1*4, 3+2*4,
    0+1*4, 0+2*4, 1+1*4, 1+2*4,
    0+3*4, 1+3*4, 2+3*4, 3+3*4,
M
Michael Niedermayer 已提交
85 86 87
};

static const uint8_t svq3_pred_0[25][2] = {
88 89 90 91 92 93 94 95 96
    { 0, 0 },
    { 1, 0 }, { 0, 1 },
    { 0, 2 }, { 1, 1 }, { 2, 0 },
    { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
    { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
    { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
    { 2, 4 }, { 3, 3 }, { 4, 2 },
    { 4, 3 }, { 3, 4 },
    { 4, 4 }
M
Michael Niedermayer 已提交
97 98 99
};

static const int8_t svq3_pred_1[6][6][5] = {
100 101 102 103 104 105 106 107 108 109 110 111
    { { 2,-1,-1,-1,-1 }, { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 },
      { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, { 1, 2,-1,-1,-1 } },
    { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
      { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
    { { 2, 0,-1,-1,-1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
      { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
    { { 2, 0,-1,-1,-1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
      { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
    { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
      { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
    { { 0, 2,-1,-1,-1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
      { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
M
Michael Niedermayer 已提交
112 113 114
};

static const struct { uint8_t run; uint8_t level; } svq3_dct_tables[2][16] = {
115 116 117 118
    { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
      { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
    { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
      { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
M
Michael Niedermayer 已提交
119 120 121
};

static const uint32_t svq3_dequant_coeff[32] = {
122 123 124 125
     3881,  4351,  4890,  5481,  6154,  6914,  7761,  8718,
     9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
    24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
    61694, 68745, 77615, 89113,100253,109366,126635,141533
M
Michael Niedermayer 已提交
126 127
};

128
void ff_svq3_luma_dc_dequant_idct_c(DCTELEM *output, DCTELEM *input, int qp){
129
    const int qmul = svq3_dequant_coeff[qp];
M
Michael Niedermayer 已提交
130 131 132
#define stride 16
    int i;
    int temp[16];
133
    static const uint8_t x_offset[4]={0, 1*stride, 4*stride, 5*stride};
134

135 136 137 138 139
    for(i=0; i<4; i++){
        const int z0 = 13*(input[4*i+0] +    input[4*i+2]);
        const int z1 = 13*(input[4*i+0] -    input[4*i+2]);
        const int z2 =  7* input[4*i+1] - 17*input[4*i+3];
        const int z3 = 17* input[4*i+1] +  7*input[4*i+3];
140 141 142 143 144

        temp[4*i+0] = z0+z3;
        temp[4*i+1] = z1+z2;
        temp[4*i+2] = z1-z2;
        temp[4*i+3] = z0-z3;
M
Michael Niedermayer 已提交
145 146
    }

147 148 149 150 151 152 153 154 155 156 157
    for(i=0; i<4; i++){
        const int offset= x_offset[i];
        const int z0= 13*(temp[4*0+i] +    temp[4*2+i]);
        const int z1= 13*(temp[4*0+i] -    temp[4*2+i]);
        const int z2=  7* temp[4*1+i] - 17*temp[4*3+i];
        const int z3= 17* temp[4*1+i] +  7*temp[4*3+i];

        output[stride* 0+offset] = ((z0 + z3)*qmul + 0x80000) >> 20;
        output[stride* 2+offset] = ((z1 + z2)*qmul + 0x80000) >> 20;
        output[stride* 8+offset] = ((z1 - z2)*qmul + 0x80000) >> 20;
        output[stride*10+offset] = ((z0 - z3)*qmul + 0x80000) >> 20;
M
Michael Niedermayer 已提交
158 159 160 161
    }
}
#undef stride

162
void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp,
163
                            int dc)
164
{
165
    const int qmul = svq3_dequant_coeff[qp];
M
Michael Niedermayer 已提交
166
    int i;
M
Måns Rullgård 已提交
167
    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
M
Michael Niedermayer 已提交
168 169 170 171 172 173

    if (dc) {
        dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
        block[0] = 0;
    }

174 175 176 177 178
    for (i = 0; i < 4; i++) {
        const int z0 = 13*(block[0 + 4*i] +    block[2 + 4*i]);
        const int z1 = 13*(block[0 + 4*i] -    block[2 + 4*i]);
        const int z2 =  7* block[1 + 4*i] - 17*block[3 + 4*i];
        const int z3 = 17* block[1 + 4*i] +  7*block[3 + 4*i];
M
Michael Niedermayer 已提交
179

180 181 182 183
        block[0 + 4*i] = z0 + z3;
        block[1 + 4*i] = z1 + z2;
        block[2 + 4*i] = z1 - z2;
        block[3 + 4*i] = z0 - z3;
M
Michael Niedermayer 已提交
184 185
    }

186 187 188 189 190 191 192 193 194 195 196
    for (i = 0; i < 4; i++) {
        const int z0 = 13*(block[i + 4*0] +    block[i + 4*2]);
        const int z1 = 13*(block[i + 4*0] -    block[i + 4*2]);
        const int z2 =  7* block[i + 4*1] - 17*block[i + 4*3];
        const int z3 = 17* block[i + 4*1] +  7*block[i + 4*3];
        const int rr = (dc + 0x80000);

        dst[i + stride*0] = cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ];
        dst[i + stride*1] = cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ];
        dst[i + stride*2] = cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ];
        dst[i + stride*3] = cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ];
M
Michael Niedermayer 已提交
197 198 199
    }
}

200 201 202
static inline int svq3_decode_block(GetBitContext *gb, DCTELEM *block,
                                    int index, const int type)
{
203 204
    static const uint8_t *const scan_patterns[4] =
    { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan };
M
Michael Niedermayer 已提交
205

206 207 208
    int run, level, sign, vlc, limit;
    const int intra = (3 * type) >> 2;
    const uint8_t *const scan = scan_patterns[type];
M
Michael Niedermayer 已提交
209

210 211
    for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
        for (; (vlc = svq3_get_ue_golomb(gb)) != 0; index++) {
M
Michael Niedermayer 已提交
212

213 214
          if (vlc == INVALID_VLC)
              return -1;
M
Michael Niedermayer 已提交
215

216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
          sign = (vlc & 0x1) - 1;
          vlc  = (vlc + 1) >> 1;

          if (type == 3) {
              if (vlc < 3) {
                  run   = 0;
                  level = vlc;
              } else if (vlc < 4) {
                  run   = 1;
                  level = 1;
              } else {
                  run   = (vlc & 0x3);
                  level = ((vlc + 9) >> 2) - run;
              }
          } else {
              if (vlc < 16) {
                  run   = svq3_dct_tables[intra][vlc].run;
                  level = svq3_dct_tables[intra][vlc].level;
              } else if (intra) {
                  run   = (vlc & 0x7);
                  level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
              } else {
                  run   = (vlc & 0xF);
                  level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
              }
          }
M
Michael Niedermayer 已提交
242

243 244
          if ((index += run) >= limit)
              return -1;
M
Michael Niedermayer 已提交
245

246 247
          block[scan[index]] = (level ^ sign) - sign;
        }
M
Michael Niedermayer 已提交
248

249 250 251
        if (type != 2) {
            break;
        }
M
Michael Niedermayer 已提交
252 253
    }

254
    return 0;
M
Michael Niedermayer 已提交
255 256
}

257 258 259 260 261
static inline void svq3_mc_dir_part(MpegEncContext *s,
                                    int x, int y, int width, int height,
                                    int mx, int my, int dxy,
                                    int thirdpel, int dir, int avg)
{
262 263 264 265 266 267 268
    const Picture *pic = (dir == 0) ? &s->last_picture : &s->next_picture;
    uint8_t *src, *dest;
    int i, emu = 0;
    int blocksize = 2 - (width>>3); //16->0, 8->1, 4->2

    mx += x;
    my += y;
M
Michael Niedermayer 已提交
269

270 271
    if (mx < 0 || mx >= (s->h_edge_pos - width  - 1) ||
        my < 0 || my >= (s->v_edge_pos - height - 1)) {
272

273 274 275
        if ((s->flags & CODEC_FLAG_EMU_EDGE)) {
            emu = 1;
        }
M
Michael Niedermayer 已提交
276

277 278
        mx = av_clip (mx, -16, (s->h_edge_pos - width  + 15));
        my = av_clip (my, -16, (s->v_edge_pos - height + 15));
M
Michael Niedermayer 已提交
279 280
    }

281 282 283 284 285
    /* form component predictions */
    dest = s->current_picture.data[0] + x + y*s->linesize;
    src  = pic->data[0] + mx + my*s->linesize;

    if (emu) {
286
        s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, (width + 1), (height + 1),
287
                            mx, my, s->h_edge_pos, s->v_edge_pos);
M
Mike Melanson 已提交
288
        src = s->edge_emu_buffer;
M
Michael Niedermayer 已提交
289
    }
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306
    if (thirdpel)
        (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize, width, height);
    else
        (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize, height);

    if (!(s->flags & CODEC_FLAG_GRAY)) {
        mx     = (mx + (mx < (int) x)) >> 1;
        my     = (my + (my < (int) y)) >> 1;
        width  = (width  >> 1);
        height = (height >> 1);
        blocksize++;

        for (i = 1; i < 3; i++) {
            dest = s->current_picture.data[i] + (x >> 1) + (y >> 1)*s->uvlinesize;
            src  = pic->data[i] + mx + my*s->uvlinesize;

            if (emu) {
307
                s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->uvlinesize, (width + 1), (height + 1),
308 309 310 311 312 313 314 315 316
                                    mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1));
                src = s->edge_emu_buffer;
            }
            if (thirdpel)
                (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->uvlinesize, width, height);
            else
                (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height);
        }
    }
M
Michael Niedermayer 已提交
317 318
}

319 320 321
static inline int svq3_mc_dir(H264Context *h, int size, int mode, int dir,
                              int avg)
{
322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419
    int i, j, k, mx, my, dx, dy, x, y;
    MpegEncContext *const s = (MpegEncContext *) h;
    const int part_width  = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
    const int part_height = 16 >> ((unsigned) (size + 1) / 3);
    const int extra_width = (mode == PREDICT_MODE) ? -16*6 : 0;
    const int h_edge_pos  = 6*(s->h_edge_pos - part_width ) - extra_width;
    const int v_edge_pos  = 6*(s->v_edge_pos - part_height) - extra_width;

    for (i = 0; i < 16; i += part_height) {
        for (j = 0; j < 16; j += part_width) {
            const int b_xy = (4*s->mb_x + (j >> 2)) + (4*s->mb_y + (i >> 2))*h->b_stride;
            int dxy;
            x = 16*s->mb_x + j;
            y = 16*s->mb_y + i;
            k = ((j >> 2) & 1) + ((i >> 1) & 2) + ((j >> 1) & 4) + (i & 8);

            if (mode != PREDICT_MODE) {
                pred_motion(h, k, (part_width >> 2), dir, 1, &mx, &my);
            } else {
                mx = s->next_picture.motion_val[0][b_xy][0]<<1;
                my = s->next_picture.motion_val[0][b_xy][1]<<1;

                if (dir == 0) {
                    mx = ((mx * h->frame_num_offset) / h->prev_frame_num_offset + 1) >> 1;
                    my = ((my * h->frame_num_offset) / h->prev_frame_num_offset + 1) >> 1;
                } else {
                    mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1) >> 1;
                    my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1) >> 1;
                }
            }

            /* clip motion vector prediction to frame border */
            mx = av_clip(mx, extra_width - 6*x, h_edge_pos - 6*x);
            my = av_clip(my, extra_width - 6*y, v_edge_pos - 6*y);

            /* get (optional) motion vector differential */
            if (mode == PREDICT_MODE) {
                dx = dy = 0;
            } else {
                dy = svq3_get_se_golomb(&s->gb);
                dx = svq3_get_se_golomb(&s->gb);

                if (dx == INVALID_VLC || dy == INVALID_VLC) {
                    av_log(h->s.avctx, AV_LOG_ERROR, "invalid MV vlc\n");
                    return -1;
                }
            }

            /* compute motion vector */
            if (mode == THIRDPEL_MODE) {
                int fx, fy;
                mx  = ((mx + 1)>>1) + dx;
                my  = ((my + 1)>>1) + dy;
                fx  = ((unsigned)(mx + 0x3000))/3 - 0x1000;
                fy  = ((unsigned)(my + 0x3000))/3 - 0x1000;
                dxy = (mx - 3*fx) + 4*(my - 3*fy);

                svq3_mc_dir_part(s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg);
                mx += mx;
                my += my;
            } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
                mx  = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
                my  = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
                dxy = (mx&1) + 2*(my&1);

                svq3_mc_dir_part(s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg);
                mx *= 3;
                my *= 3;
            } else {
                mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
                my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;

                svq3_mc_dir_part(s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg);
                mx *= 6;
                my *= 6;
            }

            /* update mv_cache */
            if (mode != PREDICT_MODE) {
                int32_t mv = pack16to32(mx,my);

                if (part_height == 8 && i < 8) {
                    *(int32_t *) h->mv_cache[dir][scan8[k] + 1*8] = mv;

                    if (part_width == 8 && j < 8) {
                        *(int32_t *) h->mv_cache[dir][scan8[k] + 1 + 1*8] = mv;
                    }
                }
                if (part_width == 8 && j < 8) {
                    *(int32_t *) h->mv_cache[dir][scan8[k] + 1] = mv;
                }
                if (part_width == 4 || part_height == 4) {
                    *(int32_t *) h->mv_cache[dir][scan8[k]] = mv;
                }
            }

            /* write back motion vectors */
            fill_rectangle(s->current_picture.motion_val[dir][b_xy], part_width>>2, part_height>>2, h->b_stride, pack16to32(mx,my), 4);
420
        }
421 422
    }

423
    return 0;
424 425
}

426 427
static int svq3_decode_mb(H264Context *h, unsigned int mb_type)
{
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454
    int i, j, k, m, dir, mode;
    int cbp = 0;
    uint32_t vlc;
    int8_t *top, *left;
    MpegEncContext *const s = (MpegEncContext *) h;
    const int mb_xy = h->mb_xy;
    const int b_xy  = 4*s->mb_x + 4*s->mb_y*h->b_stride;

    h->top_samples_available      = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
    h->left_samples_available     = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
    h->topright_samples_available = 0xFFFF;

    if (mb_type == 0) {           /* SKIP */
        if (s->pict_type == FF_P_TYPE || s->next_picture.mb_type[mb_xy] == -1) {
            svq3_mc_dir_part(s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0);

            if (s->pict_type == FF_B_TYPE) {
                svq3_mc_dir_part(s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 1, 1);
            }

            mb_type = MB_TYPE_SKIP;
        } else {
            mb_type = FFMIN(s->next_picture.mb_type[mb_xy], 6);
            if (svq3_mc_dir(h, mb_type, PREDICT_MODE, 0, 0) < 0)
                return -1;
            if (svq3_mc_dir(h, mb_type, PREDICT_MODE, 1, 1) < 0)
                return -1;
M
Michael Niedermayer 已提交
455

456
            mb_type = MB_TYPE_16x16;
457
        }
458 459 460 461 462 463 464
    } else if (mb_type < 8) {     /* INTER */
        if (h->thirdpel_flag && h->halfpel_flag == !get_bits1 (&s->gb)) {
            mode = THIRDPEL_MODE;
        } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits1 (&s->gb)) {
            mode = HALFPEL_MODE;
        } else {
            mode = FULLPEL_MODE;
465
        }
M
Michael Niedermayer 已提交
466

467 468 469 470 471 472 473 474 475 476
        /* fill caches */
        /* note ref_cache should contain here:
            ????????
            ???11111
            N??11111
            N??11111
            N??11111
        */

        for (m = 0; m < 2; m++) {
477
            if (s->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6] != -1) {
478 479 480 481 482 483 484 485 486 487
                for (i = 0; i < 4; i++) {
                    *(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];
                }
            } else {
                for (i = 0; i < 4; i++) {
                    *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0;
                }
            }
            if (s->mb_y > 0) {
                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));
488
                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);
489 490 491 492

                if (s->mb_x < (s->mb_width - 1)) {
                    *(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];
                    h->ref_cache[m][scan8[0] + 4 - 1*8] =
493 494
                        (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride + 1]+6] == -1 ||
                         h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride    ]  ] == -1) ? PART_NOT_AVAILABLE : 1;
495 496 497 498
                }else
                    h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
                if (s->mb_x > 0) {
                    *(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];
499
                    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;
500 501 502 503 504 505 506
                }else
                    h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
            }else
                memset(&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);

            if (s->pict_type != FF_B_TYPE)
                break;
507
        }
M
Michael Niedermayer 已提交
508

509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
        /* decode motion vector(s) and form prediction(s) */
        if (s->pict_type == FF_P_TYPE) {
            if (svq3_mc_dir(h, (mb_type - 1), mode, 0, 0) < 0)
                return -1;
        } else {        /* FF_B_TYPE */
            if (mb_type != 2) {
                if (svq3_mc_dir(h, 0, mode, 0, 0) < 0)
                    return -1;
            } else {
                for (i = 0; i < 4; i++) {
                    memset(s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
                }
            }
            if (mb_type != 1) {
                if (svq3_mc_dir(h, 0, mode, 1, (mb_type == 3)) < 0)
                    return -1;
            } else {
                for (i = 0; i < 4; i++) {
                    memset(s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
                }
            }
530
        }
M
Michael Niedermayer 已提交
531

532 533 534 535 536 537 538
        mb_type = MB_TYPE_16x16;
    } else if (mb_type == 8 || mb_type == 33) {   /* INTRA4x4 */
        memset(h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t));

        if (mb_type == 8) {
            if (s->mb_x > 0) {
                for (i = 0; i < 4; i++) {
539
                    h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6-i];
540 541 542 543 544 545
                }
                if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) {
                    h->left_samples_available = 0x5F5F;
                }
            }
            if (s->mb_y > 0) {
546 547 548 549
                h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+0];
                h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+1];
                h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+2];
                h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+3];
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579

                if (h->intra4x4_pred_mode_cache[4+8*0] == -1) {
                    h->top_samples_available = 0x33FF;
                }
            }

            /* decode prediction codes for luma blocks */
            for (i = 0; i < 16; i+=2) {
                vlc = svq3_get_ue_golomb(&s->gb);

                if (vlc >= 25){
                    av_log(h->s.avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc);
                    return -1;
                }

                left    = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
                top     = &h->intra4x4_pred_mode_cache[scan8[i] - 8];

                left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
                left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];

                if (left[1] == -1 || left[2] == -1){
                    av_log(h->s.avctx, AV_LOG_ERROR, "weird prediction\n");
                    return -1;
                }
            }
        } else {    /* mb_type == 33, DC_128_PRED block type */
            for (i = 0; i < 4; i++) {
                memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4);
            }
580
        }
M
Michael Niedermayer 已提交
581

582
        ff_h264_write_back_intra_pred_mode(h);
M
Michael Niedermayer 已提交
583

584
        if (mb_type == 8) {
585
            ff_h264_check_intra4x4_pred_mode(h);
586

587 588 589 590 591 592
            h->top_samples_available  = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
            h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
        } else {
            for (i = 0; i < 4; i++) {
                memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_128_PRED, 4);
            }
593

594 595 596
            h->top_samples_available  = 0x33FF;
            h->left_samples_available = 0x5F5F;
        }
597

598 599 600 601
        mb_type = MB_TYPE_INTRA4x4;
    } else {                      /* INTRA16x16 */
        dir = i_mb_type_info[mb_type - 8].pred_mode;
        dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
M
Michael Niedermayer 已提交
602

603
        if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir)) == -1){
604 605 606
            av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
            return -1;
        }
M
Michael Niedermayer 已提交
607

608 609
        cbp = i_mb_type_info[mb_type - 8].cbp;
        mb_type = MB_TYPE_INTRA16x16;
610
    }
M
Michael Niedermayer 已提交
611

612 613 614 615 616 617 618 619 620
    if (!IS_INTER(mb_type) && s->pict_type != FF_I_TYPE) {
        for (i = 0; i < 4; i++) {
            memset(s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
        }
        if (s->pict_type == FF_B_TYPE) {
            for (i = 0; i < 4; i++) {
                memset(s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
            }
        }
M
Michael Niedermayer 已提交
621
    }
622
    if (!IS_INTRA4x4(mb_type)) {
623
        memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy], DC_PRED, 8);
624
    }
625 626 627
    if (!IS_SKIP(mb_type) || s->pict_type == FF_B_TYPE) {
        memset(h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t));
        s->dsp.clear_blocks(h->mb);
628
    }
629

630 631 632 633 634
    if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == FF_B_TYPE)) {
        if ((vlc = svq3_get_ue_golomb(&s->gb)) >= 48){
            av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc);
            return -1;
        }
M
Michael Niedermayer 已提交
635

636
        cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc];
637
    }
638 639
    if (IS_INTRA16x16(mb_type) || (s->pict_type != FF_I_TYPE && s->adaptive_quant && cbp)) {
        s->qscale += svq3_get_se_golomb(&s->gb);
M
Michael Niedermayer 已提交
640

641 642
        if (s->qscale > 31){
            av_log(h->s.avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
643 644
            return -1;
        }
M
Michael Niedermayer 已提交
645
    }
646
    if (IS_INTRA16x16(mb_type)) {
647 648 649
        AV_ZERO128(h->mb_luma_dc+0);
        AV_ZERO128(h->mb_luma_dc+8);
        if (svq3_decode_block(&s->gb, h->mb_luma_dc, 0, 1)){
650 651
            av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding intra luma dc\n");
            return -1;
652
        }
653
    }
M
Michael Niedermayer 已提交
654

655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671
    if (cbp) {
        const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
        const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);

        for (i = 0; i < 4; i++) {
            if ((cbp & (1 << i))) {
                for (j = 0; j < 4; j++) {
                    k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j);
                    h->non_zero_count_cache[ scan8[k] ] = 1;

                    if (svq3_decode_block(&s->gb, &h->mb[16*k], index, type)){
                        av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding block\n");
                        return -1;
                    }
                }
            }
        }
M
Michael Niedermayer 已提交
672

673 674
        if ((cbp & 0x30)) {
            for (i = 0; i < 2; ++i) {
675 676 677 678
              if (svq3_decode_block(&s->gb, &h->mb[16*(16 + 4*i)], 0, 3)){
                av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma dc block\n");
                return -1;
              }
679 680 681 682 683 684 685 686 687 688 689 690
            }

            if ((cbp & 0x20)) {
                for (i = 0; i < 8; i++) {
                    h->non_zero_count_cache[ scan8[16+i] ] = 1;

                    if (svq3_decode_block(&s->gb, &h->mb[16*(16 + i)], 1, 1)){
                        av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma ac block\n");
                        return -1;
                    }
                }
            }
691
        }
M
Michael Niedermayer 已提交
692 693
    }

694
    h->cbp= cbp;
695
    s->current_picture.mb_type[mb_xy] = mb_type;
M
Michael Niedermayer 已提交
696

697
    if (IS_INTRA(mb_type)) {
698
        h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8);
699
    }
M
Michael Niedermayer 已提交
700

701
    return 0;
M
Michael Niedermayer 已提交
702 703
}

704 705
static int svq3_decode_slice_header(H264Context *h)
{
706 707 708
    MpegEncContext *const s = (MpegEncContext *) h;
    const int mb_xy = h->mb_xy;
    int i, header;
709

710
    header = get_bits(&s->gb, 8);
711

712 713 714 715 716 717
    if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
        /* TODO: what? */
        av_log(h->s.avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
        return -1;
    } else {
        int length = (header >> 5) & 3;
718

719
        h->next_slice_index = get_bits_count(&s->gb) + 8*show_bits(&s->gb, 8*length) + 8*length;
720

721 722 723
        if (h->next_slice_index > s->gb.size_in_bits) {
            av_log(h->s.avctx, AV_LOG_ERROR, "slice after bitstream end\n");
            return -1;
724
    }
725

726 727
        s->gb.size_in_bits = h->next_slice_index - 8*(length - 1);
        skip_bits(&s->gb, 8);
728

729 730 731 732 733 734 735 736
        if (h->svq3_watermark_key) {
            uint32_t header = AV_RL32(&s->gb.buffer[(get_bits_count(&s->gb)>>3)+1]);
            AV_WL32(&s->gb.buffer[(get_bits_count(&s->gb)>>3)+1], header ^ h->svq3_watermark_key);
        }
        if (length > 0) {
            memcpy((uint8_t *) &s->gb.buffer[get_bits_count(&s->gb) >> 3],
                   &s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1));
        }
737
        skip_bits_long(&s->gb, 0);
738 739
    }

740 741 742 743
    if ((i = svq3_get_ue_golomb(&s->gb)) == INVALID_VLC || i >= 3){
        av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i);
        return -1;
    }
744

745
    h->slice_type = golomb_to_pict_type[i];
746

747 748 749 750 751 752 753
    if ((header & 0x9F) == 2) {
        i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1));
        s->mb_skip_run = get_bits(&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width));
    } else {
        skip_bits1(&s->gb);
        s->mb_skip_run = 0;
    }
754

755 756 757
    h->slice_num = get_bits(&s->gb, 8);
    s->qscale = get_bits(&s->gb, 5);
    s->adaptive_quant = get_bits1(&s->gb);
758

759 760
    /* unknown fields */
    skip_bits1(&s->gb);
761

762 763 764
    if (h->unknown_svq3_flag) {
        skip_bits1(&s->gb);
    }
765

766 767
    skip_bits1(&s->gb);
    skip_bits(&s->gb, 2);
768

769 770 771
    while (get_bits1(&s->gb)) {
        skip_bits(&s->gb, 8);
    }
772

773
    /* reset intra predictors and invalidate motion vector references */
774
    if (s->mb_x > 0) {
775 776
        memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - 1      ]+3, -1, 4*sizeof(int8_t));
        memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_x]  , -1, 8*sizeof(int8_t)*s->mb_x);
777 778
    }
    if (s->mb_y > 0) {
779
        memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x));
780 781

        if (s->mb_x > 0) {
782
            h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1]+3] = -1;
783
        }
784 785
    }

786
    return 0;
787 788
}

789
static av_cold int svq3_decode_init(AVCodecContext *avctx)
790
{
791 792
    MpegEncContext *const s = avctx->priv_data;
    H264Context *const h = avctx->priv_data;
793
    int m;
794 795 796
    unsigned char *extradata;
    unsigned int size;

797
    if (ff_h264_decode_init(avctx) < 0)
798 799
        return -1;

800 801 802
    s->flags  = avctx->flags;
    s->flags2 = avctx->flags2;
    s->unrestricted_mv = 1;
803
    h->is_complex=1;
804
    avctx->pix_fmt = avctx->codec->pix_fmts[0];
805 806 807 808 809 810 811 812 813 814 815

    if (!s->context_initialized) {
        s->width  = avctx->width;
        s->height = avctx->height;
        h->halfpel_flag      = 1;
        h->thirdpel_flag     = 1;
        h->unknown_svq3_flag = 0;
        h->chroma_qp[0]      = h->chroma_qp[1] = 4;

        if (MPV_common_init(s) < 0)
            return -1;
816

817
        h->b_stride = 4*s->mb_width;
818

819
        ff_h264_alloc_tables(h);
M
Michael Niedermayer 已提交
820

821 822 823 824 825 826 827
        /* prowl for the "SEQH" marker in the extradata */
        extradata = (unsigned char *)avctx->extradata;
        for (m = 0; m < avctx->extradata_size; m++) {
            if (!memcmp(extradata, "SEQH", 4))
                break;
            extradata++;
        }
M
Michael Niedermayer 已提交
828

829 830
        /* if a match was found, parse the extra data */
        if (extradata && !memcmp(extradata, "SEQH", 4)) {
M
Michael Niedermayer 已提交
831

832
            GetBitContext gb;
833
            int frame_size_code;
M
Michael Niedermayer 已提交
834

835 836
            size = AV_RB32(&extradata[4]);
            init_get_bits(&gb, extradata + 8, size*8);
M
Michael Niedermayer 已提交
837

838
            /* 'frame size code' and optional 'width, height' */
839 840 841 842 843 844 845 846 847 848 849 850 851
            frame_size_code = get_bits(&gb, 3);
            switch (frame_size_code) {
                case 0: avctx->width = 160; avctx->height = 120; break;
                case 1: avctx->width = 128; avctx->height =  96; break;
                case 2: avctx->width = 176; avctx->height = 144; break;
                case 3: avctx->width = 352; avctx->height = 288; break;
                case 4: avctx->width = 704; avctx->height = 576; break;
                case 5: avctx->width = 240; avctx->height = 180; break;
                case 6: avctx->width = 320; avctx->height = 240; break;
                case 7:
                    avctx->width  = get_bits(&gb, 12);
                    avctx->height = get_bits(&gb, 12);
                    break;
852
            }
M
Michael Niedermayer 已提交
853

854 855
            h->halfpel_flag  = get_bits1(&gb);
            h->thirdpel_flag = get_bits1(&gb);
M
Michael Niedermayer 已提交
856

857 858 859 860 861
            /* unknown fields */
            skip_bits1(&gb);
            skip_bits1(&gb);
            skip_bits1(&gb);
            skip_bits1(&gb);
M
Michael Niedermayer 已提交
862

863
            s->low_delay = get_bits1(&gb);
864

865 866 867 868 869 870 871 872 873 874
            /* unknown field */
            skip_bits1(&gb);

            while (get_bits1(&gb)) {
                skip_bits(&gb, 8);
            }

            h->unknown_svq3_flag = get_bits1(&gb);
            avctx->has_b_frames = !s->low_delay;
            if (h->unknown_svq3_flag) {
875
#if CONFIG_ZLIB
876 877 878 879 880 881
                unsigned watermark_width  = svq3_get_ue_golomb(&gb);
                unsigned watermark_height = svq3_get_ue_golomb(&gb);
                int u1 = svq3_get_ue_golomb(&gb);
                int u2 = get_bits(&gb, 8);
                int u3 = get_bits(&gb, 2);
                int u4 = svq3_get_ue_golomb(&gb);
882
                unsigned long buf_len = watermark_width*watermark_height*4;
883 884 885 886 887 888 889 890 891
                int offset = (get_bits_count(&gb)+7)>>3;
                uint8_t *buf;

                if ((uint64_t)watermark_width*4 > UINT_MAX/watermark_height)
                    return -1;

                buf = av_malloc(buf_len);
                av_log(avctx, AV_LOG_DEBUG, "watermark size: %dx%d\n", watermark_width, watermark_height);
                av_log(avctx, AV_LOG_DEBUG, "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n", u1, u2, u3, u4, offset);
892
                if (uncompress(buf, &buf_len, extradata + 8 + offset, size - offset) != Z_OK) {
893 894 895 896 897 898 899 900
                    av_log(avctx, AV_LOG_ERROR, "could not uncompress watermark logo\n");
                    av_free(buf);
                    return -1;
                }
                h->svq3_watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0);
                h->svq3_watermark_key = h->svq3_watermark_key << 16 | h->svq3_watermark_key;
                av_log(avctx, AV_LOG_DEBUG, "watermark key %#x\n", h->svq3_watermark_key);
                av_free(buf);
901
#else
902 903
                av_log(avctx, AV_LOG_ERROR, "this svq3 file contains watermark which need zlib support compiled in\n");
                return -1;
904
#endif
905 906
            }
        }
907
    }
908

909 910 911 912 913
    return 0;
}

static int svq3_decode_frame(AVCodecContext *avctx,
                             void *data, int *data_size,
914
                             AVPacket *avpkt)
915
{
916 917
    const uint8_t *buf = avpkt->data;
    int buf_size = avpkt->size;
918 919 920 921
    MpegEncContext *const s = avctx->priv_data;
    H264Context *const h = avctx->priv_data;
    int m, mb_type;

922 923 924 925 926 927 928 929
    /* special case for last picture */
    if (buf_size == 0) {
        if (s->next_picture_ptr && !s->low_delay) {
            *(AVFrame *) data = *(AVFrame *) &s->next_picture;
            s->next_picture_ptr = NULL;
            *data_size = sizeof(AVFrame);
        }
        return 0;
930
    }
M
Michael Niedermayer 已提交
931

932
    init_get_bits (&s->gb, buf, 8*buf_size);
M
Michael Niedermayer 已提交
933

934
    s->mb_x = s->mb_y = h->mb_xy = 0;
M
Michael Niedermayer 已提交
935

936 937
    if (svq3_decode_slice_header(h))
        return -1;
M
Michael Niedermayer 已提交
938

939 940
    s->pict_type = h->slice_type;
    s->picture_number = h->slice_num;
M
Michael Niedermayer 已提交
941

942 943 944 945 946
    if (avctx->debug&FF_DEBUG_PICT_INFO){
        av_log(h->s.avctx, AV_LOG_DEBUG, "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
               av_get_pict_type_char(s->pict_type), h->halfpel_flag, h->thirdpel_flag,
               s->adaptive_quant, s->qscale, h->slice_num);
    }
M
Michael Niedermayer 已提交
947

948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971
    /* for hurry_up == 5 */
    s->current_picture.pict_type = s->pict_type;
    s->current_picture.key_frame = (s->pict_type == FF_I_TYPE);

    /* Skip B-frames if we do not have reference frames. */
    if (s->last_picture_ptr == NULL && s->pict_type == FF_B_TYPE)
        return 0;
    /* Skip B-frames if we are in a hurry. */
    if (avctx->hurry_up && s->pict_type == FF_B_TYPE)
        return 0;
    /* Skip everything if we are in a hurry >= 5. */
    if (avctx->hurry_up >= 5)
        return 0;
    if (  (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == FF_B_TYPE)
        ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != FF_I_TYPE)
        || avctx->skip_frame >= AVDISCARD_ALL)
        return 0;

    if (s->next_p_frame_damaged) {
        if (s->pict_type == FF_B_TYPE)
            return 0;
        else
            s->next_p_frame_damaged = 0;
    }
972

973
    if (ff_h264_frame_start(h) < 0)
974
        return -1;
M
Michael Niedermayer 已提交
975

976 977
    if (s->pict_type == FF_B_TYPE) {
        h->frame_num_offset = (h->slice_num - h->prev_frame_num);
M
Michael Niedermayer 已提交
978

979 980 981 982 983 984 985 986 987 988 989
        if (h->frame_num_offset < 0) {
            h->frame_num_offset += 256;
        }
        if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) {
            av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
            return -1;
        }
    } else {
        h->prev_frame_num = h->frame_num;
        h->frame_num = h->slice_num;
        h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num);
990

991 992 993
        if (h->prev_frame_num_offset < 0) {
            h->prev_frame_num_offset += 256;
        }
994 995
    }

996 997 998 999 1000 1001 1002 1003 1004
    for (m = 0; m < 2; m++){
        int i;
        for (i = 0; i < 4; i++){
            int j;
            for (j = -1; j < 4; j++)
                h->ref_cache[m][scan8[0] + 8*i + j]= 1;
            if (i < 3)
                h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
        }
1005 1006
    }

1007 1008 1009
    for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
        for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
            h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
1010

1011 1012
            if ( (get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits &&
                ((get_bits_count(&s->gb) & 7) == 0 || show_bits(&s->gb, (-get_bits_count(&s->gb) & 7)) == 0)) {
1013

1014 1015
                skip_bits(&s->gb, h->next_slice_index - get_bits_count(&s->gb));
                s->gb.size_in_bits = 8*buf_size;
1016

1017 1018
                if (svq3_decode_slice_header(h))
                    return -1;
1019

1020 1021
                /* TODO: support s->mb_skip_run */
            }
1022

1023
            mb_type = svq3_get_ue_golomb(&s->gb);
1024

1025 1026 1027 1028 1029 1030 1031 1032 1033
            if (s->pict_type == FF_I_TYPE) {
                mb_type += 8;
            } else if (s->pict_type == FF_B_TYPE && mb_type >= 4) {
                mb_type += 4;
            }
            if (mb_type > 33 || svq3_decode_mb(h, mb_type)) {
                av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
                return -1;
            }
M
Michael Niedermayer 已提交
1034

1035
            if (mb_type != 0) {
1036
                ff_h264_hl_decode_mb (h);
1037
            }
M
Michael Niedermayer 已提交
1038

1039 1040 1041 1042 1043
            if (s->pict_type != FF_B_TYPE && !s->low_delay) {
                s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride] =
                    (s->pict_type == FF_P_TYPE && mb_type < 8) ? (mb_type - 1) : -1;
            }
        }
1044

1045
        ff_draw_horiz_band(s, 16*s->mb_y, 16);
M
Michael Niedermayer 已提交
1046
    }
M
Michael Niedermayer 已提交
1047

1048
    MPV_frame_end(s);
M
Michael Niedermayer 已提交
1049

1050 1051 1052 1053 1054
    if (s->pict_type == FF_B_TYPE || s->low_delay) {
        *(AVFrame *) data = *(AVFrame *) &s->current_picture;
    } else {
        *(AVFrame *) data = *(AVFrame *) &s->last_picture;
    }
1055

1056 1057 1058 1059
    /* Do not output the last pic after seeking. */
    if (s->last_picture_ptr || s->low_delay) {
        *data_size = sizeof(AVFrame);
    }
1060

1061
    return buf_size;
M
Michael Niedermayer 已提交
1062 1063 1064
}


1065
AVCodec ff_svq3_decoder = {
M
Michael Niedermayer 已提交
1066
    "svq3",
1067
    AVMEDIA_TYPE_VIDEO,
M
Michael Niedermayer 已提交
1068 1069
    CODEC_ID_SVQ3,
    sizeof(H264Context),
1070
    svq3_decode_init,
M
Michael Niedermayer 已提交
1071
    NULL,
1072
    ff_h264_decode_end,
M
Michael Niedermayer 已提交
1073
    svq3_decode_frame,
1074
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_DELAY,
1075
    .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1076
    .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_NONE},
M
Michael Niedermayer 已提交
1077
};