Statistics
| Branch: | Revision:

ffmpeg / libavcodec / svq3.c @ ad1ea1f1

History | View | Annotate | Download (32.1 KB)

1 8b82a956 Michael Niedermayer
/*
2
 * Copyright (c) 2003 The FFmpeg Project.
3
 *
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 8b82a956 Michael Niedermayer
 *
20
 *
21
 * How to use this decoder:
22
 * SVQ3 data is transported within Apple Quicktime files. Quicktime files
23 89a79364 Mike Melanson
 * have stsd atoms to describe media trak properties. A stsd atom for a
24
 * video trak contains 1 or more ImageDescription atoms. These atoms begin
25
 * with the 4-byte length of the atom followed by the codec fourcc. Some
26
 * decoders need information in this atom to operate correctly. Such
27
 * is the case with SVQ3. In order to get the best use out of this decoder,
28
 * the calling app must make the SVQ3 ImageDescription atom available
29 8b82a956 Michael Niedermayer
 * via the AVCodecContext's extradata[_size] field:
30
 *
31 115329f1 Diego Biurrun
 * AVCodecContext.extradata = pointer to ImageDescription, first characters
32 89a79364 Mike Melanson
 * are expected to be 'S', 'V', 'Q', and '3', NOT the 4-byte atom length
33 115329f1 Diego Biurrun
 * AVCodecContext.extradata_size = size of ImageDescription atom memory
34
 * buffer (which will be the same as the ImageDescription atom size field
35 89a79364 Mike Melanson
 * from the QT file, minus 4 bytes since the length is missing)
36
 *
37
 * You will know you have these parameters passed correctly when the decoder
38
 * correctly decodes this file:
39
 *  ftp://ftp.mplayerhq.hu/MPlayer/samples/V-codecs/SVQ3/Vertical400kbit.sorenson3.mov
40 8b82a956 Michael Niedermayer
 *
41
 */
42 115329f1 Diego Biurrun
43 8b82a956 Michael Niedermayer
/**
44
 * @file svq3.c
45
 * svq3 decoder.
46
 */
