]> git.sesse.net Git - ffmpeg/blob - libavcodec/svq3.c
aacdec: Remove erroneous reference to global gain from the out of bounds scalefactor...
[ffmpeg] / libavcodec / svq3.c
1 /*
2  * Copyright (c) 2003 The Libav Project
3  *
4  * This file is part of Libav.
5  *
6  * Libav 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  * Libav 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 Libav; 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.libav.org/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 } SVQ3Context;
74
75 #define FULLPEL_MODE  1
76 #define HALFPEL_MODE  2
77 #define THIRDPEL_MODE 3
78 #define PREDICT_MODE  4
79
80 /* dual scan (from some older h264 draft)
81  o-->o-->o   o
82          |  /|
83  o   o   o / o
84  | / |   |/  |
85  o   o   o   o
86    /
87  o-->o-->o-->o
88 */
89 static const uint8_t svq3_scan[16] = {
90     0+0*4, 1+0*4, 2+0*4, 2+1*4,
91     2+2*4, 3+0*4, 3+1*4, 3+2*4,
92     0+1*4, 0+2*4, 1+1*4, 1+2*4,
93     0+3*4, 1+3*4, 2+3*4, 3+3*4,
94 };
95
96 static const uint8_t svq3_pred_0[25][2] = {
97     { 0, 0 },
98     { 1, 0 }, { 0, 1 },
99     { 0, 2 }, { 1, 1 }, { 2, 0 },
100     { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
101     { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
102     { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
103     { 2, 4 }, { 3, 3 }, { 4, 2 },
104     { 4, 3 }, { 3, 4 },
105     { 4, 4 }
106 };
107
108 static const int8_t svq3_pred_1[6][6][5] = {
109     { { 2,-1,-1,-1,-1 }, { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 },
110       { 2, 1,-1,-1,-1 }, { 1, 2,-1,-1,-1 }, { 1, 2,-1,-1,-1 } },
111     { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 4, 3 }, { 0, 1, 2, 4, 3 },
112       { 0, 2, 1, 4, 3 }, { 2, 0, 1, 3, 4 }, { 0, 4, 2, 1, 3 } },
113     { { 2, 0,-1,-1,-1 }, { 2, 1, 0, 4, 3 }, { 1, 2, 4, 0, 3 },
114       { 2, 1, 0, 4, 3 }, { 2, 1, 4, 3, 0 }, { 1, 2, 4, 0, 3 } },
115     { { 2, 0,-1,-1,-1 }, { 2, 0, 1, 4, 3 }, { 1, 2, 0, 4, 3 },
116       { 2, 1, 0, 4, 3 }, { 2, 1, 3, 4, 0 }, { 2, 4, 1, 0, 3 } },
117     { { 0, 2,-1,-1,-1 }, { 0, 2, 1, 3, 4 }, { 1, 2, 3, 0, 4 },
118       { 2, 0, 1, 3, 4 }, { 2, 1, 3, 0, 4 }, { 2, 0, 4, 3, 1 } },
119     { { 0, 2,-1,-1,-1 }, { 0, 2, 4, 1, 3 }, { 1, 4, 2, 0, 3 },
120       { 4, 2, 0, 1, 3 }, { 2, 0, 1, 4, 3 }, { 4, 2, 1, 0, 3 } },
121 };
122
123 static const struct { uint8_t run; uint8_t level; } svq3_dct_tables[2][16] = {
124     { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
125       { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
126     { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
127       { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
128 };
129
130 static const uint32_t svq3_dequant_coeff[32] = {
131      3881,  4351,  4890,  5481,  6154,  6914,  7761,  8718,
132      9781, 10987, 12339, 13828, 15523, 17435, 19561, 21873,
133     24552, 27656, 30847, 34870, 38807, 43747, 49103, 54683,
134     61694, 68745, 77615, 89113,100253,109366,126635,141533
135 };
136
137 void ff_svq3_luma_dc_dequant_idct_c(DCTELEM *output, DCTELEM *input, int qp){
138     const int qmul = svq3_dequant_coeff[qp];
139 #define stride 16
140     int i;
141     int temp[16];
142     static const uint8_t x_offset[4]={0, 1*stride, 4*stride, 5*stride};
143
144     for(i=0; i<4; i++){
145         const int z0 = 13*(input[4*i+0] +    input[4*i+2]);
146         const int z1 = 13*(input[4*i+0] -    input[4*i+2]);
147         const int z2 =  7* input[4*i+1] - 17*input[4*i+3];
148         const int z3 = 17* input[4*i+1] +  7*input[4*i+3];
149
150         temp[4*i+0] = z0+z3;
151         temp[4*i+1] = z1+z2;
152         temp[4*i+2] = z1-z2;
153         temp[4*i+3] = z0-z3;
154     }
155
156     for(i=0; i<4; i++){
157         const int offset= x_offset[i];
158         const int z0= 13*(temp[4*0+i] +    temp[4*2+i]);
159         const int z1= 13*(temp[4*0+i] -    temp[4*2+i]);
160         const int z2=  7* temp[4*1+i] - 17*temp[4*3+i];
161         const int z3= 17* temp[4*1+i] +  7*temp[4*3+i];
162
163         output[stride* 0+offset] = ((z0 + z3)*qmul + 0x80000) >> 20;
164         output[stride* 2+offset] = ((z1 + z2)*qmul + 0x80000) >> 20;
165         output[stride* 8+offset] = ((z1 - z2)*qmul + 0x80000) >> 20;
166         output[stride*10+offset] = ((z0 - z3)*qmul + 0x80000) >> 20;
167     }
168 }
169 #undef stride
170
171 void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp,
172                             int dc)
173 {
174     const int qmul = svq3_dequant_coeff[qp];
175     int i;
176     uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
177
178     if (dc) {
179         dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
180         block[0] = 0;
181     }
182
183     for (i = 0; i < 4; i++) {
184         const int z0 = 13*(block[0 + 4*i] +    block[2 + 4*i]);
185         const int z1 = 13*(block[0 + 4*i] -    block[2 + 4*i]);
186         const int z2 =  7* block[1 + 4*i] - 17*block[3 + 4*i];
187         const int z3 = 17* block[1 + 4*i] +  7*block[3 + 4*i];
188
189         block[0 + 4*i] = z0 + z3;
190         block[1 + 4*i] = z1 + z2;
191         block[2 + 4*i] = z1 - z2;
192         block[3 + 4*i] = z0 - z3;
193     }
194
195     for (i = 0; i < 4; i++) {
196         const int z0 = 13*(block[i + 4*0] +    block[i + 4*2]);
197         const int z1 = 13*(block[i + 4*0] -    block[i + 4*2]);
198         const int z2 =  7* block[i + 4*1] - 17*block[i + 4*3];
199         const int z3 = 17* block[i + 4*1] +  7*block[i + 4*3];
200         const int rr = (dc + 0x80000);
201
202         dst[i + stride*0] = cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ];
203         dst[i + stride*1] = cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ];
204         dst[i + stride*2] = cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ];
205         dst[i + stride*3] = cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ];
206     }
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 = av_clip (mx, -16, (s->h_edge_pos - width  + 15));
287         my = av_clip (my, -16, (s->v_edge_pos - height + 15));
288     }
289
290     /* form component predictions */
291     dest = s->current_picture.f.data[0] + x + y*s->linesize;
292     src  = pic->f.data[0] + mx + my*s->linesize;
293
294     if (emu) {
295         s->dsp.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.f.data[i] + (x >> 1) + (y >> 1) * s->uvlinesize;
313             src  = pic->f.data[i] + mx + my * s->uvlinesize;
314
315             if (emu) {
316                 s->dsp.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,
329                               int avg)
330 {
331     int i, j, k, mx, my, dx, dy, x, y;
332     MpegEncContext *const s = (MpegEncContext *) h;
333     const int part_width  = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
334     const int part_height = 16 >> ((unsigned) (size + 1) / 3);
335     const int extra_width = (mode == PREDICT_MODE) ? -16*6 : 0;
336     const int h_edge_pos  = 6*(s->h_edge_pos - part_width ) - extra_width;
337     const int v_edge_pos  = 6*(s->v_edge_pos - part_height) - extra_width;
338
339     for (i = 0; i < 16; i += part_height) {
340         for (j = 0; j < 16; j += part_width) {
341             const int b_xy = (4*s->mb_x + (j >> 2)) + (4*s->mb_y + (i >> 2))*h->b_stride;
342             int dxy;
343             x = 16*s->mb_x + j;
344             y = 16*s->mb_y + i;
345             k = ((j >> 2) & 1) + ((i >> 1) & 2) + ((j >> 1) & 4) + (i & 8);
346
347             if (mode != PREDICT_MODE) {
348                 pred_motion(h, k, (part_width >> 2), dir, 1, &mx, &my);
349             } else {
350                 mx = s->next_picture.f.motion_val[0][b_xy][0] << 1;
351                 my = s->next_picture.f.motion_val[0][b_xy][1] << 1;
352
353                 if (dir == 0) {
354                     mx = ((mx * h->frame_num_offset) / h->prev_frame_num_offset + 1) >> 1;
355                     my = ((my * h->frame_num_offset) / h->prev_frame_num_offset + 1) >> 1;
356                 } else {
357                     mx = ((mx * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1) >> 1;
358                     my = ((my * (h->frame_num_offset - h->prev_frame_num_offset)) / h->prev_frame_num_offset + 1) >> 1;
359                 }
360             }
361
362             /* clip motion vector prediction to frame border */
363             mx = av_clip(mx, extra_width - 6*x, h_edge_pos - 6*x);
364             my = av_clip(my, extra_width - 6*y, v_edge_pos - 6*y);
365
366             /* get (optional) motion vector differential */
367             if (mode == PREDICT_MODE) {
368                 dx = dy = 0;
369             } else {
370                 dy = svq3_get_se_golomb(&s->gb);
371                 dx = svq3_get_se_golomb(&s->gb);
372
373                 if (dx == INVALID_VLC || dy == INVALID_VLC) {
374                     av_log(h->s.avctx, AV_LOG_ERROR, "invalid MV vlc\n");
375                     return -1;
376                 }
377             }
378
379             /* compute motion vector */
380             if (mode == THIRDPEL_MODE) {
381                 int fx, fy;
382                 mx  = ((mx + 1)>>1) + dx;
383                 my  = ((my + 1)>>1) + dy;
384                 fx  = ((unsigned)(mx + 0x3000))/3 - 0x1000;
385                 fy  = ((unsigned)(my + 0x3000))/3 - 0x1000;
386                 dxy = (mx - 3*fx) + 4*(my - 3*fy);
387
388                 svq3_mc_dir_part(s, x, y, part_width, part_height, fx, fy, dxy, 1, dir, avg);
389                 mx += mx;
390                 my += my;
391             } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
392                 mx  = ((unsigned)(mx + 1 + 0x3000))/3 + dx - 0x1000;
393                 my  = ((unsigned)(my + 1 + 0x3000))/3 + dy - 0x1000;
394                 dxy = (mx&1) + 2*(my&1);
395
396                 svq3_mc_dir_part(s, x, y, part_width, part_height, mx>>1, my>>1, dxy, 0, dir, avg);
397                 mx *= 3;
398                 my *= 3;
399             } else {
400                 mx = ((unsigned)(mx + 3 + 0x6000))/6 + dx - 0x1000;
401                 my = ((unsigned)(my + 3 + 0x6000))/6 + dy - 0x1000;
402
403                 svq3_mc_dir_part(s, x, y, part_width, part_height, mx, my, 0, 0, dir, avg);
404                 mx *= 6;
405                 my *= 6;
406             }
407
408             /* update mv_cache */
409             if (mode != PREDICT_MODE) {
410                 int32_t mv = pack16to32(mx,my);
411
412                 if (part_height == 8 && i < 8) {
413                     *(int32_t *) h->mv_cache[dir][scan8[k] + 1*8] = mv;
414
415                     if (part_width == 8 && j < 8) {
416                         *(int32_t *) h->mv_cache[dir][scan8[k] + 1 + 1*8] = mv;
417                     }
418                 }
419                 if (part_width == 8 && j < 8) {
420                     *(int32_t *) h->mv_cache[dir][scan8[k] + 1] = mv;
421                 }
422                 if (part_width == 4 || part_height == 4) {
423                     *(int32_t *) h->mv_cache[dir][scan8[k]] = mv;
424                 }
425             }
426
427             /* write back motion vectors */
428             fill_rectangle(s->current_picture.f.motion_val[dir][b_xy],
429                            part_width >> 2, part_height >> 2, h->b_stride,
430                            pack16to32(mx, my), 4);
431         }
432     }
433
434     return 0;
435 }
436
437 static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type)
438 {
439     H264Context *h = &svq3->h;
440     int i, j, k, m, dir, mode;
441     int cbp = 0;
442     uint32_t vlc;
443     int8_t *top, *left;
444     MpegEncContext *const s = (MpegEncContext *) h;
445     const int mb_xy = h->mb_xy;
446     const int b_xy  = 4*s->mb_x + 4*s->mb_y*h->b_stride;
447
448     h->top_samples_available      = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
449     h->left_samples_available     = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
450     h->topright_samples_available = 0xFFFF;
451
452     if (mb_type == 0) {           /* SKIP */
453         if (s->pict_type == AV_PICTURE_TYPE_P || s->next_picture.f.mb_type[mb_xy] == -1) {
454             svq3_mc_dir_part(s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 0, 0);
455
456             if (s->pict_type == AV_PICTURE_TYPE_B) {
457                 svq3_mc_dir_part(s, 16*s->mb_x, 16*s->mb_y, 16, 16, 0, 0, 0, 0, 1, 1);
458             }
459
460             mb_type = MB_TYPE_SKIP;
461         } else {
462             mb_type = FFMIN(s->next_picture.f.mb_type[mb_xy], 6);
463             if (svq3_mc_dir(h, mb_type, PREDICT_MODE, 0, 0) < 0)
464                 return -1;
465             if (svq3_mc_dir(h, mb_type, PREDICT_MODE, 1, 1) < 0)
466                 return -1;
467
468             mb_type = MB_TYPE_16x16;
469         }
470     } else if (mb_type < 8) {     /* INTER */
471         if (svq3->thirdpel_flag && svq3->halfpel_flag == !get_bits1 (&s->gb)) {
472             mode = THIRDPEL_MODE;
473         } else if (svq3->halfpel_flag && svq3->thirdpel_flag == !get_bits1 (&s->gb)) {
474             mode = HALFPEL_MODE;
475         } else {
476             mode = FULLPEL_MODE;
477         }
478
479         /* fill caches */
480         /* note ref_cache should contain here:
481             ????????
482             ???11111
483             N??11111
484             N??11111
485             N??11111
486         */
487
488         for (m = 0; m < 2; m++) {
489             if (s->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6] != -1) {
490                 for (i = 0; i < 4; i++) {
491                     *(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];
492                 }
493             } else {
494                 for (i = 0; i < 4; i++) {
495                     *(uint32_t *) h->mv_cache[m][scan8[0] - 1 + i*8] = 0;
496                 }
497             }
498             if (s->mb_y > 0) {
499                 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));
500                 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);
501
502                 if (s->mb_x < (s->mb_width - 1)) {
503                     *(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];
504                     h->ref_cache[m][scan8[0] + 4 - 1*8] =
505                         (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride + 1]+6] == -1 ||
506                          h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride    ]  ] == -1) ? PART_NOT_AVAILABLE : 1;
507                 }else
508                     h->ref_cache[m][scan8[0] + 4 - 1*8] = PART_NOT_AVAILABLE;
509                 if (s->mb_x > 0) {
510                     *(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];
511                     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;
512                 }else
513                     h->ref_cache[m][scan8[0] - 1 - 1*8] = PART_NOT_AVAILABLE;
514             }else
515                 memset(&h->ref_cache[m][scan8[0] - 1*8 - 1], PART_NOT_AVAILABLE, 8);
516
517             if (s->pict_type != AV_PICTURE_TYPE_B)
518                 break;
519         }
520
521         /* decode motion vector(s) and form prediction(s) */
522         if (s->pict_type == AV_PICTURE_TYPE_P) {
523             if (svq3_mc_dir(h, (mb_type - 1), mode, 0, 0) < 0)
524                 return -1;
525         } else {        /* AV_PICTURE_TYPE_B */
526             if (mb_type != 2) {
527                 if (svq3_mc_dir(h, 0, mode, 0, 0) < 0)
528                     return -1;
529             } else {
530                 for (i = 0; i < 4; i++) {
531                     memset(s->current_picture.f.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
532                 }
533             }
534             if (mb_type != 1) {
535                 if (svq3_mc_dir(h, 0, mode, 1, (mb_type == 3)) < 0)
536                     return -1;
537             } else {
538                 for (i = 0; i < 4; i++) {
539                     memset(s->current_picture.f.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
540                 }
541             }
542         }
543
544         mb_type = MB_TYPE_16x16;
545     } else if (mb_type == 8 || mb_type == 33) {   /* INTRA4x4 */
546         memset(h->intra4x4_pred_mode_cache, -1, 8*5*sizeof(int8_t));
547
548         if (mb_type == 8) {
549             if (s->mb_x > 0) {
550                 for (i = 0; i < 4; i++) {
551                     h->intra4x4_pred_mode_cache[scan8[0] - 1 + i*8] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1]+6-i];
552                 }
553                 if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1) {
554                     h->left_samples_available = 0x5F5F;
555                 }
556             }
557             if (s->mb_y > 0) {
558                 h->intra4x4_pred_mode_cache[4+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+0];
559                 h->intra4x4_pred_mode_cache[5+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+1];
560                 h->intra4x4_pred_mode_cache[6+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+2];
561                 h->intra4x4_pred_mode_cache[7+8*0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride]+3];
562
563                 if (h->intra4x4_pred_mode_cache[4+8*0] == -1) {
564                     h->top_samples_available = 0x33FF;
565                 }
566             }
567
568             /* decode prediction codes for luma blocks */
569             for (i = 0; i < 16; i+=2) {
570                 vlc = svq3_get_ue_golomb(&s->gb);
571
572                 if (vlc >= 25){
573                     av_log(h->s.avctx, AV_LOG_ERROR, "luma prediction:%d\n", vlc);
574                     return -1;
575                 }
576
577                 left    = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
578                 top     = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
579
580                 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
581                 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
582
583                 if (left[1] == -1 || left[2] == -1){
584                     av_log(h->s.avctx, AV_LOG_ERROR, "weird prediction\n");
585                     return -1;
586                 }
587             }
588         } else {    /* mb_type == 33, DC_128_PRED block type */
589             for (i = 0; i < 4; i++) {
590                 memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_PRED, 4);
591             }
592         }
593
594         write_back_intra_pred_mode(h);
595
596         if (mb_type == 8) {
597             ff_h264_check_intra4x4_pred_mode(h);
598
599             h->top_samples_available  = (s->mb_y == 0) ? 0x33FF : 0xFFFF;
600             h->left_samples_available = (s->mb_x == 0) ? 0x5F5F : 0xFFFF;
601         } else {
602             for (i = 0; i < 4; i++) {
603                 memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8*i], DC_128_PRED, 4);
604             }
605
606             h->top_samples_available  = 0x33FF;
607             h->left_samples_available = 0x5F5F;
608         }
609
610         mb_type = MB_TYPE_INTRA4x4;
611     } else {                      /* INTRA16x16 */
612         dir = i_mb_type_info[mb_type - 8].pred_mode;
613         dir = (dir >> 1) ^ 3*(dir & 1) ^ 1;
614
615         if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) == -1){
616             av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n");
617             return -1;
618         }
619
620         cbp = i_mb_type_info[mb_type - 8].cbp;
621         mb_type = MB_TYPE_INTRA16x16;
622     }
623
624     if (!IS_INTER(mb_type) && s->pict_type != AV_PICTURE_TYPE_I) {
625         for (i = 0; i < 4; i++) {
626             memset(s->current_picture.f.motion_val[0][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
627         }
628         if (s->pict_type == AV_PICTURE_TYPE_B) {
629             for (i = 0; i < 4; i++) {
630                 memset(s->current_picture.f.motion_val[1][b_xy + i*h->b_stride], 0, 4*2*sizeof(int16_t));
631             }
632         }
633     }
634     if (!IS_INTRA4x4(mb_type)) {
635         memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy], DC_PRED, 8);
636     }
637     if (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B) {
638         memset(h->non_zero_count_cache + 8, 0, 14*8*sizeof(uint8_t));
639         s->dsp.clear_blocks(h->mb+  0);
640         s->dsp.clear_blocks(h->mb+384);
641     }
642
643     if (!IS_INTRA16x16(mb_type) && (!IS_SKIP(mb_type) || s->pict_type == AV_PICTURE_TYPE_B)) {
644         if ((vlc = svq3_get_ue_golomb(&s->gb)) >= 48){
645             av_log(h->s.avctx, AV_LOG_ERROR, "cbp_vlc=%d\n", vlc);
646             return -1;
647         }
648
649         cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc] : golomb_to_inter_cbp[vlc];
650     }
651     if (IS_INTRA16x16(mb_type) || (s->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
652         s->qscale += svq3_get_se_golomb(&s->gb);
653
654         if (s->qscale > 31){
655             av_log(h->s.avctx, AV_LOG_ERROR, "qscale:%d\n", s->qscale);
656             return -1;
657         }
658     }
659     if (IS_INTRA16x16(mb_type)) {
660         AV_ZERO128(h->mb_luma_dc[0]+0);
661         AV_ZERO128(h->mb_luma_dc[0]+8);
662         if (svq3_decode_block(&s->gb, h->mb_luma_dc, 0, 1)){
663             av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding intra luma dc\n");
664             return -1;
665         }
666     }
667
668     if (cbp) {
669         const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
670         const int type = ((s->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
671
672         for (i = 0; i < 4; i++) {
673             if ((cbp & (1 << i))) {
674                 for (j = 0; j < 4; j++) {
675                     k = index ? ((j&1) + 2*(i&1) + 2*(j&2) + 4*(i&2)) : (4*i + j);
676                     h->non_zero_count_cache[ scan8[k] ] = 1;
677
678                     if (svq3_decode_block(&s->gb, &h->mb[16*k], index, type)){
679                         av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding block\n");
680                         return -1;
681                     }
682                 }
683             }
684         }
685
686         if ((cbp & 0x30)) {
687             for (i = 1; i < 3; ++i) {
688               if (svq3_decode_block(&s->gb, &h->mb[16*16*i], 0, 3)){
689                 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma dc block\n");
690                 return -1;
691               }
692             }
693
694             if ((cbp & 0x20)) {
695                 for (i = 1; i < 3; i++) {
696                     for (j = 0; j < 4; j++) {
697                         k = 16*i + j;
698                         h->non_zero_count_cache[ scan8[k] ] = 1;
699
700                         if (svq3_decode_block(&s->gb, &h->mb[16*k], 1, 1)){
701                             av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding chroma ac block\n");
702                             return -1;
703                         }
704                     }
705                 }
706             }
707         }
708     }
709
710     h->cbp= cbp;
711     s->current_picture.f.mb_type[mb_xy] = mb_type;
712
713     if (IS_INTRA(mb_type)) {
714         h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8, 1);
715     }
716
717     return 0;
718 }
719
720 static int svq3_decode_slice_header(AVCodecContext *avctx)
721 {
722     SVQ3Context *svq3 = avctx->priv_data;
723     H264Context *h = &svq3->h;
724     MpegEncContext *s = &h->s;
725     const int mb_xy = h->mb_xy;
726     int i, header;
727
728     header = get_bits(&s->gb, 8);
729
730     if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
731         /* TODO: what? */
732         av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
733         return -1;
734     } else {
735         int length = (header >> 5) & 3;
736
737         svq3->next_slice_index = get_bits_count(&s->gb) + 8*show_bits(&s->gb, 8*length) + 8*length;
738
739         if (svq3->next_slice_index > s->gb.size_in_bits) {
740             av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
741             return -1;
742     }
743
744         s->gb.size_in_bits = svq3->next_slice_index - 8*(length - 1);
745         skip_bits(&s->gb, 8);
746
747         if (svq3->watermark_key) {
748             uint32_t header = AV_RL32(&s->gb.buffer[(get_bits_count(&s->gb)>>3)+1]);
749             AV_WL32(&s->gb.buffer[(get_bits_count(&s->gb)>>3)+1], header ^ svq3->watermark_key);
750         }
751         if (length > 0) {
752             memcpy((uint8_t *) &s->gb.buffer[get_bits_count(&s->gb) >> 3],
753                    &s->gb.buffer[s->gb.size_in_bits >> 3], (length - 1));
754         }
755         skip_bits_long(&s->gb, 0);
756     }
757
758     if ((i = svq3_get_ue_golomb(&s->gb)) == INVALID_VLC || i >= 3){
759         av_log(h->s.avctx, AV_LOG_ERROR, "illegal slice type %d \n", i);
760         return -1;
761     }
762
763     h->slice_type = golomb_to_pict_type[i];
764
765     if ((header & 0x9F) == 2) {
766         i = (s->mb_num < 64) ? 6 : (1 + av_log2 (s->mb_num - 1));
767         s->mb_skip_run = get_bits(&s->gb, i) - (s->mb_x + (s->mb_y * s->mb_width));
768     } else {
769         skip_bits1(&s->gb);
770         s->mb_skip_run = 0;
771     }
772
773     h->slice_num = get_bits(&s->gb, 8);
774     s->qscale = get_bits(&s->gb, 5);
775     s->adaptive_quant = get_bits1(&s->gb);
776
777     /* unknown fields */
778     skip_bits1(&s->gb);
779
780     if (svq3->unknown_flag) {
781         skip_bits1(&s->gb);
782     }
783
784     skip_bits1(&s->gb);
785     skip_bits(&s->gb, 2);
786
787     while (get_bits1(&s->gb)) {
788         skip_bits(&s->gb, 8);
789     }
790
791     /* reset intra predictors and invalidate motion vector references */
792     if (s->mb_x > 0) {
793         memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - 1      ]+3, -1, 4*sizeof(int8_t));
794         memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_x]  , -1, 8*sizeof(int8_t)*s->mb_x);
795     }
796     if (s->mb_y > 0) {
797         memset(h->intra4x4_pred_mode+h->mb2br_xy[mb_xy - s->mb_stride], -1, 8*sizeof(int8_t)*(s->mb_width - s->mb_x));
798
799         if (s->mb_x > 0) {
800             h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - s->mb_stride - 1]+3] = -1;
801         }
802     }
803
804     return 0;
805 }
806
807 static av_cold int svq3_decode_init(AVCodecContext *avctx)
808 {
809     SVQ3Context *svq3 = avctx->priv_data;
810     H264Context *h = &svq3->h;
811     MpegEncContext *s = &h->s;
812     int m;
813     unsigned char *extradata;
814     unsigned char *extradata_end;
815     unsigned int size;
816     int marker_found = 0;
817
818     if (ff_h264_decode_init(avctx) < 0)
819         return -1;
820
821     s->flags  = avctx->flags;
822     s->flags2 = avctx->flags2;
823     s->unrestricted_mv = 1;
824     h->is_complex=1;
825     avctx->pix_fmt = avctx->codec->pix_fmts[0];
826
827     if (!s->context_initialized) {
828         h->chroma_qp[0] = h->chroma_qp[1] = 4;
829
830         svq3->halfpel_flag  = 1;
831         svq3->thirdpel_flag = 1;
832         svq3->unknown_flag  = 0;
833
834         /* prowl for the "SEQH" marker in the extradata */
835         extradata = (unsigned char *)avctx->extradata;
836         extradata_end = avctx->extradata + avctx->extradata_size;
837         if (extradata) {
838             for (m = 0; m + 8 < avctx->extradata_size; m++) {
839                 if (!memcmp(extradata, "SEQH", 4)) {
840                     marker_found = 1;
841                     break;
842                 }
843                 extradata++;
844             }
845         }
846
847         /* if a match was found, parse the extra data */
848         if (marker_found) {
849
850             GetBitContext gb;
851             int frame_size_code;
852
853             size = AV_RB32(&extradata[4]);
854             if (size > extradata_end - extradata - 8)
855                 return AVERROR_INVALIDDATA;
856             init_get_bits(&gb, extradata + 8, size*8);
857
858             /* 'frame size code' and optional 'width, height' */
859             frame_size_code = get_bits(&gb, 3);
860             switch (frame_size_code) {
861                 case 0: avctx->width = 160; avctx->height = 120; break;
862                 case 1: avctx->width = 128; avctx->height =  96; break;
863                 case 2: avctx->width = 176; avctx->height = 144; break;
864                 case 3: avctx->width = 352; avctx->height = 288; break;
865                 case 4: avctx->width = 704; avctx->height = 576; break;
866                 case 5: avctx->width = 240; avctx->height = 180; break;
867                 case 6: avctx->width = 320; avctx->height = 240; break;
868                 case 7:
869                     avctx->width  = get_bits(&gb, 12);
870                     avctx->height = get_bits(&gb, 12);
871                     break;
872             }
873
874             svq3->halfpel_flag  = get_bits1(&gb);
875             svq3->thirdpel_flag = get_bits1(&gb);
876
877             /* unknown fields */
878             skip_bits1(&gb);
879             skip_bits1(&gb);
880             skip_bits1(&gb);
881             skip_bits1(&gb);
882
883             s->low_delay = get_bits1(&gb);
884
885             /* unknown field */
886             skip_bits1(&gb);
887
888             while (get_bits1(&gb)) {
889                 skip_bits(&gb, 8);
890             }
891
892             svq3->unknown_flag = get_bits1(&gb);
893             avctx->has_b_frames = !s->low_delay;
894             if (svq3->unknown_flag) {
895 #if CONFIG_ZLIB
896                 unsigned watermark_width  = svq3_get_ue_golomb(&gb);
897                 unsigned watermark_height = svq3_get_ue_golomb(&gb);
898                 int u1 = svq3_get_ue_golomb(&gb);
899                 int u2 = get_bits(&gb, 8);
900                 int u3 = get_bits(&gb, 2);
901                 int u4 = svq3_get_ue_golomb(&gb);
902                 unsigned long buf_len = watermark_width*watermark_height*4;
903                 int offset = (get_bits_count(&gb)+7)>>3;
904                 uint8_t *buf;
905
906                 if ((uint64_t)watermark_width*4 > UINT_MAX/watermark_height)
907                     return -1;
908
909                 buf = av_malloc(buf_len);
910                 av_log(avctx, AV_LOG_DEBUG, "watermark size: %dx%d\n", watermark_width, watermark_height);
911                 av_log(avctx, AV_LOG_DEBUG, "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n", u1, u2, u3, u4, offset);
912                 if (uncompress(buf, &buf_len, extradata + 8 + offset, size - offset) != Z_OK) {
913                     av_log(avctx, AV_LOG_ERROR, "could not uncompress watermark logo\n");
914                     av_free(buf);
915                     return -1;
916                 }
917                 svq3->watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0);
918                 svq3->watermark_key = svq3->watermark_key << 16 | svq3->watermark_key;
919                 av_log(avctx, AV_LOG_DEBUG, "watermark key %#x\n", svq3->watermark_key);
920                 av_free(buf);
921 #else
922                 av_log(avctx, AV_LOG_ERROR, "this svq3 file contains watermark which need zlib support compiled in\n");
923                 return -1;
924 #endif
925             }
926         }
927
928         s->width  = avctx->width;
929         s->height = avctx->height;
930
931         if (ff_MPV_common_init(s) < 0)
932             return -1;
933
934         h->b_stride = 4*s->mb_width;
935
936         if (ff_h264_alloc_tables(h) < 0) {
937             av_log(avctx, AV_LOG_ERROR, "svq3 memory allocation failed\n");
938             return AVERROR(ENOMEM);
939         }
940     }
941
942     return 0;
943 }
944
945 static int svq3_decode_frame(AVCodecContext *avctx,
946                              void *data, int *data_size,
947                              AVPacket *avpkt)
948 {
949     const uint8_t *buf = avpkt->data;
950     SVQ3Context *svq3 = avctx->priv_data;
951     H264Context *h = &svq3->h;
952     MpegEncContext *s = &h->s;
953     int buf_size = avpkt->size;
954     int m, mb_type;
955
956     /* special case for last picture */
957     if (buf_size == 0) {
958         if (s->next_picture_ptr && !s->low_delay) {
959             *(AVFrame *) data = *(AVFrame *) &s->next_picture;
960             s->next_picture_ptr = NULL;
961             *data_size = sizeof(AVFrame);
962         }
963         return 0;
964     }
965
966     init_get_bits (&s->gb, buf, 8*buf_size);
967
968     s->mb_x = s->mb_y = h->mb_xy = 0;
969
970     if (svq3_decode_slice_header(avctx))
971         return -1;
972
973     s->pict_type = h->slice_type;
974     s->picture_number = h->slice_num;
975
976     if (avctx->debug&FF_DEBUG_PICT_INFO){
977         av_log(h->s.avctx, AV_LOG_DEBUG, "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
978                av_get_picture_type_char(s->pict_type), svq3->halfpel_flag, svq3->thirdpel_flag,
979                s->adaptive_quant, s->qscale, h->slice_num);
980     }
981
982     /* for skipping the frame */
983     s->current_picture.f.pict_type = s->pict_type;
984     s->current_picture.f.key_frame = (s->pict_type == AV_PICTURE_TYPE_I);
985
986     /* Skip B-frames if we do not have reference frames. */
987     if (s->last_picture_ptr == NULL && s->pict_type == AV_PICTURE_TYPE_B)
988         return 0;
989     if (  (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B)
990         ||(avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I)
991         || avctx->skip_frame >= AVDISCARD_ALL)
992         return 0;
993
994     if (s->next_p_frame_damaged) {
995         if (s->pict_type == AV_PICTURE_TYPE_B)
996             return 0;
997         else
998             s->next_p_frame_damaged = 0;
999     }
1000
1001     if (ff_h264_frame_start(h) < 0)
1002         return -1;
1003
1004     if (s->pict_type == AV_PICTURE_TYPE_B) {
1005         h->frame_num_offset = (h->slice_num - h->prev_frame_num);
1006
1007         if (h->frame_num_offset < 0) {
1008             h->frame_num_offset += 256;
1009         }
1010         if (h->frame_num_offset == 0 || h->frame_num_offset >= h->prev_frame_num_offset) {
1011             av_log(h->s.avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
1012             return -1;
1013         }
1014     } else {
1015         h->prev_frame_num = h->frame_num;
1016         h->frame_num = h->slice_num;
1017         h->prev_frame_num_offset = (h->frame_num - h->prev_frame_num);
1018
1019         if (h->prev_frame_num_offset < 0) {
1020             h->prev_frame_num_offset += 256;
1021         }
1022     }
1023
1024     for (m = 0; m < 2; m++){
1025         int i;
1026         for (i = 0; i < 4; i++){
1027             int j;
1028             for (j = -1; j < 4; j++)
1029                 h->ref_cache[m][scan8[0] + 8*i + j]= 1;
1030             if (i < 3)
1031                 h->ref_cache[m][scan8[0] + 8*i + j]= PART_NOT_AVAILABLE;
1032         }
1033     }
1034
1035     for (s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
1036         for (s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
1037             h->mb_xy = s->mb_x + s->mb_y*s->mb_stride;
1038
1039             if ( (get_bits_count(&s->gb) + 7) >= s->gb.size_in_bits &&
1040                 ((get_bits_count(&s->gb) & 7) == 0 || show_bits(&s->gb, (-get_bits_count(&s->gb) & 7)) == 0)) {
1041
1042                 skip_bits(&s->gb, svq3->next_slice_index - get_bits_count(&s->gb));
1043                 s->gb.size_in_bits = 8*buf_size;
1044
1045                 if (svq3_decode_slice_header(avctx))
1046                     return -1;
1047
1048                 /* TODO: support s->mb_skip_run */
1049             }
1050
1051             mb_type = svq3_get_ue_golomb(&s->gb);
1052
1053             if (s->pict_type == AV_PICTURE_TYPE_I) {
1054                 mb_type += 8;
1055             } else if (s->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4) {
1056                 mb_type += 4;
1057             }
1058             if ((unsigned)mb_type > 33 || svq3_decode_mb(svq3, mb_type)) {
1059                 av_log(h->s.avctx, AV_LOG_ERROR, "error while decoding MB %d %d\n", s->mb_x, s->mb_y);
1060                 return -1;
1061             }
1062
1063             if (mb_type != 0) {
1064                 ff_h264_hl_decode_mb (h);
1065             }
1066
1067             if (s->pict_type != AV_PICTURE_TYPE_B && !s->low_delay) {
1068                 s->current_picture.f.mb_type[s->mb_x + s->mb_y * s->mb_stride] =
1069                     (s->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
1070             }
1071         }
1072
1073         ff_draw_horiz_band(s, 16*s->mb_y, 16);
1074     }
1075
1076     ff_MPV_frame_end(s);
1077
1078     if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
1079         *(AVFrame *) data = *(AVFrame *) &s->current_picture;
1080     } else {
1081         *(AVFrame *) data = *(AVFrame *) &s->last_picture;
1082     }
1083
1084     /* Do not output the last pic after seeking. */
1085     if (s->last_picture_ptr || s->low_delay) {
1086         *data_size = sizeof(AVFrame);
1087     }
1088
1089     return buf_size;
1090 }
1091
1092 static int svq3_decode_end(AVCodecContext *avctx)
1093 {
1094     SVQ3Context *svq3 = avctx->priv_data;
1095     H264Context *h = &svq3->h;
1096     MpegEncContext *s = &h->s;
1097
1098     ff_h264_free_context(h);
1099
1100     ff_MPV_common_end(s);
1101
1102     return 0;
1103 }
1104
1105 AVCodec ff_svq3_decoder = {
1106     .name           = "svq3",
1107     .type           = AVMEDIA_TYPE_VIDEO,
1108     .id             = CODEC_ID_SVQ3,
1109     .priv_data_size = sizeof(SVQ3Context),
1110     .init           = svq3_decode_init,
1111     .close          = svq3_decode_end,
1112     .decode         = svq3_decode_frame,
1113     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | CODEC_CAP_DELAY,
1114     .long_name = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1115     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_NONE},
1116 };