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

« back to all changes in this revision

Viewing changes to adm_lavcodec/svq3.c

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

Show diffs side-by-side

added added

removed removed

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