47
48 115329f1 Diego Biurrun
#define FULLPEL_MODE  1
49
#define HALFPEL_MODE  2
50 94d44f45 Michael Niedermayer
#define THIRDPEL_MODE 3
51 2e26c8d2 Mike Melanson
#define PREDICT_MODE  4
52 115329f1 Diego Biurrun
53 f7a8c179 Michael Niedermayer
/* dual scan (from some older h264 draft)
54
 o-->o-->o   o
55
         |  /|
56
 o   o   o / o
57
 | / |   |/  |
58
 o   o   o   o
59 115329f1 Diego Biurrun
   /
60 f7a8c179 Michael Niedermayer
 o-->o-->o-->o
61
*/
62 8b82a956 Michael Niedermayer
static const uint8_t svq3_scan[16]={
63
 0+0*4, 1+0*4, 2+0*4, 2+1*4,
64
 2+2*4, 3+0*4, 3+1*4, 3+2*4,
65
 0+1*4, 0+2*4, 1+1*4, 1+2*4,
66
 0+3*4, 1+3*4, 2+3*4, 3+3*4,
67
};
68
69
static const uint8_t svq3_pred_0[25][2] = {
70
  { 0, 0 },
71
  { 1, 0 }, { 0, 1 },
72
  { 0, 2 }, { 1, 1 }, { 2, 0 },
73
  { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
74
  { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
75
  { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
76
  { 2, 4 }, { 3, 3 }, { 4, 2 },
77
  { 4, 3 }, { 3, 4 },
78
  { 4, 4 }
79
};
80
81
static const int8_t svq3_pred_1[6][6][5] = {
82
  { { 2,-1,-1,-1,-1 }, { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 },
83
    { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, { 1, 2,-1,-1,-1 } },
84
  { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
85
    { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
86
  { { 2, 0,-1,-1,-1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
87
    { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
88
  { { 2, 0,-1,-1,-1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
89
    { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
90
  { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
91
    { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
92
  { { 0, 2,-1,-1,-1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
93
    { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
94
};
95
96
static const struct { uint8_t run; uint8_t level; } svq3_dct_tables[2][16] = {
97
  { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
98
    { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
99
  { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
100
    { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
101
};
102
103
static const uint32_t svq3_dequant_coeff[32] = {
104
   3881,  4351,  4890,  5481,  6154,  6914,  7761,  8718,
105
   9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
106
  24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
107
  61694, 68745, 77615, 89113,100253,109366,126635,141533
108
};
109
110
111
static void svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp){
112
    const int qmul= svq3_dequant_coeff[qp];
113
#define stride 16
114
    int i;
115
    int temp[16];
116
    static const int x_offset[4]={0, 1*stride, 4* stride,  5*stride};
117
    static const int y_offset[4]={0, 2*stride, 8* stride, 10*stride};
118
119
    for(i=0; i<4; i++){
120
        const int offset= y_offset[i];
121
        const int z0= 13*(block[offset+stride*0] +    block[offset+stride*4]);
122
        const int z1= 13*(block[offset+stride*0] -    block[offset+stride*4]);
123
        const int z2=  7* block[offset+stride*1] - 17*block[offset+stride*5];
124
        const int z3= 17* block[offset+stride*1] +  7*block[offset+stride*5];
125
126
        temp[4*i+0]= z0+z3;
127
        temp[4*i+1]= z1+z2;
128
        temp[4*i+2]= z1-z2;
129
        temp[4*i+3]= z0-z3;
130
    }
131
132
    for(i=0; i<4; i++){
133
        const int offset= x_offset[i];
134
        const int z0= 13*(temp[4*0+i] +    temp[4*2+i]);
135
        const int z1= 13*(temp[4*0+i] -    temp[4*2+i]);
136
        const int z2=  7* temp[4*1+i] - 17*temp[4*3+i];
137
        const int z3= 17* temp[4*1+i] +  7*temp[4*3+i];
138
139
        block[stride*0 +offset]= ((z0 + z3)*qmul + 0x80000)>>20;
140
        block[stride*2 +offset]= ((z1 + z2)*qmul + 0x80000)>>20;
141
        block[stride*8 +offset]= ((z1 - z2)*qmul + 0x80000)>>20;
142
        block[stride*10+offset]= ((z0 - z3)*qmul + 0x80000)>>20;
143
    }
144
}
145
#undef stride
146
147
static void svq3_add_idct_c (uint8_t *dst, DCTELEM *block, int stride, int qp, int dc){
148
    const int qmul= svq3_dequant_coeff[qp];
149
    int i;
150 55fde95e Måns Rullgård
    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
151 8b82a956 Michael Niedermayer
152
    if (dc) {
153
        dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
154
        block[0] = 0;
155
    }
156
157
    for (i=0; i < 4; i++) {
158
        const int z0= 13*(block[0 + 4*i] +    block[2 + 4*i]);
159
        const int z1= 13*(block[0 + 4*i] -    block[2 + 4*i]);
160
        const int z2=  7* block[1 + 4*i] - 17*block[3 + 4*i];
161
        const int z3= 17* block[1 + 4*i] +  7*block[3 + 4*i];
162
163
        block[0 + 4*i]= z0 + z3;
164
        block[1 + 4*i]= z1 + z2;
165
        block[2 + 4*i]= z1 - z2;
166
        block[3 + 4*i]= z0 - z3;
167
    }
168
169
    for (i=0; i < 4; i++) {
170
        const int z0= 13*(block[i + 4*0] +    block[i + 4*2]);
171
        const int z1= 13*(block[i + 4*0] -    block[i + 4*2]);
172
        const int z2=  7* block[i + 4*1] - 17*block[i + 4*3];
173
        const int z3= 17* block[i + 4*1] +  7*block[i + 4*3];
174
        const int rr= (dc + 0x80000);
175
176
        dst[i + stride*0]= cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ];
177
        dst[i + stride*1]= cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ];
178
        dst[i + stride*2]= cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ];
179
        dst[i + stride*3]= cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ];
180
    }
181
}
182
183
static void pred4x4_down_left_svq3_c(uint8_t *src, uint8_t *topright, int stride){
184 115329f1 Diego Biurrun
    LOAD_TOP_EDGE
185
    LOAD_LEFT_EDGE
186 8b82a956 Michael Niedermayer
    const __attribute__((unused)) int unu0= t0;
187
    const __attribute__((unused)) int unu1= l0;
188
189
    src[0+0*stride]=(l1 + t1)>>1;
190
    src[1+0*stride]=
191
    src[0+1*stride]=(l2 + t2)>>1;
192
    src[2+0*stride]=
193
    src[1+1*stride]=
194
    src[0+2*stride]=
195
    src[3+0*stride]=
196
    src[2+1*stride]=
197
    src[1+2*stride]=
198
    src[0+3*stride]=
199
    src[3+1*stride]=
200
    src[2+2*stride]=
201
    src[1+3*stride]=
202
    src[3+2*stride]=
203
    src[2+3*stride]=
204
    src[3+3*stride]=(l3 + t3)>>1;
205 4cfbf61b Falk Hüffner
}
206 8b82a956 Michael Niedermayer
207
static void pred16x16_plane_svq3_c(uint8_t *src, int stride){
208
    pred16x16_plane_compat_c(src, stride, 1);
209
}
210
211
static inline int svq3_decode_block (GetBitContext *gb, DCTELEM *block,
212 bb270c08 Diego Biurrun
                                     int index, const int type) {
213 8b82a956 Michael Niedermayer
214
  static const uint8_t *const scan_patterns[4] =
215
  { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan };
216
217
  int run, level, sign, vlc, limit;
218
  const int intra = (3 * type) >> 2;
219
  const uint8_t *const scan = scan_patterns[type];
220
221
  for (limit=(16 >> intra); index < 16; index=limit, limit+=8) {
222
    for (; (vlc = svq3_get_ue_golomb (gb)) != 0; index++) {
223
224
      if (vlc == INVALID_VLC)
225 bb270c08 Diego Biurrun
        return -1;
226 8b82a956 Michael Niedermayer
227
      sign = (vlc & 0x1) - 1;
228
      vlc  = (vlc + 1) >> 1;
229
230
      if (type == 3) {
231 bb270c08 Diego Biurrun
        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 8b82a956 Michael Niedermayer
      } else {
242 bb270c08 Diego Biurrun
        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 8b82a956 Michael Niedermayer
      }
253
254
      if ((index += run) >= limit)
255 bb270c08 Diego Biurrun
        return -1;
256 8b82a956 Michael Niedermayer
257
      block[scan[index]] = (level ^ sign) - sign;
258
    }
259
260
    if (type != 2) {
261
      break;
262
    }
263
  }
264
265
  return 0;
266
}
267
268 da3b9756 Mike Melanson
static inline void svq3_mc_dir_part (MpegEncContext *s,
269 bb270c08 Diego Biurrun
                                     int x, int y, int width, int height,
270
                                     int mx, int my, int dxy,
271
                                     int thirdpel, int dir, int avg) {
272 da3b9756 Mike Melanson
273
  const Picture *pic = (dir == 0) ? &s->last_picture : &s->next_picture;
274 8b82a956 Michael Niedermayer
  uint8_t *src, *dest;
275
  int i, emu = 0;
276 669ac79c Michael Niedermayer
  int blocksize= 2 - (width>>3); //16->0, 8->1, 4->2
277 8b82a956 Michael Niedermayer
278 94d44f45 Michael Niedermayer
  mx += x;
279
  my += y;
280 115329f1 Diego Biurrun
281 4c701ac8 Michael Niedermayer
  if (mx < 0 || mx >= (s->h_edge_pos - width  - 1) ||
282
      my < 0 || my >= (s->v_edge_pos - height - 1)) {
283 8b82a956 Michael Niedermayer
284
    if ((s->flags & CODEC_FLAG_EMU_EDGE)) {
285
      emu = 1;
286
    }
287
288 f66e4f5f Reimar Döffinger
    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
  /* form component predictions */
293
  dest = s->current_picture.data[0] + x + y*s->linesize;
294 da3b9756 Mike Melanson
  src  = pic->data[0] + mx + my*s->linesize;
295 8b82a956 Michael Niedermayer
296
  if (emu) {
297 a7d3e772 Mike Melanson
    ff_emulated_edge_mc (s->edge_emu_buffer, src, s->linesize, (width + 1), (height + 1),
298 bb270c08 Diego Biurrun
                         mx, my, s->h_edge_pos, s->v_edge_pos);
299 8b82a956 Michael Niedermayer
    src = s->edge_emu_buffer;
300
  }
301 669ac79c Michael Niedermayer
  if(thirdpel)
302 da3b9756 Mike Melanson
    (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->linesize, width, height);
303 669ac79c Michael Niedermayer
  else
304 da3b9756 Mike Melanson
    (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->linesize, height);
305 8b82a956 Michael Niedermayer
306
  if (!(s->flags & CODEC_FLAG_GRAY)) {
307 bb270c08 Diego Biurrun
    mx     = (mx + (mx < (int) x)) >> 1;
308
    my     = (my + (my < (int) y)) >> 1;
309 8b82a956 Michael Niedermayer
    width  = (width  >> 1);
310
    height = (height >> 1);
311 669ac79c Michael Niedermayer
    blocksize++;
312 8b82a956 Michael Niedermayer
313
    for (i=1; i < 3; i++) {
314
      dest = s->current_picture.data[i] + (x >> 1) + (y >> 1)*s->uvlinesize;
315 da3b9756 Mike Melanson
      src  = pic->data[i] + mx + my*s->uvlinesize;
316 8b82a956 Michael Niedermayer
317
      if (emu) {
318 a7d3e772 Mike Melanson
        ff_emulated_edge_mc (s->edge_emu_buffer, src, s->uvlinesize, (width + 1), (height + 1),
319 bb270c08 Diego Biurrun
                             mx, my, (s->h_edge_pos >> 1), (s->v_edge_pos >> 1));
320 a7d3e772 Mike Melanson
        src = s->edge_emu_buffer;
321 8b82a956 Michael Niedermayer
      }
322 669ac79c Michael Niedermayer
      if(thirdpel)
323 da3b9756 Mike Melanson
        (avg ? s->dsp.avg_tpel_pixels_tab : s->dsp.put_tpel_pixels_tab)[dxy](dest, src, s->uvlinesize, width, height);
324 669ac79c Michael Niedermayer
      else
325 da3b9756 Mike Melanson
        (avg ? s->dsp.avg_pixels_tab : s->dsp.put_pixels_tab)[blocksize][dxy](dest, src, s->uvlinesize, height);
326 8b82a956 Michael Niedermayer
    }
327
  }
328
}
329
330 2e26c8d2 Mike Melanson
static inline int svq3_mc_dir (H264Context *h, int size, int mode, int dir, int avg) {
331
332
  int i, j, k, mx, my, dx, dy, x, y;
333
  MpegEncContext *const s = (MpegEncContext *) h;
334
  const int part_width  = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
335
  const int part_height = 16 >> ((unsigned) (size + 1) / 3);
336
  const int extra_width = (mode == PREDICT_MODE) ? -16*6 : 0;
337
  const int h_edge_pos  = 6*(s->h_edge_pos - part_width ) - extra_width;
338
  const int v_edge_pos  = 6*(s->v_edge_pos - part_height) - extra_width;
339
340
  for (i=0; i < 16; i+=part_height) {
341
    for (j=0; j < 16; j+=part_width) {
342
      const int b_xy = (4*s->mb_x+(j>>2)) + (4*s->mb_y+(i>>2))*h->b_stride;
343
      int dxy;
344
      x = 16*s->mb_x + j;
345
      y = 16*s->mb_y + i;
346
      k = ((j>>2)&1) + ((i>>1)&2) + ((j>>1)&4) + (i&8);
347
348
      if (mode != PREDICT_MODE) {
349 bb270c08 Diego Biurrun
        pred_motion (h, k, (part_width >> 2), dir, 1, &mx, &my);
350 2e26c8d2 Mike Melanson
      } else {
351 bb270c08 Diego Biurrun
        mx = s->next_picture.motion_val[0][b_xy][0]<<1;
352
        my = s->next_picture.motion_val[0][b_xy][1]<<1;
353
354
        if (dir == 0) {
355
          mx = ((mx * h->frame_num_offset) / h->prev_frame_num_offset + 1)>>1;
356
          my = ((my * h->frame_num_offset) / h->prev_frame_num_offset + 1)>>1;
357
        } else {
358
          mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1)>>1;
359
          my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1)>>1;
360
        }
361 2e26c8d2 Mike Melanson
      }
362
363
      /* clip motion vector prediction to frame border */
364 f66e4f5f Reimar Döffinger
      mx = av_clip (mx, extra_width - 6*x, h_edge_pos - 6*x);
365
      my = av_clip (my, extra_width - 6*y, v_edge_pos - 6*y);
366 2e26c8d2 Mike Melanson
367
      /* get (optional) motion vector differential */
368
      if (mode == PREDICT_MODE) {
369 bb270c08 Diego Biurrun
        dx = dy = 0;
370 2e26c8d2 Mike Melanson
      } else {
371 bb270c08 Diego Biurrun
        dy = svq3_get_se_golomb (&s->gb);
372
        dx = svq3_get_se_golomb (&s->gb);
373 2e26c8d2 Mike Melanson
374 bb270c08 Diego Biurrun
        if (dx == INVALID_VLC || dy == INVALID_VLC) {
375 884182b3 Michael Niedermayer
          av_log(h->s.avctx, AV_LOG_ERROR, "invalid MV vlc\n");
376 bb270c08 Diego Biurrun
          return -1;
377
        }
378 2e26c8d2 Mike Melanson
      }
379
380
      /* compute motion vector */
381
      if (mode == THIRDPEL_MODE) {
382 bb270c08 Diego Biurrun
        int fx, fy;
383
        mx = ((mx + 1)>>1) + dx;
384
        my = ((my + 1)>>1) + dy;
385
        fx= ((unsigned)(mx + 0x3000))/3 - 0x1000;
386
        fy= ((unsigned)(my + 0x3000))/3 - 0x1000;
387
        dxy= (mx - 3*fx) + 4*(my - 3*fy);
388
389
        svq3_mc_dir_part (s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg);
390
        mx += mx;
391
        my += my;
392 2e26c8d2 Mike Melanson
      } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
393 bb270c08 Diego Biurrun
        mx = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
394
        my = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
395
        dxy= (mx&1) + 2*(my&1);
396 2e26c8d2 Mike Melanson
397 bb270c08 Diego Biurrun
        svq3_mc_dir_part (s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg);
398
        mx *= 3;
399
        my *= 3;
400 2e26c8d2 Mike Melanson
      } else {
401 bb270c08 Diego Biurrun
        mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
402
        my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;
403 2e26c8d2 Mike Melanson
404 bb270c08 Diego Biurrun
        svq3_mc_dir_part (s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg);
405
        mx *= 6;
406
        my *= 6;
407 2e26c8d2 Mike Melanson
      }
408
409
      /* update mv_cache */
410
      if (mode != PREDICT_MODE) {
411 bb270c08 Diego Biurrun
        int32_t mv = pack16to32(mx,my);
412
413
        if (part_height == 8 && i < 8) {
414
          *(int32_t *) h->mv_cache[dir][scan8[k] + 1*8] = mv;
415
416
          if (part_width == 8 && j < 8) {
417
            *(int32_t *) h->mv_cache[dir][scan8[k] + 1 + 1*8] = mv;
418
          }
419
        }
420
        if (part_width == 8 && j < 8) {
421
          *(int32_t *) h->mv_cache[dir][scan8[k] + 1] = mv;
422
        }
423
        if (part_width == 4 || part_height == 4) {
424
          *(int32_t *) h->mv_cache[dir][scan8[k]] = mv;
425
        }
426 2e26c8d2 Mike Melanson
      }
427
428
      /* write back motion vectors */
429
      fill_rectangle(s->current_picture.motion_val[dir][b_xy], part_width>>2, part_height>>2, h->b_stride, pack16to32(mx,my), 4);
430
    }
431
  }
432
433
  return 0;
434
}
435
436 8b82a956 Michael Niedermayer
static int svq3_decode_mb (H264Context *h, unsigned int mb_type) {
437 2e26c8d2 Mike Melanson
  int i, j, k, m, dir, mode;
438
  int cbp = 0;
439 8b82a956 Michael Niedermayer
  uint32_t vlc;
440
  int8_t *top, *left;
441
  MpegEncContext *const s = (MpegEncContext *) h;
442
  const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
443
  const int b_xy = 4*s->mb_x + 4*s->mb_y*h->b_stride;
444
445 bb270c08 Diego Biurrun
  h->top_samples_available        = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
446
  h->left_samples_available        = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
447
  h->topright_samples_available        = 0xFFFF;
448 8b82a956 Michael Niedermayer
449 bb270c08 Diego Biurrun
  if (mb_type == 0) {           /* SKIP */
450 2e26c8d2 Mike Melanson
    if (s->pict_type == P_TYPE || s->next_picture.mb_type[mb_xy] == -1) {
451 da3b9756 Mike Melanson
      svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0);
452
453 2e26c8d2 Mike Melanson
      if (s->pict_type == B_TYPE) {
454 bb270c08 Diego Biurrun
        svq3_mc_dir_part (s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 1, 1);
455 da3b9756 Mike Melanson
      }
456 8b82a956 Michael Niedermayer
457 2e26c8d2 Mike Melanson
      mb_type = MB_TYPE_SKIP;
458
    } else {
459 cbf5374f Michael Niedermayer
      mb_type= FFMIN(s->next_picture.mb_type[mb_xy], 6);
460
      if(svq3_mc_dir (h, mb_type, PREDICT_MODE, 0, 0) < 0)
461
        return -1;
462
      if(svq3_mc_dir (h, mb_type, PREDICT_MODE, 1, 1) < 0)
463
        return -1;
464 da3b9756 Mike Melanson
465
      mb_type = MB_TYPE_16x16;
466
    }
467 bb270c08 Diego Biurrun
  } else if (mb_type < 8) {     /* INTER */
468 8b82a956 Michael Niedermayer
    if (h->thirdpel_flag && h->halfpel_flag == !get_bits (&s->gb, 1)) {
469 94d44f45 Michael Niedermayer
      mode = THIRDPEL_MODE;
470 8b82a956 Michael Niedermayer
    } else if (h->halfpel_flag && h->thirdpel_flag == !get_bits (&s->gb, 1)) {
471 94d44f45 Michael Niedermayer
      mode = HALFPEL_MODE;
472 8b82a956 Michael Niedermayer
    } else {
473 94d44f45 Michael Niedermayer
      mode = FULLPEL_MODE;
474 8b82a956 Michael Niedermayer
    }
475
476
    /* fill caches */
477 da3b9756 Mike Melanson
    /* note ref_cache should contain here:
478 f7a8c179 Michael Niedermayer
        ????????
479
        ???11111
480
        N??11111
481
        N??11111
482
        N??11111
483
        N
484
    */
485 115329f1 Diego Biurrun
486 da3b9756 Mike Melanson
    for (m=0; m < 2; m++) {
487
      if (s->mb_x > 0 && h->intra4x4_pred_mode[mb_xy - 1][0] != -1) {
488 bb270c08 Diego Biurrun
        for (i=0; i < 4; i++) {
489
          *(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];
490
        }
491 da3b9756 Mike Melanson
      } else {
492 bb270c08 Diego Biurrun
        for (i=0; i < 4; i++) {
493
          *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0;
494
        }
495 8b82a956 Michael Niedermayer
      }
496 da3b9756 Mike Melanson
      if (s->mb_y > 0) {
497 bb270c08 Diego Biurrun
        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));
498
        memset (&h->ref_cache[m][scan8[0] - 1*8], (h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1, 4);
499
500
        if (s->mb_x < (s->mb_width - 1)) {
501
          *(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];
502
          h->ref_cache[m][scan8[0] + 4 - 1*8] =
503
                  (h->intra4x4_pred_mode[mb_xy - s->mb_stride + 1][0] == -1 ||
504
                   h->intra4x4_pred_mode[mb_xy - s->mb_stride][4] == -1) ? PART_NOT_AVAILABLE : 1;
505
        }else
506
          h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
507
        if (s->mb_x > 0) {
508
          *(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];
509
          h->ref_cache[m][scan8[0] - 1 - 1*8] = (h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] == -1) ? PART_NOT_AVAILABLE : 1;
510
        }else
511
          h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
512 f7a8c179 Michael Niedermayer
      }else
513 bb270c08 Diego Biurrun
        memset (&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);
514 da3b9756 Mike Melanson
515
      if (s->pict_type != B_TYPE)
516 bb270c08 Diego Biurrun
        break;
517 da3b9756 Mike Melanson
    }
518 8b82a956 Michael Niedermayer
519
    /* decode motion vector(s) and form prediction(s) */
520 da3b9756 Mike Melanson
    if (s->pict_type == P_TYPE) {
521 cbf5374f Michael Niedermayer
      if(svq3_mc_dir (h, (mb_type - 1), mode, 0, 0) < 0)
522
        return -1;
523 bb270c08 Diego Biurrun
    } else {        /* B_TYPE */
524 2e26c8d2 Mike Melanson
      if (mb_type != 2) {
525 bb270c08 Diego Biurrun
        if(svq3_mc_dir (h, 0, mode, 0, 0) < 0)
526 cbf5374f Michael Niedermayer
          return -1;
527 2e26c8d2 Mike Melanson
      } else {
528 bb270c08 Diego Biurrun
        for (i=0; i < 4; i++) {
529
          memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
530
        }
531 da3b9756 Mike Melanson
      }
532
      if (mb_type != 1) {
533 bb270c08 Diego Biurrun
        if(svq3_mc_dir (h, 0, mode, 1, (mb_type == 3)) < 0)
534 cbf5374f Michael Niedermayer
          return -1;
535 da3b9756 Mike Melanson
      } else {
536 bb270c08 Diego Biurrun
        for (i=0; i < 4; i++) {
537
          memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
538
        }
539 da3b9756 Mike Melanson
      }
540 8b82a956 Michael Niedermayer
    }
541
542
    mb_type = MB_TYPE_16x16;
543 bb270c08 Diego Biurrun
  } else if (mb_type == 8 || mb_type == 33) {   /* INTRA4x4 */
544 8b82a956 Michael Niedermayer
    memset (h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t));
545
546 da3b9756 Mike Melanson
    if (mb_type == 8) {
547
      if (s->mb_x > 0) {
548 bb270c08 Diego Biurrun
        for (i=0; i < 4; i++) {
549
          h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[mb_xy - 1][i];
550
        }
551
        if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) {
552
          h->left_samples_available = 0x5F5F;
553
        }
554 da3b9756 Mike Melanson
      }
555
      if (s->mb_y > 0) {
556 bb270c08 Diego Biurrun
        h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][4];
557
        h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][5];
558
        h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][6];
559
        h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[mb_xy - s->mb_stride][3];
560
561
        if (h->intra4x4_pred_mode_cache[4+8*0] == -1) {
562
          h->top_samples_available = 0x33FF;
563
        }
564 8b82a956 Michael Niedermayer
      }
565
566 da3b9756 Mike Melanson
      /* decode prediction codes for luma blocks */
567
      for (i=0; i < 16; i+=2) {
568 bb270c08 Diego Biurrun
        vlc = svq3_get_ue_golomb (&s->gb);
569 8b82a956 Michael Niedermayer
570 bb270c08 Diego Biurrun
        if (vlc >= 25){
571 884182b3 Michael Niedermayer
          av_log(h->s.avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc);
572 bb270c08 Diego Biurrun
          return -1;
573 884182b3 Michael Niedermayer
        }
574 8b82a956 Michael Niedermayer
575 bb270c08 Diego Biurrun
        left    = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
576
        top     = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
577 8b82a956 Michael Niedermayer
578 bb270c08 Diego Biurrun
        left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
579
        left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
580 8b82a956 Michael Niedermayer
581 bb270c08 Diego Biurrun
        if (left[1] == -1 || left[2] == -1){
582 884182b3 Michael Niedermayer
          av_log(h->s.avctx, AV_LOG_ERROR, "weird prediction\n");
583 bb270c08 Diego Biurrun
          return -1;
584 884182b3 Michael Niedermayer
        }
585 da3b9756 Mike Melanson
      }
586 bb270c08 Diego Biurrun
    } else {    /* mb_type == 33, DC_128_PRED block type */
587 da3b9756 Mike Melanson
      for (i=0; i < 4; i++) {
588 bb270c08 Diego Biurrun
        memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4);
589 da3b9756 Mike Melanson
      }
590 8b82a956 Michael Niedermayer
    }
591
592
    write_back_intra_pred_mode (h);
593 da3b9756 Mike Melanson
594
    if (mb_type == 8) {
595
      check_intra4x4_pred_mode (h);
596
597
      h->top_samples_available  = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
598
      h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
599
    } else {
600
      for (i=0; i < 4; i++) {
601
        memset (&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_128_PRED, 4);
602
      }
603
604
      h->top_samples_available  = 0x33FF;
605
      h->left_samples_available = 0x5F5F;
606
    }
607 8b82a956 Michael Niedermayer
608
    mb_type = MB_TYPE_INTRA4x4;
609 bb270c08 Diego Biurrun
  } else {                      /* INTRA16x16 */
610 8b82a956 Michael Niedermayer
    dir = i_mb_type_info[mb_type - 8].pred_mode;
611
    dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
612
613 884182b3 Michael Niedermayer
    if ((h->intra16x16_pred_mode = check_intra_pred_mode (h, dir)) == -1){
614
      av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
615 8b82a956 Michael Niedermayer
      return -1;
616 884182b3 Michael Niedermayer
    }
617 8b82a956 Michael Niedermayer
618
    cbp = i_mb_type_info[mb_type - 8].cbp;
619
    mb_type = MB_TYPE_INTRA16x16;
620
  }
621
622
  if (!IS_INTER(mb_type) && s->pict_type != I_TYPE) {
623
    for (i=0; i < 4; i++) {
624
      memset (s->current_picture.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
625
    }
626 da3b9756 Mike Melanson
    if (s->pict_type == B_TYPE) {
627
      for (i=0; i < 4; i++) {
628 bb270c08 Diego Biurrun
        memset (s->current_picture.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
629 da3b9756 Mike Melanson
      }
630
    }
631 8b82a956 Michael Niedermayer
  }
632
  if (!IS_INTRA4x4(mb_type)) {
633
    memset (h->intra4x4_pred_mode[mb_xy], DC_PRED, 8);
634
  }
635 2e26c8d2 Mike Melanson
  if (!IS_SKIP(mb_type) || s->pict_type == B_TYPE) {
636 f7a8c179 Michael Niedermayer
    memset (h->non_zero_count_cache + 8, 0, 4*9*sizeof(uint8_t));
637
    s->dsp.clear_blocks(h->mb);
638 8b82a956 Michael Niedermayer
  }
639
640 2e26c8d2 Mike Melanson
  if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == B_TYPE)) {
641 884182b3 Michael Niedermayer
    if ((vlc = svq3_get_ue_golomb (&s->gb)) >= 48){
642
      av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc);
643 2e26c8d2 Mike Melanson
      return -1;
644 884182b3 Michael Niedermayer
    }
645 2e26c8d2 Mike Melanson
646
    cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc];
647
  }
648 8b82a956 Michael Niedermayer
  if (IS_INTRA16x16(mb_type) || (s->pict_type != I_TYPE && s->adaptive_quant && cbp)) {
649
    s->qscale += svq3_get_se_golomb (&s->gb);
650
651 884182b3 Michael Niedermayer
    if (s->qscale > 31){
652
      av_log(h->s.avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
653 8b82a956 Michael Niedermayer
      return -1;
654 884182b3 Michael Niedermayer
    }
655 8b82a956 Michael Niedermayer
  }
656
  if (IS_INTRA16x16(mb_type)) {
657 884182b3 Michael Niedermayer
    if (svq3_decode_block (&s->gb, h->mb, 0, 0)){
658
      av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding intra luma dc\n");
659 8b82a956 Michael Niedermayer
      return -1;
660 884182b3 Michael Niedermayer
    }
661 8b82a956 Michael Niedermayer
  }
662
663 2e26c8d2 Mike Melanson
  if (cbp) {
664
    const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
665
    const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
666 8b82a956 Michael Niedermayer
667
    for (i=0; i < 4; i++) {
668
      if ((cbp & (1 << i))) {
669 bb270c08 Diego Biurrun
        for (j=0; j < 4; j++) {
670
          k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j);
671
          h->non_zero_count_cache[ scan8[k] ] = 1;
672 8b82a956 Michael Niedermayer
673 bb270c08 Diego Biurrun
          if (svq3_decode_block (&s->gb, &h->mb[16*k], index, type)){
674 884182b3 Michael Niedermayer
            av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding block\n");
675 bb270c08 Diego Biurrun
            return -1;
676 884182b3 Michael Niedermayer
          }
677 bb270c08 Diego Biurrun
        }
678 8b82a956 Michael Niedermayer
      }
679
    }
680
681
    if ((cbp & 0x30)) {
682
      for (i=0; i < 2; ++i) {
683 bb270c08 Diego Biurrun
        if (svq3_decode_block (&s->gb, &h->mb[16*(16 + 4*i)], 0, 3)){
684 884182b3 Michael Niedermayer
          av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma dc block\n");
685 bb270c08 Diego Biurrun
          return -1;
686 884182b3 Michael Niedermayer
        }
687 8b82a956 Michael Niedermayer
      }
688
689
      if ((cbp & 0x20)) {
690 bb270c08 Diego Biurrun
        for (i=0; i < 8; i++) {
691
          h->non_zero_count_cache[ scan8[16+i] ] = 1;
692 8b82a956 Michael Niedermayer
693 bb270c08 Diego Biurrun
          if (svq3_decode_block (&s->gb, &h->mb[16*(16 + i)], 1, 1)){
694 884182b3 Michael Niedermayer
            av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma ac block\n");
695 bb270c08 Diego Biurrun
            return -1;
696 884182b3 Michael Niedermayer
          }
697 bb270c08 Diego Biurrun
        }
698 8b82a956 Michael Niedermayer
      }
699
    }
700
  }
701
702
  s->current_picture.mb_type[mb_xy] = mb_type;
703
704
  if (IS_INTRA(mb_type)) {
705
    h->chroma_pred_mode = check_intra_pred_mode (h, DC_PRED8x8);
706
  }
707
708
  return 0;
709
}
710
711 da3b9756 Mike Melanson
static int svq3_decode_slice_header (H264Context *h) {
712
  MpegEncContext *const s = (MpegEncContext *) h;
713
  const int mb_xy = s->mb_x + s->mb_y*s->mb_stride;
714
  int i, header;
715
716
  header = get_bits (&s->gb, 8);
717
718
  if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
719
    /* TODO: what? */
720 9b879566 Michel Bardiaux
    av_log(h->s.avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
721 da3b9756 Mike Melanson
    return -1;
722
  } else {
723
    int length = (header >> 5) & 3;
724
725 5bb8a0da Michael Niedermayer
    h->next_slice_index = get_bits_count(&s->gb) + 8*show_bits (&s->gb, 8*length) + 8*length;
726 da3b9756 Mike Melanson
727 303e50e6 Michael Niedermayer
    if (h->next_slice_index > s->gb.size_in_bits){
728
      av_log(h->s.avctx, AV_LOG_ERROR, "slice after bitstream end\n");
729 da3b9756 Mike Melanson
      return -1;
730 303e50e6 Michael Niedermayer
    }
731 da3b9756 Mike Melanson
732
    s->gb.size_in_bits = h->next_slice_index - 8*(length - 1);
733 5bb8a0da Michael Niedermayer
    skip_bits(&s->gb, 8);
734 da3b9756 Mike Melanson
735
    if (length > 0) {
736 5bb8a0da Michael Niedermayer
      memcpy ((uint8_t *) &s->gb.buffer[get_bits_count(&s->gb) >> 3],
737 da3b9756 Mike Melanson
             &s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1));
738
    }
739
  }
740
741 303e50e6 Michael Niedermayer
  if ((i = svq3_get_ue_golomb (&s->gb)) == INVALID_VLC || i >= 3){
742
    av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i);
743 da3b9756 Mike Melanson
    return -1;
744 303e50e6 Michael Niedermayer
  }
745 da3b9756 Mike Melanson
746
  h->slice_type = golomb_to_pict_type[i];
747
748
  if ((header & 0x9F) == 2) {
749
    i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1));
750
    s->mb_skip_run = get_bits (&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width));
