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
72typedef 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 */
107static 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
114static 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
121static 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
133static 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
148static 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
158static 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
165static int svq3_decode_end(AVCodecContext *avctx);
166
167void 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
202void 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
242static 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
300static 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
374static 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
488static 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
778static 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
869static 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;
1054fail:
1055    svq3_decode_end(avctx);
1056    return ret;
1057}
1058
1059static 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
1071static 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;
1118fail:
1119    free_picture(avctx, pic);
1120    return ret;
1121}
1122
1123static 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    h->cur_pic     = *s->cur_pic;
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
1347static 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
1370AVCodec 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};
1385