]> git.sesse.net Git - ffmpeg/blob - libavcodec/svq3.c
vp9/x86: make filter_48/84_v work on 32-bit.
[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
43 #include <inttypes.h>
44
45 #include "libavutil/attributes.h"
46 #include "internal.h"
47 #include "avcodec.h"
48 #include "mpegutils.h"
49 #include "h264.h"
50
51 #include "h264data.h" // FIXME FIXME FIXME
52
53 #include "h264_mvpred.h"
54 #include "golomb.h"
55 #include "hpeldsp.h"
56 #include "rectangle.h"
57 #include "tpeldsp.h"
58 #include "vdpau_internal.h"
59
60 #if CONFIG_ZLIB
61 #include <zlib.h>
62 #endif
63
64 #include "svq1.h"
65 #include "svq3.h"
66
67 /**
68  * @file
69  * svq3 decoder.
70  */
71
72 typedef struct {
73     H264Context h;
74     HpelDSPContext hdsp;
75     TpelDSPContext tdsp;
76     H264Picture *cur_pic;
77     H264Picture *next_pic;
78     H264Picture *last_pic;
79     int halfpel_flag;
80     int thirdpel_flag;
81     int unknown_flag;
82     int next_slice_index;
83     uint32_t watermark_key;
84     uint8_t *buf;
85     int buf_size;
86     int adaptive_quant;
87     int next_p_frame_damaged;
88     int h_edge_pos;
89     int v_edge_pos;
90     int last_frame_output;
91 } SVQ3Context;
92
93 #define FULLPEL_MODE  1
94 #define HALFPEL_MODE  2
95 #define THIRDPEL_MODE 3
96 #define PREDICT_MODE  4
97
98 /* dual scan (from some older h264 draft)
99  * o-->o-->o   o
100  *         |  /|
101  * o   o   o / o
102  * | / |   |/  |
103  * o   o   o   o
104  *   /
105  * o-->o-->o-->o
106  */
107 static const uint8_t svq3_scan[16] = {
108     0 + 0 * 4, 1 + 0 * 4, 2 + 0 * 4, 2 + 1 * 4,
109     2 + 2 * 4, 3 + 0 * 4, 3 + 1 * 4, 3 + 2 * 4,
110     0 + 1 * 4, 0 + 2 * 4, 1 + 1 * 4, 1 + 2 * 4,
111     0 + 3 * 4, 1 + 3 * 4, 2 + 3 * 4, 3 + 3 * 4,
112 };
113
114 static const uint8_t luma_dc_zigzag_scan[16] = {
115     0 * 16 + 0 * 64, 1 * 16 + 0 * 64, 2 * 16 + 0 * 64, 0 * 16 + 2 * 64,
116     3 * 16 + 0 * 64, 0 * 16 + 1 * 64, 1 * 16 + 1 * 64, 2 * 16 + 1 * 64,
117     1 * 16 + 2 * 64, 2 * 16 + 2 * 64, 3 * 16 + 2 * 64, 0 * 16 + 3 * 64,
118     3 * 16 + 1 * 64, 1 * 16 + 3 * 64, 2 * 16 + 3 * 64, 3 * 16 + 3 * 64,
119 };
120
121 static const uint8_t svq3_pred_0[25][2] = {
122     { 0, 0 },
123     { 1, 0 }, { 0, 1 },
124     { 0, 2 }, { 1, 1 }, { 2, 0 },
125     { 3, 0 }, { 2, 1 }, { 1, 2 }, { 0, 3 },
126     { 0, 4 }, { 1, 3 }, { 2, 2 }, { 3, 1 }, { 4, 0 },
127     { 4, 1 }, { 3, 2 }, { 2, 3 }, { 1, 4 },
128     { 2, 4 }, { 3, 3 }, { 4, 2 },
129     { 4, 3 }, { 3, 4 },
130     { 4, 4 }
131 };
132
133 static const int8_t svq3_pred_1[6][6][5] = {
134     { { 2, -1, -1, -1, -1 }, { 2, 1, -1, -1, -1 }, { 1, 2, -1, -1, -1 },
135       { 2,  1, -1, -1, -1 }, { 1, 2, -1, -1, -1 }, { 1, 2, -1, -1, -1 } },
136     { { 0,  2, -1, -1, -1 }, { 0, 2,  1,  4,  3 }, { 0, 1,  2,  4,  3 },
137       { 0,  2,  1,  4,  3 }, { 2, 0,  1,  3,  4 }, { 0, 4,  2,  1,  3 } },
138     { { 2,  0, -1, -1, -1 }, { 2, 1,  0,  4,  3 }, { 1, 2,  4,  0,  3 },
139       { 2,  1,  0,  4,  3 }, { 2, 1,  4,  3,  0 }, { 1, 2,  4,  0,  3 } },
140     { { 2,  0, -1, -1, -1 }, { 2, 0,  1,  4,  3 }, { 1, 2,  0,  4,  3 },
141       { 2,  1,  0,  4,  3 }, { 2, 1,  3,  4,  0 }, { 2, 4,  1,  0,  3 } },
142     { { 0,  2, -1, -1, -1 }, { 0, 2,  1,  3,  4 }, { 1, 2,  3,  0,  4 },
143       { 2,  0,  1,  3,  4 }, { 2, 1,  3,  0,  4 }, { 2, 0,  4,  3,  1 } },
144     { { 0,  2, -1, -1, -1 }, { 0, 2,  4,  1,  3 }, { 1, 4,  2,  0,  3 },
145       { 4,  2,  0,  1,  3 }, { 2, 0,  1,  4,  3 }, { 4, 2,  1,  0,  3 } },
146 };
147
148 static const struct {
149     uint8_t run;
150     uint8_t level;
151 } svq3_dct_tables[2][16] = {
152     { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 0, 2 }, { 3, 1 }, { 4, 1 }, { 5, 1 },
153       { 0, 3 }, { 1, 2 }, { 2, 2 }, { 6, 1 }, { 7, 1 }, { 8, 1 }, { 9, 1 }, { 0, 4 } },
154     { { 0, 0 }, { 0, 1 }, { 1, 1 }, { 0, 2 }, { 2, 1 }, { 0, 3 }, { 0, 4 }, { 0, 5 },
155       { 3, 1 }, { 4, 1 }, { 1, 2 }, { 1, 3 }, { 0, 6 }, { 0, 7 }, { 0, 8 }, { 0, 9 } }
156 };
157
158 static const uint32_t svq3_dequant_coeff[32] = {
159      3881,  4351,  4890,  5481,   6154,   6914,   7761,   8718,
160      9781, 10987, 12339, 13828,  15523,  17435,  19561,  21873,
161     24552, 27656, 30847, 34870,  38807,  43747,  49103,  54683,
162     61694, 68745, 77615, 89113, 100253, 109366, 126635, 141533
163 };
164
165 static int svq3_decode_end(AVCodecContext *avctx);
166
167 void ff_svq3_luma_dc_dequant_idct_c(int16_t *output, int16_t *input, int qp)
168 {
169     const int qmul = svq3_dequant_coeff[qp];
170 #define stride 16
171     int i;
172     int temp[16];
173     static const uint8_t x_offset[4] = { 0, 1 * stride, 4 * stride, 5 * stride };
174
175     for (i = 0; i < 4; i++) {
176         const int z0 = 13 * (input[4 * i + 0] +      input[4 * i + 2]);
177         const int z1 = 13 * (input[4 * i + 0] -      input[4 * i + 2]);
178         const int z2 =  7 *  input[4 * i + 1] - 17 * input[4 * i + 3];
179         const int z3 = 17 *  input[4 * i + 1] +  7 * input[4 * i + 3];
180
181         temp[4 * i + 0] = z0 + z3;
182         temp[4 * i + 1] = z1 + z2;
183         temp[4 * i + 2] = z1 - z2;
184         temp[4 * i + 3] = z0 - z3;
185     }
186
187     for (i = 0; i < 4; i++) {
188         const int offset = x_offset[i];
189         const int z0     = 13 * (temp[4 * 0 + i] +      temp[4 * 2 + i]);
190         const int z1     = 13 * (temp[4 * 0 + i] -      temp[4 * 2 + i]);
191         const int z2     =  7 *  temp[4 * 1 + i] - 17 * temp[4 * 3 + i];
192         const int z3     = 17 *  temp[4 * 1 + i] +  7 * temp[4 * 3 + i];
193
194         output[stride *  0 + offset] = (z0 + z3) * qmul + 0x80000 >> 20;
195         output[stride *  2 + offset] = (z1 + z2) * qmul + 0x80000 >> 20;
196         output[stride *  8 + offset] = (z1 - z2) * qmul + 0x80000 >> 20;
197         output[stride * 10 + offset] = (z0 - z3) * qmul + 0x80000 >> 20;
198     }
199 }
200 #undef stride
201
202 void ff_svq3_add_idct_c(uint8_t *dst, int16_t *block,
203                         int stride, int qp, int dc)
204 {
205     const int qmul = svq3_dequant_coeff[qp];
206     int i;
207
208     if (dc) {
209         dc       = 13 * 13 * (dc == 1 ? 1538 * block[0]
210                                       : qmul * (block[0] >> 3) / 2);
211         block[0] = 0;
212     }
213
214     for (i = 0; i < 4; i++) {
215         const int z0 = 13 * (block[0 + 4 * i] +      block[2 + 4 * i]);
216         const int z1 = 13 * (block[0 + 4 * i] -      block[2 + 4 * i]);
217         const int z2 =  7 *  block[1 + 4 * i] - 17 * block[3 + 4 * i];
218         const int z3 = 17 *  block[1 + 4 * i] +  7 * block[3 + 4 * i];
219
220         block[0 + 4 * i] = z0 + z3;
221         block[1 + 4 * i] = z1 + z2;
222         block[2 + 4 * i] = z1 - z2;
223         block[3 + 4 * i] = z0 - z3;
224     }
225
226     for (i = 0; i < 4; i++) {
227         const int z0 = 13 * (block[i + 4 * 0] +      block[i + 4 * 2]);
228         const int z1 = 13 * (block[i + 4 * 0] -      block[i + 4 * 2]);
229         const int z2 =  7 *  block[i + 4 * 1] - 17 * block[i + 4 * 3];
230         const int z3 = 17 *  block[i + 4 * 1] +  7 * block[i + 4 * 3];
231         const int rr = (dc + 0x80000);
232
233         dst[i + stride * 0] = av_clip_uint8(dst[i + stride * 0] + ((z0 + z3) * qmul + rr >> 20));
234         dst[i + stride * 1] = av_clip_uint8(dst[i + stride * 1] + ((z1 + z2) * qmul + rr >> 20));
235         dst[i + stride * 2] = av_clip_uint8(dst[i + stride * 2] + ((z1 - z2) * qmul + rr >> 20));
236         dst[i + stride * 3] = av_clip_uint8(dst[i + stride * 3] + ((z0 - z3) * qmul + rr >> 20));
237     }
238
239     memset(block, 0, 16 * sizeof(int16_t));
240 }
241
242 static inline int svq3_decode_block(GetBitContext *gb, int16_t *block,
243                                     int index, const int type)
244 {
245     static const uint8_t *const scan_patterns[4] =
246     { luma_dc_zigzag_scan, zigzag_scan, svq3_scan, chroma_dc_scan };
247
248     int run, level, sign, limit;
249     unsigned vlc;
250     const int intra           = 3 * type >> 2;
251     const uint8_t *const scan = scan_patterns[type];
252
253     for (limit = (16 >> intra); index < 16; index = limit, limit += 8) {
254         for (; (vlc = svq3_get_ue_golomb(gb)) != 0; index++) {
255             if ((int32_t)vlc < 0)
256                 return -1;
257
258             sign     = (vlc & 1) ? 0 : -1;
259             vlc      = vlc + 1 >> 1;
260
261             if (type == 3) {
262                 if (vlc < 3) {
263                     run   = 0;
264                     level = vlc;
265                 } else if (vlc < 4) {
266                     run   = 1;
267                     level = 1;
268                 } else {
269                     run   = vlc & 0x3;
270                     level = (vlc + 9 >> 2) - run;
271                 }
272             } else {
273                 if (vlc < 16U) {
274                     run   = svq3_dct_tables[intra][vlc].run;
275                     level = svq3_dct_tables[intra][vlc].level;
276                 } else if (intra) {
277                     run   = vlc & 0x7;
278                     level = (vlc >> 3) + ((run == 0) ? 8 : ((run < 2) ? 2 : ((run < 5) ? 0 : -1)));
279                 } else {
280                     run   = vlc & 0xF;
281                     level = (vlc >> 4) + ((run == 0) ? 4 : ((run < 3) ? 2 : ((run < 10) ? 1 : 0)));
282                 }
283             }
284
285
286             if ((index += run) >= limit)
287                 return -1;
288
289             block[scan[index]] = (level ^ sign) - sign;
290         }
291
292         if (type != 2) {
293             break;
294         }
295     }
296
297     return 0;
298 }
299
300 static inline void svq3_mc_dir_part(SVQ3Context *s,
301                                     int x, int y, int width, int height,
302                                     int mx, int my, int dxy,
303                                     int thirdpel, int dir, int avg)
304 {
305     H264Context *h = &s->h;
306     const H264Picture *pic = (dir == 0) ? s->last_pic : s->next_pic;
307     uint8_t *src, *dest;
308     int i, emu = 0;
309     int blocksize = 2 - (width >> 3); // 16->0, 8->1, 4->2
310
311     mx += x;
312     my += y;
313
314     if (mx < 0 || mx >= s->h_edge_pos - width  - 1 ||
315         my < 0 || my >= s->v_edge_pos - height - 1) {
316         emu = 1;
317         mx = av_clip(mx, -16, s->h_edge_pos - width  + 15);
318         my = av_clip(my, -16, s->v_edge_pos - height + 15);
319     }
320
321     /* form component predictions */
322     dest = h->cur_pic.f.data[0] + x + y * h->linesize;
323     src  = pic->f.data[0] + mx + my * h->linesize;
324
325     if (emu) {
326         h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src,
327                                  h->linesize, h->linesize,
328                                  width + 1, height + 1,
329                                  mx, my, s->h_edge_pos, s->v_edge_pos);
330         src = h->edge_emu_buffer;
331     }
332     if (thirdpel)
333         (avg ? s->tdsp.avg_tpel_pixels_tab
334              : s->tdsp.put_tpel_pixels_tab)[dxy](dest, src, h->linesize,
335                                                  width, height);
336     else
337         (avg ? s->hdsp.avg_pixels_tab
338              : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src, h->linesize,
339                                                        height);
340
341     if (!(h->flags & CODEC_FLAG_GRAY)) {
342         mx     = mx + (mx < (int) x) >> 1;
343         my     = my + (my < (int) y) >> 1;
344         width  = width  >> 1;
345         height = height >> 1;
346         blocksize++;
347
348         for (i = 1; i < 3; i++) {
349             dest = h->cur_pic.f.data[i] + (x >> 1) + (y >> 1) * h->uvlinesize;
350             src  = pic->f.data[i] + mx + my * h->uvlinesize;
351
352             if (emu) {
353                 h->vdsp.emulated_edge_mc(h->edge_emu_buffer, src,
354                                          h->uvlinesize, h->uvlinesize,
355                                          width + 1, height + 1,
356                                          mx, my, (s->h_edge_pos >> 1),
357                                          s->v_edge_pos >> 1);
358                 src = h->edge_emu_buffer;
359             }
360             if (thirdpel)
361                 (avg ? s->tdsp.avg_tpel_pixels_tab
362                      : s->tdsp.put_tpel_pixels_tab)[dxy](dest, src,
363                                                          h->uvlinesize,
364                                                          width, height);
365             else
366                 (avg ? s->hdsp.avg_pixels_tab
367                      : s->hdsp.put_pixels_tab)[blocksize][dxy](dest, src,
368                                                                h->uvlinesize,
369                                                                height);
370         }
371     }
372 }
373
374 static inline int svq3_mc_dir(SVQ3Context *s, int size, int mode,
375                               int dir, int avg)
376 {
377     int i, j, k, mx, my, dx, dy, x, y;
378     H264Context *h          = &s->h;
379     const int part_width    = ((size & 5) == 4) ? 4 : 16 >> (size & 1);
380     const int part_height   = 16 >> ((unsigned)(size + 1) / 3);
381     const int extra_width   = (mode == PREDICT_MODE) ? -16 * 6 : 0;
382     const int h_edge_pos    = 6 * (s->h_edge_pos - part_width)  - extra_width;
383     const int v_edge_pos    = 6 * (s->v_edge_pos - part_height) - extra_width;
384
385     for (i = 0; i < 16; i += part_height)
386         for (j = 0; j < 16; j += part_width) {
387             const int b_xy = (4 * h->mb_x + (j >> 2)) +
388                              (4 * h->mb_y + (i >> 2)) * h->b_stride;
389             int dxy;
390             x = 16 * h->mb_x + j;
391             y = 16 * h->mb_y + i;
392             k = (j >> 2 & 1) + (i >> 1 & 2) +
393                 (j >> 1 & 4) + (i      & 8);
394
395             if (mode != PREDICT_MODE) {
396                 pred_motion(h, k, part_width >> 2, dir, 1, &mx, &my);
397             } else {
398                 mx = s->next_pic->motion_val[0][b_xy][0] << 1;
399                 my = s->next_pic->motion_val[0][b_xy][1] << 1;
400
401                 if (dir == 0) {
402                     mx = mx * h->frame_num_offset /
403                          h->prev_frame_num_offset + 1 >> 1;
404                     my = my * h->frame_num_offset /
405                          h->prev_frame_num_offset + 1 >> 1;
406                 } else {
407                     mx = mx * (h->frame_num_offset - h->prev_frame_num_offset) /
408                          h->prev_frame_num_offset + 1 >> 1;
409                     my = my * (h->frame_num_offset - h->prev_frame_num_offset) /
410                          h->prev_frame_num_offset + 1 >> 1;
411                 }
412             }
413
414             /* clip motion vector prediction to frame border */
415             mx = av_clip(mx, extra_width - 6 * x, h_edge_pos - 6 * x);
416             my = av_clip(my, extra_width - 6 * y, v_edge_pos - 6 * y);
417
418             /* get (optional) motion vector differential */
419             if (mode == PREDICT_MODE) {
420                 dx = dy = 0;
421             } else {
422                 dy = svq3_get_se_golomb(&h->gb);
423                 dx = svq3_get_se_golomb(&h->gb);
424
425                 if (dx == INVALID_VLC || dy == INVALID_VLC) {
426                     av_log(h->avctx, AV_LOG_ERROR, "invalid MV vlc\n");
427                     return -1;
428                 }
429             }
430
431             /* compute motion vector */
432             if (mode == THIRDPEL_MODE) {
433                 int fx, fy;
434                 mx  = (mx + 1 >> 1) + dx;
435                 my  = (my + 1 >> 1) + dy;
436                 fx  = (unsigned)(mx + 0x3000) / 3 - 0x1000;
437                 fy  = (unsigned)(my + 0x3000) / 3 - 0x1000;
438                 dxy = (mx - 3 * fx) + 4 * (my - 3 * fy);
439
440                 svq3_mc_dir_part(s, x, y, part_width, part_height,
441                                  fx, fy, dxy, 1, dir, avg);
442                 mx += mx;
443                 my += my;
444             } else if (mode == HALFPEL_MODE || mode == PREDICT_MODE) {
445                 mx  = (unsigned)(mx + 1 + 0x3000) / 3 + dx - 0x1000;
446                 my  = (unsigned)(my + 1 + 0x3000) / 3 + dy - 0x1000;
447                 dxy = (mx & 1) + 2 * (my & 1);
448
449                 svq3_mc_dir_part(s, x, y, part_width, part_height,
450                                  mx >> 1, my >> 1, dxy, 0, dir, avg);
451                 mx *= 3;
452                 my *= 3;
453             } else {
454                 mx = (unsigned)(mx + 3 + 0x6000) / 6 + dx - 0x1000;
455                 my = (unsigned)(my + 3 + 0x6000) / 6 + dy - 0x1000;
456
457                 svq3_mc_dir_part(s, x, y, part_width, part_height,
458                                  mx, my, 0, 0, dir, avg);
459                 mx *= 6;
460                 my *= 6;
461             }
462
463             /* update mv_cache */
464             if (mode != PREDICT_MODE) {
465                 int32_t mv = pack16to32(mx, my);
466
467                 if (part_height == 8 && i < 8) {
468                     AV_WN32A(h->mv_cache[dir][scan8[k] + 1 * 8], mv);
469
470                     if (part_width == 8 && j < 8)
471                         AV_WN32A(h->mv_cache[dir][scan8[k] + 1 + 1 * 8], mv);
472                 }
473                 if (part_width == 8 && j < 8)
474                     AV_WN32A(h->mv_cache[dir][scan8[k] + 1], mv);
475                 if (part_width == 4 || part_height == 4)
476                     AV_WN32A(h->mv_cache[dir][scan8[k]], mv);
477             }
478
479             /* write back motion vectors */
480             fill_rectangle(h->cur_pic.motion_val[dir][b_xy],
481                            part_width >> 2, part_height >> 2, h->b_stride,
482                            pack16to32(mx, my), 4);
483         }
484
485     return 0;
486 }
487
488 static int svq3_decode_mb(SVQ3Context *s, unsigned int mb_type)
489 {
490     H264Context *h = &s->h;
491     int i, j, k, m, dir, mode;
492     int cbp = 0;
493     uint32_t vlc;
494     int8_t *top, *left;
495     const int mb_xy         = h->mb_xy;
496     const int b_xy          = 4 * h->mb_x + 4 * h->mb_y * h->b_stride;
497
498     h->top_samples_available      = (h->mb_y == 0) ? 0x33FF : 0xFFFF;
499     h->left_samples_available     = (h->mb_x == 0) ? 0x5F5F : 0xFFFF;
500     h->topright_samples_available = 0xFFFF;
501
502     if (mb_type == 0) {           /* SKIP */
503         if (h->pict_type == AV_PICTURE_TYPE_P ||
504             s->next_pic->mb_type[mb_xy] == -1) {
505             svq3_mc_dir_part(s, 16 * h->mb_x, 16 * h->mb_y, 16, 16,
506                              0, 0, 0, 0, 0, 0);
507
508             if (h->pict_type == AV_PICTURE_TYPE_B)
509                 svq3_mc_dir_part(s, 16 * h->mb_x, 16 * h->mb_y, 16, 16,
510                                  0, 0, 0, 0, 1, 1);
511
512             mb_type = MB_TYPE_SKIP;
513         } else {
514             mb_type = FFMIN(s->next_pic->mb_type[mb_xy], 6);
515             if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 0, 0) < 0)
516                 return -1;
517             if (svq3_mc_dir(s, mb_type, PREDICT_MODE, 1, 1) < 0)
518                 return -1;
519
520             mb_type = MB_TYPE_16x16;
521         }
522     } else if (mb_type < 8) {     /* INTER */
523         if (s->thirdpel_flag && s->halfpel_flag == !get_bits1(&h->gb))
524             mode = THIRDPEL_MODE;
525         else if (s->halfpel_flag &&
526                  s->thirdpel_flag == !get_bits1(&h->gb))
527             mode = HALFPEL_MODE;
528         else
529             mode = FULLPEL_MODE;
530
531         /* fill caches */
532         /* note ref_cache should contain here:
533          *  ????????
534          *  ???11111
535          *  N??11111
536          *  N??11111
537          *  N??11111
538          */
539
540         for (m = 0; m < 2; m++) {
541             if (h->mb_x > 0 && h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6] != -1) {
542                 for (i = 0; i < 4; i++)
543                     AV_COPY32(h->mv_cache[m][scan8[0] - 1 + i * 8],
544                               h->cur_pic.motion_val[m][b_xy - 1 + i * h->b_stride]);
545             } else {
546                 for (i = 0; i < 4; i++)
547                     AV_ZERO32(h->mv_cache[m][scan8[0] - 1 + i * 8]);
548             }
549             if (h->mb_y > 0) {
550                 memcpy(h->mv_cache[m][scan8[0] - 1 * 8],
551                        h->cur_pic.motion_val[m][b_xy - h->b_stride],
552                        4 * 2 * sizeof(int16_t));
553                 memset(&h->ref_cache[m][scan8[0] - 1 * 8],
554                        (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1, 4);
555
556                 if (h->mb_x < h->mb_width - 1) {
557                     AV_COPY32(h->mv_cache[m][scan8[0] + 4 - 1 * 8],
558                               h->cur_pic.motion_val[m][b_xy - h->b_stride + 4]);
559                     h->ref_cache[m][scan8[0] + 4 - 1 * 8] =
560                         (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride + 1] + 6] == -1 ||
561                          h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride]] == -1) ? PART_NOT_AVAILABLE : 1;
562                 } else
563                     h->ref_cache[m][scan8[0] + 4 - 1 * 8] = PART_NOT_AVAILABLE;
564                 if (h->mb_x > 0) {
565                     AV_COPY32(h->mv_cache[m][scan8[0] - 1 - 1 * 8],
566                               h->cur_pic.motion_val[m][b_xy - h->b_stride - 1]);
567                     h->ref_cache[m][scan8[0] - 1 - 1 * 8] =
568                         (h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride - 1] + 3] == -1) ? PART_NOT_AVAILABLE : 1;
569                 } else
570                     h->ref_cache[m][scan8[0] - 1 - 1 * 8] = PART_NOT_AVAILABLE;
571             } else
572                 memset(&h->ref_cache[m][scan8[0] - 1 * 8 - 1],
573                        PART_NOT_AVAILABLE, 8);
574
575             if (h->pict_type != AV_PICTURE_TYPE_B)
576                 break;
577         }
578
579         /* decode motion vector(s) and form prediction(s) */
580         if (h->pict_type == AV_PICTURE_TYPE_P) {
581             if (svq3_mc_dir(s, mb_type - 1, mode, 0, 0) < 0)
582                 return -1;
583         } else {        /* AV_PICTURE_TYPE_B */
584             if (mb_type != 2) {
585                 if (svq3_mc_dir(s, 0, mode, 0, 0) < 0)
586                     return -1;
587             } else {
588                 for (i = 0; i < 4; i++)
589                     memset(h->cur_pic.motion_val[0][b_xy + i * h->b_stride],
590                            0, 4 * 2 * sizeof(int16_t));
591             }
592             if (mb_type != 1) {
593                 if (svq3_mc_dir(s, 0, mode, 1, mb_type == 3) < 0)
594                     return -1;
595             } else {
596                 for (i = 0; i < 4; i++)
597                     memset(h->cur_pic.motion_val[1][b_xy + i * h->b_stride],
598                            0, 4 * 2 * sizeof(int16_t));
599             }
600         }
601
602         mb_type = MB_TYPE_16x16;
603     } else if (mb_type == 8 || mb_type == 33) {   /* INTRA4x4 */
604         memset(h->intra4x4_pred_mode_cache, -1, 8 * 5 * sizeof(int8_t));
605
606         if (mb_type == 8) {
607             if (h->mb_x > 0) {
608                 for (i = 0; i < 4; i++)
609                     h->intra4x4_pred_mode_cache[scan8[0] - 1 + i * 8] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - 1] + 6 - i];
610                 if (h->intra4x4_pred_mode_cache[scan8[0] - 1] == -1)
611                     h->left_samples_available = 0x5F5F;
612             }
613             if (h->mb_y > 0) {
614                 h->intra4x4_pred_mode_cache[4 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 0];
615                 h->intra4x4_pred_mode_cache[5 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 1];
616                 h->intra4x4_pred_mode_cache[6 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 2];
617                 h->intra4x4_pred_mode_cache[7 + 8 * 0] = h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride] + 3];
618
619                 if (h->intra4x4_pred_mode_cache[4 + 8 * 0] == -1)
620                     h->top_samples_available = 0x33FF;
621             }
622
623             /* decode prediction codes for luma blocks */
624             for (i = 0; i < 16; i += 2) {
625                 vlc = svq3_get_ue_golomb(&h->gb);
626
627                 if (vlc >= 25U) {
628                     av_log(h->avctx, AV_LOG_ERROR,
629                            "luma prediction:%"PRIu32"\n", vlc);
630                     return -1;
631                 }
632
633                 left = &h->intra4x4_pred_mode_cache[scan8[i] - 1];
634                 top  = &h->intra4x4_pred_mode_cache[scan8[i] - 8];
635
636                 left[1] = svq3_pred_1[top[0] + 1][left[0] + 1][svq3_pred_0[vlc][0]];
637                 left[2] = svq3_pred_1[top[1] + 1][left[1] + 1][svq3_pred_0[vlc][1]];
638
639                 if (left[1] == -1 || left[2] == -1) {
640                     av_log(h->avctx, AV_LOG_ERROR, "weird prediction\n");
641                     return -1;
642                 }
643             }
644         } else {    /* mb_type == 33, DC_128_PRED block type */
645             for (i = 0; i < 4; i++)
646                 memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_PRED, 4);
647         }
648
649         write_back_intra_pred_mode(h);
650
651         if (mb_type == 8) {
652             ff_h264_check_intra4x4_pred_mode(h);
653
654             h->top_samples_available  = (h->mb_y == 0) ? 0x33FF : 0xFFFF;
655             h->left_samples_available = (h->mb_x == 0) ? 0x5F5F : 0xFFFF;
656         } else {
657             for (i = 0; i < 4; i++)
658                 memset(&h->intra4x4_pred_mode_cache[scan8[0] + 8 * i], DC_128_PRED, 4);
659
660             h->top_samples_available  = 0x33FF;
661             h->left_samples_available = 0x5F5F;
662         }
663
664         mb_type = MB_TYPE_INTRA4x4;
665     } else {                      /* INTRA16x16 */
666         dir = i_mb_type_info[mb_type - 8].pred_mode;
667         dir = (dir >> 1) ^ 3 * (dir & 1) ^ 1;
668
669         if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) < 0) {
670             av_log(h->avctx, AV_LOG_ERROR, "ff_h264_check_intra_pred_mode < 0\n");
671             return h->intra16x16_pred_mode;
672         }
673
674         cbp     = i_mb_type_info[mb_type - 8].cbp;
675         mb_type = MB_TYPE_INTRA16x16;
676     }
677
678     if (!IS_INTER(mb_type) && h->pict_type != AV_PICTURE_TYPE_I) {
679         for (i = 0; i < 4; i++)
680             memset(h->cur_pic.motion_val[0][b_xy + i * h->b_stride],
681                    0, 4 * 2 * sizeof(int16_t));
682         if (h->pict_type == AV_PICTURE_TYPE_B) {
683             for (i = 0; i < 4; i++)
684                 memset(h->cur_pic.motion_val[1][b_xy + i * h->b_stride],
685                        0, 4 * 2 * sizeof(int16_t));
686         }
687     }
688     if (!IS_INTRA4x4(mb_type)) {
689         memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy], DC_PRED, 8);
690     }
691     if (!IS_SKIP(mb_type) || h->pict_type == AV_PICTURE_TYPE_B) {
692         memset(h->non_zero_count_cache + 8, 0, 14 * 8 * sizeof(uint8_t));
693     }
694
695     if (!IS_INTRA16x16(mb_type) &&
696         (!IS_SKIP(mb_type) || h->pict_type == AV_PICTURE_TYPE_B)) {
697         if ((vlc = svq3_get_ue_golomb(&h->gb)) >= 48U){
698             av_log(h->avctx, AV_LOG_ERROR, "cbp_vlc=%"PRIu32"\n", vlc);
699             return -1;
700         }
701
702         cbp = IS_INTRA(mb_type) ? golomb_to_intra4x4_cbp[vlc]
703                                 : golomb_to_inter_cbp[vlc];
704     }
705     if (IS_INTRA16x16(mb_type) ||
706         (h->pict_type != AV_PICTURE_TYPE_I && s->adaptive_quant && cbp)) {
707         h->qscale += svq3_get_se_golomb(&h->gb);
708
709         if (h->qscale > 31u) {
710             av_log(h->avctx, AV_LOG_ERROR, "qscale:%d\n", h->qscale);
711             return -1;
712         }
713     }
714     if (IS_INTRA16x16(mb_type)) {
715         AV_ZERO128(h->mb_luma_dc[0] + 0);
716         AV_ZERO128(h->mb_luma_dc[0] + 8);
717         if (svq3_decode_block(&h->gb, h->mb_luma_dc[0], 0, 1)) {
718             av_log(h->avctx, AV_LOG_ERROR,
719                    "error while decoding intra luma dc\n");
720             return -1;
721         }
722     }
723
724     if (cbp) {
725         const int index = IS_INTRA16x16(mb_type) ? 1 : 0;
726         const int type  = ((h->qscale < 24 && IS_INTRA4x4(mb_type)) ? 2 : 1);
727
728         for (i = 0; i < 4; i++)
729             if ((cbp & (1 << i))) {
730                 for (j = 0; j < 4; j++) {
731                     k = index ? (1 * (j & 1) + 2 * (i & 1) +
732                                  2 * (j & 2) + 4 * (i & 2))
733                               : (4 * i + j);
734                     h->non_zero_count_cache[scan8[k]] = 1;
735
736                     if (svq3_decode_block(&h->gb, &h->mb[16 * k], index, type)) {
737                         av_log(h->avctx, AV_LOG_ERROR,
738                                "error while decoding block\n");
739                         return -1;
740                     }
741                 }
742             }
743
744         if ((cbp & 0x30)) {
745             for (i = 1; i < 3; ++i)
746                 if (svq3_decode_block(&h->gb, &h->mb[16 * 16 * i], 0, 3)) {
747                     av_log(h->avctx, AV_LOG_ERROR,
748                            "error while decoding chroma dc block\n");
749                     return -1;
750                 }
751
752             if ((cbp & 0x20)) {
753                 for (i = 1; i < 3; i++) {
754                     for (j = 0; j < 4; j++) {
755                         k                                 = 16 * i + j;
756                         h->non_zero_count_cache[scan8[k]] = 1;
757
758                         if (svq3_decode_block(&h->gb, &h->mb[16 * k], 1, 1)) {
759                             av_log(h->avctx, AV_LOG_ERROR,
760                                    "error while decoding chroma ac block\n");
761                             return -1;
762                         }
763                     }
764                 }
765             }
766         }
767     }
768
769     h->cbp                              = cbp;
770     h->cur_pic.mb_type[mb_xy] = mb_type;
771
772     if (IS_INTRA(mb_type))
773         h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8, 1);
774
775     return 0;
776 }
777
778 static int svq3_decode_slice_header(AVCodecContext *avctx)
779 {
780     SVQ3Context *s = avctx->priv_data;
781     H264Context *h    = &s->h;
782     const int mb_xy   = h->mb_xy;
783     int i, header;
784     unsigned slice_id;
785
786     header = get_bits(&h->gb, 8);
787
788     if (((header & 0x9F) != 1 && (header & 0x9F) != 2) || (header & 0x60) == 0) {
789         /* TODO: what? */
790         av_log(avctx, AV_LOG_ERROR, "unsupported slice header (%02X)\n", header);
791         return -1;
792     } else {
793         int length = header >> 5 & 3;
794
795         s->next_slice_index = get_bits_count(&h->gb) +
796                               8 * show_bits(&h->gb, 8 * length) +
797                               8 * length;
798
799         if (s->next_slice_index > h->gb.size_in_bits) {
800             av_log(avctx, AV_LOG_ERROR, "slice after bitstream end\n");
801             return -1;
802         }
803
804         h->gb.size_in_bits = s->next_slice_index - 8 * (length - 1);
805         skip_bits(&h->gb, 8);
806
807         if (s->watermark_key) {
808             uint32_t header = AV_RL32(&h->gb.buffer[(get_bits_count(&h->gb) >> 3) + 1]);
809             AV_WL32(&h->gb.buffer[(get_bits_count(&h->gb) >> 3) + 1],
810                     header ^ s->watermark_key);
811         }
812         if (length > 0) {
813             memmove((uint8_t *) &h->gb.buffer[get_bits_count(&h->gb) >> 3],
814                     &h->gb.buffer[h->gb.size_in_bits >> 3], length - 1);
815         }
816         skip_bits_long(&h->gb, 0);
817     }
818
819     if ((slice_id = svq3_get_ue_golomb(&h->gb)) >= 3) {
820         av_log(h->avctx, AV_LOG_ERROR, "illegal slice type %u \n", slice_id);
821         return -1;
822     }
823
824     h->slice_type = golomb_to_pict_type[slice_id];
825
826     if ((header & 0x9F) == 2) {
827         i              = (h->mb_num < 64) ? 6 : (1 + av_log2(h->mb_num - 1));
828         h->mb_skip_run = get_bits(&h->gb, i) -
829                          (h->mb_y * h->mb_width + h->mb_x);
830     } else {
831         skip_bits1(&h->gb);
832         h->mb_skip_run = 0;
833     }
834
835     h->slice_num      = get_bits(&h->gb, 8);
836     h->qscale         = get_bits(&h->gb, 5);
837     s->adaptive_quant = get_bits1(&h->gb);
838
839     /* unknown fields */
840     skip_bits1(&h->gb);
841
842     if (s->unknown_flag)
843         skip_bits1(&h->gb);
844
845     skip_bits1(&h->gb);
846     skip_bits(&h->gb, 2);
847
848     if (skip_1stop_8data_bits(&h->gb) < 0)
849         return AVERROR_INVALIDDATA;
850
851     /* reset intra predictors and invalidate motion vector references */
852     if (h->mb_x > 0) {
853         memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - 1] + 3,
854                -1, 4 * sizeof(int8_t));
855         memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - h->mb_x],
856                -1, 8 * sizeof(int8_t) * h->mb_x);
857     }
858     if (h->mb_y > 0) {
859         memset(h->intra4x4_pred_mode + h->mb2br_xy[mb_xy - h->mb_stride],
860                -1, 8 * sizeof(int8_t) * (h->mb_width - h->mb_x));
861
862         if (h->mb_x > 0)
863             h->intra4x4_pred_mode[h->mb2br_xy[mb_xy - h->mb_stride - 1] + 3] = -1;
864     }
865
866     return 0;
867 }
868
869 static av_cold int svq3_decode_init(AVCodecContext *avctx)
870 {
871     SVQ3Context *s = avctx->priv_data;
872     H264Context *h = &s->h;
873     int m;
874     unsigned char *extradata;
875     unsigned char *extradata_end;
876     unsigned int size;
877     int marker_found = 0;
878     int ret;
879
880     s->cur_pic  = av_mallocz(sizeof(*s->cur_pic));
881     s->last_pic = av_mallocz(sizeof(*s->last_pic));
882     s->next_pic = av_mallocz(sizeof(*s->next_pic));
883     if (!s->next_pic || !s->last_pic || !s->cur_pic) {
884         ret = AVERROR(ENOMEM);
885         goto fail;
886     }
887
888     if ((ret = ff_h264_decode_init(avctx)) < 0)
889         goto fail;
890
891     ff_hpeldsp_init(&s->hdsp, avctx->flags);
892     ff_tpeldsp_init(&s->tdsp);
893
894     h->flags           = avctx->flags;
895     h->is_complex      = 1;
896     h->sps.chroma_format_idc = 1;
897     h->picture_structure = PICT_FRAME;
898     avctx->pix_fmt     = AV_PIX_FMT_YUVJ420P;
899     avctx->color_range = AVCOL_RANGE_JPEG;
900
901     h->chroma_qp[0] = h->chroma_qp[1] = 4;
902     h->chroma_x_shift = h->chroma_y_shift = 1;
903
904     s->halfpel_flag  = 1;
905     s->thirdpel_flag = 1;
906     s->unknown_flag  = 0;
907
908     /* prowl for the "SEQH" marker in the extradata */
909     extradata     = (unsigned char *)avctx->extradata;
910     extradata_end = avctx->extradata + avctx->extradata_size;
911     if (extradata) {
912         for (m = 0; m + 8 < avctx->extradata_size; m++) {
913             if (!memcmp(extradata, "SEQH", 4)) {
914                 marker_found = 1;
915                 break;
916             }
917             extradata++;
918         }
919     }
920
921     /* if a match was found, parse the extra data */
922     if (marker_found) {
923         GetBitContext gb;
924         int frame_size_code;
925
926         size = AV_RB32(&extradata[4]);
927         if (size > extradata_end - extradata - 8) {
928             ret = AVERROR_INVALIDDATA;
929             goto fail;
930         }
931         init_get_bits(&gb, extradata + 8, size * 8);
932
933         /* 'frame size code' and optional 'width, height' */
934         frame_size_code = get_bits(&gb, 3);
935         switch (frame_size_code) {
936         case 0:
937             avctx->width  = 160;
938             avctx->height = 120;
939             break;
940         case 1:
941             avctx->width  = 128;
942             avctx->height =  96;
943             break;
944         case 2:
945             avctx->width  = 176;
946             avctx->height = 144;
947             break;
948         case 3:
949             avctx->width  = 352;
950             avctx->height = 288;
951             break;
952         case 4:
953             avctx->width  = 704;
954             avctx->height = 576;
955             break;
956         case 5:
957             avctx->width  = 240;
958             avctx->height = 180;
959             break;
960         case 6:
961             avctx->width  = 320;
962             avctx->height = 240;
963             break;
964         case 7:
965             avctx->width  = get_bits(&gb, 12);
966             avctx->height = get_bits(&gb, 12);
967             break;
968         }
969
970         s->halfpel_flag  = get_bits1(&gb);
971         s->thirdpel_flag = get_bits1(&gb);
972
973         /* unknown fields */
974         skip_bits1(&gb);
975         skip_bits1(&gb);
976         skip_bits1(&gb);
977         skip_bits1(&gb);
978
979         h->low_delay = get_bits1(&gb);
980
981         /* unknown field */
982         skip_bits1(&gb);
983
984         if (skip_1stop_8data_bits(&gb) < 0) {
985             ret = AVERROR_INVALIDDATA;
986             goto fail;
987         }
988
989         s->unknown_flag  = get_bits1(&gb);
990         avctx->has_b_frames = !h->low_delay;
991         if (s->unknown_flag) {
992 #if CONFIG_ZLIB
993             unsigned watermark_width  = svq3_get_ue_golomb(&gb);
994             unsigned watermark_height = svq3_get_ue_golomb(&gb);
995             int u1                    = svq3_get_ue_golomb(&gb);
996             int u2                    = get_bits(&gb, 8);
997             int u3                    = get_bits(&gb, 2);
998             int u4                    = svq3_get_ue_golomb(&gb);
999             unsigned long buf_len     = watermark_width *
1000                                         watermark_height * 4;
1001             int offset                = get_bits_count(&gb) + 7 >> 3;
1002             uint8_t *buf;
1003
1004             if (watermark_height <= 0 ||
1005                 (uint64_t)watermark_width * 4 > UINT_MAX / watermark_height) {
1006                 ret = -1;
1007                 goto fail;
1008             }
1009
1010             buf = av_malloc(buf_len);
1011             av_log(avctx, AV_LOG_DEBUG, "watermark size: %ux%u\n",
1012                    watermark_width, watermark_height);
1013             av_log(avctx, AV_LOG_DEBUG,
1014                    "u1: %x u2: %x u3: %x compressed data size: %d offset: %d\n",
1015                    u1, u2, u3, u4, offset);
1016             if (uncompress(buf, &buf_len, extradata + 8 + offset,
1017                            size - offset) != Z_OK) {
1018                 av_log(avctx, AV_LOG_ERROR,
1019                        "could not uncompress watermark logo\n");
1020                 av_free(buf);
1021                 ret = -1;
1022                 goto fail;
1023             }
1024             s->watermark_key = ff_svq1_packet_checksum(buf, buf_len, 0);
1025             s->watermark_key = s->watermark_key << 16 | s->watermark_key;
1026             av_log(avctx, AV_LOG_DEBUG,
1027                    "watermark key %#"PRIx32"\n", s->watermark_key);
1028             av_free(buf);
1029 #else
1030             av_log(avctx, AV_LOG_ERROR,
1031                    "this svq3 file contains watermark which need zlib support compiled in\n");
1032             ret = -1;
1033             goto fail;
1034 #endif
1035         }
1036     }
1037
1038     h->width  = avctx->width;
1039     h->height = avctx->height;
1040     h->mb_width  = (h->width + 15) / 16;
1041     h->mb_height = (h->height + 15) / 16;
1042     h->mb_stride = h->mb_width + 1;
1043     h->mb_num    = h->mb_width * h->mb_height;
1044     h->b_stride = 4 * h->mb_width;
1045     s->h_edge_pos = h->mb_width * 16;
1046     s->v_edge_pos = h->mb_height * 16;
1047
1048     if ((ret = ff_h264_alloc_tables(h)) < 0) {
1049         av_log(avctx, AV_LOG_ERROR, "svq3 memory allocation failed\n");
1050         goto fail;
1051     }
1052
1053     return 0;
1054 fail:
1055     svq3_decode_end(avctx);
1056     return ret;
1057 }
1058
1059 static void free_picture(AVCodecContext *avctx, H264Picture *pic)
1060 {
1061     int i;
1062     for (i = 0; i < 2; i++) {
1063         av_buffer_unref(&pic->motion_val_buf[i]);
1064         av_buffer_unref(&pic->ref_index_buf[i]);
1065     }
1066     av_buffer_unref(&pic->mb_type_buf);
1067
1068     av_frame_unref(&pic->f);
1069 }
1070
1071 static int get_buffer(AVCodecContext *avctx, H264Picture *pic)
1072 {
1073     SVQ3Context *s = avctx->priv_data;
1074     H264Context *h = &s->h;
1075     const int big_mb_num    = h->mb_stride * (h->mb_height + 1) + 1;
1076     const int mb_array_size = h->mb_stride * h->mb_height;
1077     const int b4_stride     = h->mb_width * 4 + 1;
1078     const int b4_array_size = b4_stride * h->mb_height * 4;
1079     int ret;
1080
1081     if (!pic->motion_val_buf[0]) {
1082         int i;
1083
1084         pic->mb_type_buf = av_buffer_allocz((big_mb_num + h->mb_stride) * sizeof(uint32_t));
1085         if (!pic->mb_type_buf)
1086             return AVERROR(ENOMEM);
1087         pic->mb_type = (uint32_t*)pic->mb_type_buf->data + 2 * h->mb_stride + 1;
1088
1089         for (i = 0; i < 2; i++) {
1090             pic->motion_val_buf[i] = av_buffer_allocz(2 * (b4_array_size + 4) * sizeof(int16_t));
1091             pic->ref_index_buf[i]  = av_buffer_allocz(4 * mb_array_size);
1092             if (!pic->motion_val_buf[i] || !pic->ref_index_buf[i]) {
1093                 ret = AVERROR(ENOMEM);
1094                 goto fail;
1095             }
1096
1097             pic->motion_val[i] = (int16_t (*)[2])pic->motion_val_buf[i]->data + 4;
1098             pic->ref_index[i]  = pic->ref_index_buf[i]->data;
1099         }
1100     }
1101     pic->reference = !(h->pict_type == AV_PICTURE_TYPE_B);
1102
1103     ret = ff_get_buffer(avctx, &pic->f,
1104                         pic->reference ? AV_GET_BUFFER_FLAG_REF : 0);
1105     if (ret < 0)
1106         goto fail;
1107
1108     if (!h->edge_emu_buffer) {
1109         h->edge_emu_buffer = av_mallocz(pic->f.linesize[0] * 17);
1110         if (!h->edge_emu_buffer)
1111             return AVERROR(ENOMEM);
1112     }
1113
1114     h->linesize   = pic->f.linesize[0];
1115     h->uvlinesize = pic->f.linesize[1];
1116
1117     return 0;
1118 fail:
1119     free_picture(avctx, pic);
1120     return ret;
1121 }
1122
1123 static int svq3_decode_frame(AVCodecContext *avctx, void *data,
1124                              int *got_frame, AVPacket *avpkt)
1125 {
1126     SVQ3Context *s     = avctx->priv_data;
1127     H264Context *h     = &s->h;
1128     int buf_size       = avpkt->size;
1129     int left;
1130     uint8_t *buf;
1131     int ret, m, i;
1132
1133     /* special case for last picture */
1134     if (buf_size == 0) {
1135         if (s->next_pic->f.data[0] && !h->low_delay && !s->last_frame_output) {
1136             ret = av_frame_ref(data, &s->next_pic->f);
1137             if (ret < 0)
1138                 return ret;
1139             s->last_frame_output = 1;
1140             *got_frame          = 1;
1141         }
1142         return 0;
1143     }
1144
1145     h->mb_x = h->mb_y = h->mb_xy = 0;
1146
1147     if (s->watermark_key) {
1148         av_fast_padded_malloc(&s->buf, &s->buf_size, buf_size);
1149         if (!s->buf)
1150             return AVERROR(ENOMEM);
1151         memcpy(s->buf, avpkt->data, buf_size);
1152         buf = s->buf;
1153     } else {
1154         buf = avpkt->data;
1155     }
1156
1157     init_get_bits(&h->gb, buf, 8 * buf_size);
1158
1159     if (svq3_decode_slice_header(avctx))
1160         return -1;
1161
1162     h->pict_type = h->slice_type;
1163
1164     if (h->pict_type != AV_PICTURE_TYPE_B)
1165         FFSWAP(H264Picture*, s->next_pic, s->last_pic);
1166
1167     av_frame_unref(&s->cur_pic->f);
1168
1169     /* for skipping the frame */
1170     s->cur_pic->f.pict_type = h->pict_type;
1171     s->cur_pic->f.key_frame = (h->pict_type == AV_PICTURE_TYPE_I);
1172
1173     ret = get_buffer(avctx, s->cur_pic);
1174     if (ret < 0)
1175         return ret;
1176
1177     h->cur_pic_ptr = s->cur_pic;
1178     av_frame_unref(&h->cur_pic.f);
1179     memcpy(&h->cur_pic.tf, &s->cur_pic->tf, sizeof(h->cur_pic) - offsetof(H264Picture, tf));
1180     ret = av_frame_ref(&h->cur_pic.f, &s->cur_pic->f);
1181     if (ret < 0)
1182         return ret;
1183
1184     for (i = 0; i < 16; i++) {
1185         h->block_offset[i]           = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * h->linesize * ((scan8[i] - scan8[0]) >> 3);
1186         h->block_offset[48 + i]      = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * h->linesize * ((scan8[i] - scan8[0]) >> 3);
1187     }
1188     for (i = 0; i < 16; i++) {
1189         h->block_offset[16 + i]      =
1190         h->block_offset[32 + i]      = (4 * ((scan8[i] - scan8[0]) & 7)) + 4 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
1191         h->block_offset[48 + 16 + i] =
1192         h->block_offset[48 + 32 + i] = (4 * ((scan8[i] - scan8[0]) & 7)) + 8 * h->uvlinesize * ((scan8[i] - scan8[0]) >> 3);
1193     }
1194
1195     if (h->pict_type != AV_PICTURE_TYPE_I) {
1196         if (!s->last_pic->f.data[0]) {
1197             av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1198             av_frame_unref(&s->last_pic->f);
1199             ret = get_buffer(avctx, s->last_pic);
1200             if (ret < 0)
1201                 return ret;
1202             memset(s->last_pic->f.data[0], 0, avctx->height * s->last_pic->f.linesize[0]);
1203             memset(s->last_pic->f.data[1], 0x80, (avctx->height / 2) *
1204                    s->last_pic->f.linesize[1]);
1205             memset(s->last_pic->f.data[2], 0x80, (avctx->height / 2) *
1206                    s->last_pic->f.linesize[2]);
1207         }
1208
1209         if (h->pict_type == AV_PICTURE_TYPE_B && !s->next_pic->f.data[0]) {
1210             av_log(avctx, AV_LOG_ERROR, "Missing reference frame.\n");
1211             av_frame_unref(&s->next_pic->f);
1212             ret = get_buffer(avctx, s->next_pic);
1213             if (ret < 0)
1214                 return ret;
1215             memset(s->next_pic->f.data[0], 0, avctx->height * s->next_pic->f.linesize[0]);
1216             memset(s->next_pic->f.data[1], 0x80, (avctx->height / 2) *
1217                    s->next_pic->f.linesize[1]);
1218             memset(s->next_pic->f.data[2], 0x80, (avctx->height / 2) *
1219                    s->next_pic->f.linesize[2]);
1220         }
1221     }
1222
1223     if (avctx->debug & FF_DEBUG_PICT_INFO)
1224         av_log(h->avctx, AV_LOG_DEBUG,
1225                "%c hpel:%d, tpel:%d aqp:%d qp:%d, slice_num:%02X\n",
1226                av_get_picture_type_char(h->pict_type),
1227                s->halfpel_flag, s->thirdpel_flag,
1228                s->adaptive_quant, h->qscale, h->slice_num);
1229
1230     if (avctx->skip_frame >= AVDISCARD_NONREF && h->pict_type == AV_PICTURE_TYPE_B ||
1231         avctx->skip_frame >= AVDISCARD_NONKEY && h->pict_type != AV_PICTURE_TYPE_I ||
1232         avctx->skip_frame >= AVDISCARD_ALL)
1233         return 0;
1234
1235     if (s->next_p_frame_damaged) {
1236         if (h->pict_type == AV_PICTURE_TYPE_B)
1237             return 0;
1238         else
1239             s->next_p_frame_damaged = 0;
1240     }
1241
1242     if (h->pict_type == AV_PICTURE_TYPE_B) {
1243         h->frame_num_offset = h->slice_num - h->prev_frame_num;
1244
1245         if (h->frame_num_offset < 0)
1246             h->frame_num_offset += 256;
1247         if (h->frame_num_offset == 0 ||
1248             h->frame_num_offset >= h->prev_frame_num_offset) {
1249             av_log(h->avctx, AV_LOG_ERROR, "error in B-frame picture id\n");
1250             return -1;
1251         }
1252     } else {
1253         h->prev_frame_num        = h->frame_num;
1254         h->frame_num             = h->slice_num;
1255         h->prev_frame_num_offset = h->frame_num - h->prev_frame_num;
1256
1257         if (h->prev_frame_num_offset < 0)
1258             h->prev_frame_num_offset += 256;
1259     }
1260
1261     for (m = 0; m < 2; m++) {
1262         int i;
1263         for (i = 0; i < 4; i++) {
1264             int j;
1265             for (j = -1; j < 4; j++)
1266                 h->ref_cache[m][scan8[0] + 8 * i + j] = 1;
1267             if (i < 3)
1268                 h->ref_cache[m][scan8[0] + 8 * i + j] = PART_NOT_AVAILABLE;
1269         }
1270     }
1271
1272     for (h->mb_y = 0; h->mb_y < h->mb_height; h->mb_y++) {
1273         for (h->mb_x = 0; h->mb_x < h->mb_width; h->mb_x++) {
1274             unsigned mb_type;
1275             h->mb_xy = h->mb_x + h->mb_y * h->mb_stride;
1276
1277             if ((get_bits_count(&h->gb) + 7) >= h->gb.size_in_bits &&
1278                 ((get_bits_count(&h->gb) & 7) == 0 ||
1279                  show_bits(&h->gb, -get_bits_count(&h->gb) & 7) == 0)) {
1280                 skip_bits(&h->gb, s->next_slice_index - get_bits_count(&h->gb));
1281                 h->gb.size_in_bits = 8 * buf_size;
1282
1283                 if (svq3_decode_slice_header(avctx))
1284                     return -1;
1285
1286                 /* TODO: support s->mb_skip_run */
1287             }
1288
1289             mb_type = svq3_get_ue_golomb(&h->gb);
1290
1291             if (h->pict_type == AV_PICTURE_TYPE_I)
1292                 mb_type += 8;
1293             else if (h->pict_type == AV_PICTURE_TYPE_B && mb_type >= 4)
1294                 mb_type += 4;
1295             if (mb_type > 33 || svq3_decode_mb(s, mb_type)) {
1296                 av_log(h->avctx, AV_LOG_ERROR,
1297                        "error while decoding MB %d %d\n", h->mb_x, h->mb_y);
1298                 return -1;
1299             }
1300
1301             if (mb_type != 0 || h->cbp)
1302                 ff_h264_hl_decode_mb(h);
1303
1304             if (h->pict_type != AV_PICTURE_TYPE_B && !h->low_delay)
1305                 h->cur_pic.mb_type[h->mb_x + h->mb_y * h->mb_stride] =
1306                     (h->pict_type == AV_PICTURE_TYPE_P && mb_type < 8) ? (mb_type - 1) : -1;
1307         }
1308
1309         ff_draw_horiz_band(avctx, &s->cur_pic->f,
1310                            s->last_pic->f.data[0] ? &s->last_pic->f : NULL,
1311                            16 * h->mb_y, 16, h->picture_structure, 0,
1312                            h->low_delay);
1313     }
1314
1315     left = buf_size*8 - get_bits_count(&h->gb);
1316
1317     if (h->mb_y != h->mb_height || h->mb_x != h->mb_width) {
1318         av_log(avctx, AV_LOG_INFO, "frame num %d incomplete pic x %d y %d left %d\n", avctx->frame_number, h->mb_y, h->mb_x, left);
1319         //av_hex_dump(stderr, buf+buf_size-8, 8);
1320     }
1321
1322     if (left < 0) {
1323         av_log(avctx, AV_LOG_ERROR, "frame num %d left %d\n", avctx->frame_number, left);
1324         return -1;
1325     }
1326
1327     if (h->pict_type == AV_PICTURE_TYPE_B || h->low_delay)
1328         ret = av_frame_ref(data, &s->cur_pic->f);
1329     else if (s->last_pic->f.data[0])
1330         ret = av_frame_ref(data, &s->last_pic->f);
1331     if (ret < 0)
1332         return ret;
1333
1334     /* Do not output the last pic after seeking. */
1335     if (s->last_pic->f.data[0] || h->low_delay)
1336         *got_frame = 1;
1337
1338     if (h->pict_type != AV_PICTURE_TYPE_B) {
1339         FFSWAP(H264Picture*, s->cur_pic, s->next_pic);
1340     } else {
1341         av_frame_unref(&s->cur_pic->f);
1342     }
1343
1344     return buf_size;
1345 }
1346
1347 static av_cold int svq3_decode_end(AVCodecContext *avctx)
1348 {
1349     SVQ3Context *s = avctx->priv_data;
1350     H264Context *h = &s->h;
1351
1352     free_picture(avctx, s->cur_pic);
1353     free_picture(avctx, s->next_pic);
1354     free_picture(avctx, s->last_pic);
1355     av_freep(&s->cur_pic);
1356     av_freep(&s->next_pic);
1357     av_freep(&s->last_pic);
1358
1359     av_frame_unref(&h->cur_pic.f);
1360
1361     ff_h264_free_context(h);
1362
1363     av_freep(&s->buf);
1364     s->buf_size = 0;
1365     av_freep(&h->edge_emu_buffer);
1366
1367     return 0;
1368 }
1369
1370 AVCodec ff_svq3_decoder = {
1371     .name           = "svq3",
1372     .long_name      = NULL_IF_CONFIG_SMALL("Sorenson Vector Quantizer 3 / Sorenson Video 3 / SVQ3"),
1373     .type           = AVMEDIA_TYPE_VIDEO,
1374     .id             = AV_CODEC_ID_SVQ3,
1375     .priv_data_size = sizeof(SVQ3Context),
1376     .init           = svq3_decode_init,
1377     .close          = svq3_decode_end,
1378     .decode         = svq3_decode_frame,
1379     .capabilities   = CODEC_CAP_DRAW_HORIZ_BAND |
1380                       CODEC_CAP_DR1             |
1381                       CODEC_CAP_DELAY,
1382     .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUVJ420P,
1383                                                      AV_PIX_FMT_NONE},
1384 };