751
  } else {
752
    get_bits1 (&s->gb);
753
    s->mb_skip_run = 0;
754
  }
755
756
  h->slice_num = get_bits (&s->gb, 8);
757
  s->qscale = get_bits (&s->gb, 5);
758
  s->adaptive_quant = get_bits1 (&s->gb);
759
760
  /* unknown fields */
761
  get_bits1 (&s->gb);
762
763
  if (h->unknown_svq3_flag) {
764
    get_bits1 (&s->gb);
765
  }
766
767
  get_bits1 (&s->gb);
768
  get_bits (&s->gb, 2);
769
770
  while (get_bits1 (&s->gb)) {
771
    get_bits (&s->gb, 8);
772
  }
773
774
  /* reset intra predictors and invalidate motion vector references */
775
  if (s->mb_x > 0) {
776
    memset (h->intra4x4_pred_mode[mb_xy - 1], -1, 4*sizeof(int8_t));
777
    memset (h->intra4x4_pred_mode[mb_xy - s->mb_x], -1, 8*sizeof(int8_t)*s->mb_x);
778
  }
779
  if (s->mb_y > 0) {
780
    memset (h->intra4x4_pred_mode[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x));
781
782
    if (s->mb_x > 0) {
783
      h->intra4x4_pred_mode[mb_xy - s->mb_stride - 1][3] = -1;
784
    }
785
  }
