~ubuntu-branches/ubuntu/hardy/avidemux/hardy

« back to all changes in this revision

Viewing changes to avidemux/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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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
};