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