786
787
  return 0;
788
}
789
790 8b82a956 Michael Niedermayer
static int svq3_decode_frame (AVCodecContext *avctx,
791 bb270c08 Diego Biurrun
                              void *data, int *data_size,
792
                              uint8_t *buf, int buf_size) {
793 8b82a956 Michael Niedermayer
  MpegEncContext *const s = avctx->priv_data;
794
  H264Context *const h = avctx->priv_data;
795 da3b9756 Mike Melanson
  int m, mb_type;
796 14284f78 Mike Melanson
  unsigned char *extradata;
797 ebcd2f96 Mike Melanson
  unsigned int size;
798 da3b9756 Mike Melanson
799 8b82a956 Michael Niedermayer
  s->flags = avctx->flags;
800 303e50e6 Michael Niedermayer
  s->flags2 = avctx->flags2;
801 4ff7c576 Mike Melanson
  s->unrestricted_mv = 1;
802
803 8b82a956 Michael Niedermayer
  if (!s->context_initialized) {
804 4c701ac8 Michael Niedermayer
    s->width = avctx->width;
805
    s->height = avctx->height;
806 8b82a956 Michael Niedermayer
    h->pred4x4[DIAG_DOWN_LEFT_PRED] = pred4x4_down_left_svq3_c;
807
    h->pred16x16[PLANE_PRED8x8] = pred16x16_plane_svq3_c;
808
    h->halfpel_flag = 1;
809
    h->thirdpel_flag = 1;
810 da3b9756 Mike Melanson
    h->unknown_svq3_flag = 0;
811 8b82a956 Michael Niedermayer
    h->chroma_qp = 4;
812
813
    if (MPV_common_init (s) < 0)
814
      return -1;
815
816 4c701ac8 Michael Niedermayer
    h->b_stride = 4*s->mb_width;
817
818 8b82a956 Michael Niedermayer
    alloc_tables (h);
819
820 14284f78 Mike Melanson
    /* prowl for the "SEQH" marker in the extradata */
821
    extradata = (unsigned char *)avctx->extradata;
822
    for (m = 0; m < avctx->extradata_size; m++) {
823
      if (!memcmp (extradata, "SEQH", 4))
824
        break;
825
      extradata++;
826
    }
827 ebcd2f96 Mike Melanson
828 14284f78 Mike Melanson
    /* if a match was found, parse the extra data */
829 2c160320 Michael Niedermayer
    if (extradata && !memcmp (extradata, "SEQH", 4)) {
830 da3b9756 Mike Melanson
831
      GetBitContext gb;
832 8b82a956 Michael Niedermayer
833 fead30d4 Alex Beregszaszi
      size = AV_RB32(&extradata[4]);
834 63d33cf4 Michael Niedermayer
      init_get_bits (&gb, extradata + 8, size*8);
835 8b82a956 Michael Niedermayer
836 da3b9756 Mike Melanson
      /* 'frame size code' and optional 'width, height' */
837
      if (get_bits (&gb, 3) == 7) {
838 bb270c08 Diego Biurrun
        get_bits (&gb, 12);
839
        get_bits (&gb, 12);
840 8b82a956 Michael Niedermayer
      }
841
842 da3b9756 Mike Melanson
      h->halfpel_flag = get_bits1 (&gb);
843
      h->thirdpel_flag = get_bits1 (&gb);
844 8b82a956 Michael Niedermayer
845 da3b9756 Mike Melanson
      /* unknown fields */
846
      get_bits1 (&gb);
847
      get_bits1 (&gb);
848
      get_bits1 (&gb);
849
      get_bits1 (&gb);
850 8b82a956 Michael Niedermayer
851 da3b9756 Mike Melanson
      s->low_delay = get_bits1 (&gb);
852 8b82a956 Michael Niedermayer
853 da3b9756 Mike Melanson
      /* unknown field */
854
      get_bits1 (&gb);
855 8b82a956 Michael Niedermayer
856 da3b9756 Mike Melanson
      while (get_bits1 (&gb)) {
857 bb270c08 Diego Biurrun
        get_bits (&gb, 8);
858 da3b9756 Mike Melanson
      }
859 8b82a956 Michael Niedermayer
860 da3b9756 Mike Melanson
      h->unknown_svq3_flag = get_bits1 (&gb);
861
      avctx->has_b_frames = !s->low_delay;
862
    }
863
  }
864 8b82a956 Michael Niedermayer
865 da3b9756 Mike Melanson
  /* special case for last picture */
866
  if (buf_size == 0) {
867
    if (s->next_picture_ptr && !s->low_delay) {
868
      *(AVFrame *) data = *(AVFrame *) &s->next_picture;
869
      *data_size = sizeof(AVFrame);
870
    }
871
    return 0;
872
  }
873 8b82a956 Michael Niedermayer
874 da3b9756 Mike Melanson
  init_get_bits (&s->gb, buf, 8*buf_size);
875 8b82a956 Michael Niedermayer
876 da3b9756 Mike Melanson
  s->mb_x = s->mb_y = 0;
877 8b82a956 Michael Niedermayer
878 da3b9756 Mike Melanson
  if (svq3_decode_slice_header (h))
879
    return -1;
880 8b82a956 Michael Niedermayer
881 da3b9756 Mike Melanson
  s->pict_type = h->slice_type;
882
  s->picture_number = h->slice_num;
883 8b82a956 Michael Niedermayer
884 4704097a Michael Niedermayer
  if(avctx->debug&FF_DEBUG_PICT_INFO){
885 115329f1 Diego Biurrun
      av_log(h->s.avctx, AV_LOG_DEBUG, "%c hpel:%d, tpel:%d aqp:%d qp:%d\n",
886 d8085ea7 Michael Niedermayer
      av_get_pict_type_char(s->pict_type), h->halfpel_flag, h->thirdpel_flag,
887 4704097a Michael Niedermayer
      s->adaptive_quant, s->qscale
888
      );
889
  }
890 8b82a956 Michael Niedermayer
891 da3b9756 Mike Melanson
  /* for hurry_up==5 */
892
  s->current_picture.pict_type = s->pict_type;
893
  s->current_picture.key_frame = (s->pict_type == I_TYPE);
894
895
  /* skip b frames if we dont have reference frames */
896
  if (s->last_picture_ptr == NULL && s->pict_type == B_TYPE) return 0;
897
  /* skip b frames if we are in a hurry */
898
  if (avctx->hurry_up && s->pict_type == B_TYPE) return 0;
899
  /* skip everything if we are in a hurry >= 5 */
900
  if (avctx->hurry_up >= 5) return 0;
901 8c3eba7c Michael Niedermayer
  if(  (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
902
     ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
903
     || avctx->skip_frame >= AVDISCARD_ALL)
904
      return 0;
905 da3b9756 Mike Melanson
906
  if (s->next_p_frame_damaged) {
907
    if (s->pict_type == B_TYPE)
908
      return 0;
909
    else
910
      s->next_p_frame_damaged = 0;
911
  }
912 8b82a956 Michael Niedermayer
913 0c74098b Michael Niedermayer
  if (frame_start (h) < 0)
914
    return -1;
915 8b82a956 Michael Niedermayer
916 da3b9756 Mike Melanson
  if (s->pict_type == B_TYPE) {
917
    h->frame_num_offset = (h->slice_num - h->prev_frame_num);
918
919
    if (h->frame_num_offset < 0) {
920
      h->frame_num_offset += 256;
921
    }
922
    if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) {
923 9b879566 Michel Bardiaux
      av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
924 da3b9756 Mike Melanson
      return -1;
925
    }
926
  } else {
927
    h->prev_frame_num = h->frame_num;
928
    h->frame_num = h->slice_num;
929
    h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num);
930
931
    if (h->prev_frame_num_offset < 0) {
932
      h->prev_frame_num_offset += 256;
933
    }
934
  }
935
936
  for(m=0; m<2; m++){
937
    int i;
938
    for(i=0; i<4; i++){
939
      int j;
940
      for(j=-1; j<4; j++)
941 bb270c08 Diego Biurrun
        h->ref_cache[m][scan8[0] + 8*i + j]= 1;
942 da3b9756 Mike Melanson
      h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
943
    }
944 f7a8c179 Michael Niedermayer
  }
945 115329f1 Diego Biurrun
946 8b82a956 Michael Niedermayer
  for (s->mb_y=0; s->mb_y < s->mb_height; s->mb_y++) {
947
    for (s->mb_x=0; s->mb_x < s->mb_width; s->mb_x++) {
948 da3b9756 Mike Melanson
949 5bb8a0da Michael Niedermayer
      if ( (get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits &&
950 bb270c08 Diego Biurrun
          ((get_bits_count(&s->gb) & 7) == 0 || show_bits (&s->gb, (-get_bits_count(&s->gb) & 7)) == 0)) {
951 da3b9756 Mike Melanson
952 bb270c08 Diego Biurrun
        skip_bits(&s->gb, h->next_slice_index - get_bits_count(&s->gb));
953
        s->gb.size_in_bits = 8*buf_size;
954 da3b9756 Mike Melanson
955 bb270c08 Diego Biurrun
        if (svq3_decode_slice_header (h))
956
          return -1;
957 da3b9756 Mike Melanson
958 bb270c08 Diego Biurrun
        /* TODO: support s->mb_skip_run */
959 da3b9756 Mike Melanson
      }
960
961
      mb_type = svq3_get_ue_golomb (&s->gb);
962 8b82a956 Michael Niedermayer
963
      if (s->pict_type == I_TYPE) {
964 bb270c08 Diego Biurrun
        mb_type += 8;
965 da3b9756 Mike Melanson
      } else if (s->pict_type == B_TYPE && mb_type >= 4) {
966 bb270c08 Diego Biurrun
        mb_type += 4;
967 8b82a956 Michael Niedermayer
      }
968 da3b9756 Mike Melanson
      if (mb_type > 33 || svq3_decode_mb (h, mb_type)) {
969 bb270c08 Diego Biurrun
        av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
970
        return -1;
971 8b82a956 Michael Niedermayer
      }
972
973
      if (mb_type != 0) {
974 bb270c08 Diego Biurrun
        hl_decode_mb (h);
975 8b82a956 Michael Niedermayer
      }
976 2e26c8d2 Mike Melanson
977
      if (s->pict_type != B_TYPE && !s->low_delay) {
978 bb270c08 Diego Biurrun
        s->current_picture.mb_type[s->mb_x + s->mb_y*s->mb_stride] =
979
                        (s->pict_type == P_TYPE && mb_type < 8) ? (mb_type - 1) : -1;
980 2e26c8d2 Mike Melanson
      }
981 8b82a956 Michael Niedermayer
    }
982 4c701ac8 Michael Niedermayer
983
    ff_draw_horiz_band(s, 16*s->mb_y, 16);
984 8b82a956 Michael Niedermayer
  }
985
986
  MPV_frame_end(s);
987 da3b9756 Mike Melanson
988
  if (s->pict_type == B_TYPE || s->low_delay) {
989
    *(AVFrame *) data = *(AVFrame *) &s->current_picture;
990
  } else {
991
    *(AVFrame *) data = *(AVFrame *) &s->last_picture;
992
  }
993
994
  avctx->frame_number = s->picture_number - 1;
995
996
  /* dont output the last pic after seeking */
997
  if (s->last_picture_ptr || s->low_delay) {
998
    *data_size = sizeof(AVFrame);
999
  }
1000
1001 8b82a956 Michael Niedermayer
  return buf_size;
1002
}
1003
1004
1005
AVCodec svq3_decoder = {
1006
    "svq3",
1007
    CODEC_TYPE_VIDEO,
1008
    CODEC_ID_SVQ3,
1009
    sizeof(H264Context),
1010
    decode_init,
1011
    NULL,
1012
    decode_end,
1013
    svq3_decode_frame,
1014 934982c4 Michael Niedermayer
    CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_DELAY,
1015 8b82a956 Michael Niedermayer
};