]> git.sesse.net Git - ffmpeg/blob - libavcodec/diracdec.c
mips/hevcdsp: fix string concatenation on macros
[ffmpeg] / libavcodec / diracdec.c
1 /*
2  * Copyright (C) 2007 Marco Gerards <marco@gnu.org>
3  * Copyright (C) 2009 David Conrad
4  * Copyright (C) 2011 Jordi Ortiz
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22
23 /**
24  * @file
25  * Dirac Decoder
26  * @author Marco Gerards <marco@gnu.org>, David Conrad, Jordi Ortiz <nenjordi@gmail.com>
27  */
28
29 #include "avcodec.h"
30 #include "get_bits.h"
31 #include "bytestream.h"
32 #include "internal.h"
33 #include "golomb.h"
34 #include "dirac_arith.h"
35 #include "mpeg12data.h"
36 #include "libavcodec/mpegvideo.h"
37 #include "mpegvideoencdsp.h"
38 #include "dirac_dwt.h"
39 #include "dirac.h"
40 #include "diracdsp.h"
41 #include "videodsp.h"
42
43 /**
44  * The spec limits the number of wavelet decompositions to 4 for both
45  * level 1 (VC-2) and 128 (long-gop default).
46  * 5 decompositions is the maximum before >16-bit buffers are needed.
47  * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting
48  * the others to 4 decompositions (or 3 for the fidelity filter).
49  *
50  * We use this instead of MAX_DECOMPOSITIONS to save some memory.
51  */
52 #define MAX_DWT_LEVELS 5
53
54 /**
55  * The spec limits this to 3 for frame coding, but in practice can be as high as 6
56  */
57 #define MAX_REFERENCE_FRAMES 8
58 #define MAX_DELAY 5         /* limit for main profile for frame coding (TODO: field coding) */
59 #define MAX_FRAMES (MAX_REFERENCE_FRAMES + MAX_DELAY + 1)
60 #define MAX_QUANT 68        /* max quant for VC-2 */
61 #define MAX_BLOCKSIZE 32    /* maximum xblen/yblen we support */
62
63 /**
64  * DiracBlock->ref flags, if set then the block does MC from the given ref
65  */
66 #define DIRAC_REF_MASK_REF1   1
67 #define DIRAC_REF_MASK_REF2   2
68 #define DIRAC_REF_MASK_GLOBAL 4
69
70 /**
71  * Value of Picture.reference when Picture is not a reference picture, but
72  * is held for delayed output.
73  */
74 #define DELAYED_PIC_REF 4
75
76 #define CALC_PADDING(size, depth)                       \
77     (((size + (1 << depth) - 1) >> depth) << depth)
78
79 #define DIVRNDUP(a, b) (((a) + (b) - 1) / (b))
80
81 typedef struct {
82     AVFrame *avframe;
83     int interpolated[3];    /* 1 if hpel[] is valid */
84     uint8_t *hpel[3][4];
85     uint8_t *hpel_base[3][4];
86 } DiracFrame;
87
88 typedef struct {
89     union {
90         int16_t mv[2][2];
91         int16_t dc[3];
92     } u; /* anonymous unions aren't in C99 :( */
93     uint8_t ref;
94 } DiracBlock;
95
96 typedef struct SubBand {
97     int level;
98     int orientation;
99     int stride;
100     int width;
101     int height;
102     int quant;
103     IDWTELEM *ibuf;
104     struct SubBand *parent;
105
106     /* for low delay */
107     unsigned length;
108     const uint8_t *coeff_data;
109 } SubBand;
110
111 typedef struct Plane {
112     int width;
113     int height;
114     ptrdiff_t stride;
115
116     int idwt_width;
117     int idwt_height;
118     int idwt_stride;
119     IDWTELEM *idwt_buf;
120     IDWTELEM *idwt_buf_base;
121     IDWTELEM *idwt_tmp;
122
123     /* block length */
124     uint8_t xblen;
125     uint8_t yblen;
126     /* block separation (block n+1 starts after this many pixels in block n) */
127     uint8_t xbsep;
128     uint8_t ybsep;
129     /* amount of overspill on each edge (half of the overlap between blocks) */
130     uint8_t xoffset;
131     uint8_t yoffset;
132
133     SubBand band[MAX_DWT_LEVELS][4];
134 } Plane;
135
136 typedef struct DiracContext {
137     AVCodecContext *avctx;
138     MpegvideoEncDSPContext mpvencdsp;
139     VideoDSPContext vdsp;
140     DiracDSPContext diracdsp;
141     GetBitContext gb;
142     dirac_source_params source;
143     int seen_sequence_header;
144     int frame_number;           /* number of the next frame to display       */
145     Plane plane[3];
146     int chroma_x_shift;
147     int chroma_y_shift;
148
149     int zero_res;               /* zero residue flag                         */
150     int is_arith;               /* whether coeffs use arith or golomb coding */
151     int low_delay;              /* use the low delay syntax                  */
152     int globalmc_flag;          /* use global motion compensation            */
153     int num_refs;               /* number of reference pictures              */
154
155     /* wavelet decoding */
156     unsigned wavelet_depth;     /* depth of the IDWT                         */
157     unsigned wavelet_idx;
158
159     /**
160      * schroedinger older than 1.0.8 doesn't store
161      * quant delta if only one codebook exists in a band
162      */
163     unsigned old_delta_quant;
164     unsigned codeblock_mode;
165
166     struct {
167         unsigned width;
168         unsigned height;
169     } codeblock[MAX_DWT_LEVELS+1];
170
171     struct {
172         unsigned num_x;         /* number of horizontal slices               */
173         unsigned num_y;         /* number of vertical slices                 */
174         AVRational bytes;       /* average bytes per slice                   */
175         uint8_t quant[MAX_DWT_LEVELS][4]; /* [DIRAC_STD] E.1 */
176     } lowdelay;
177
178     struct {
179         int pan_tilt[2];        /* pan/tilt vector                           */
180         int zrs[2][2];          /* zoom/rotate/shear matrix                  */
181         int perspective[2];     /* perspective vector                        */
182         unsigned zrs_exp;
183         unsigned perspective_exp;
184     } globalmc[2];
185
186     /* motion compensation */
187     uint8_t mv_precision;       /* [DIRAC_STD] REFS_WT_PRECISION             */
188     int16_t weight[2];          /* [DIRAC_STD] REF1_WT and REF2_WT           */
189     unsigned weight_log2denom;  /* [DIRAC_STD] REFS_WT_PRECISION             */
190
191     int blwidth;                /* number of blocks (horizontally)           */
192     int blheight;               /* number of blocks (vertically)             */
193     int sbwidth;                /* number of superblocks (horizontally)      */
194     int sbheight;               /* number of superblocks (vertically)        */
195
196     uint8_t *sbsplit;
197     DiracBlock *blmotion;
198
199     uint8_t *edge_emu_buffer[4];
200     uint8_t *edge_emu_buffer_base;
201
202     uint16_t *mctmp;            /* buffer holding the MC data multiplied by OBMC weights */
203     uint8_t *mcscratch;
204     int buffer_stride;
205
206     DECLARE_ALIGNED(16, uint8_t, obmc_weight)[3][MAX_BLOCKSIZE*MAX_BLOCKSIZE];
207
208     void (*put_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h);
209     void (*avg_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h);
210     void (*add_obmc)(uint16_t *dst, const uint8_t *src, int stride, const uint8_t *obmc_weight, int yblen);
211     dirac_weight_func weight_func;
212     dirac_biweight_func biweight_func;
213
214     DiracFrame *current_picture;
215     DiracFrame *ref_pics[2];
216
217     DiracFrame *ref_frames[MAX_REFERENCE_FRAMES+1];
218     DiracFrame *delay_frames[MAX_DELAY+1];
219     DiracFrame all_frames[MAX_FRAMES];
220 } DiracContext;
221
222 /**
223  * Dirac Specification ->
224  * Parse code values. 9.6.1 Table 9.1
225  */
226 enum dirac_parse_code {
227     pc_seq_header         = 0x00,
228     pc_eos                = 0x10,
229     pc_aux_data           = 0x20,
230     pc_padding            = 0x30,
231 };
232
233 enum dirac_subband {
234     subband_ll = 0,
235     subband_hl = 1,
236     subband_lh = 2,
237     subband_hh = 3,
238     subband_nb,
239 };
240
241 static const uint8_t default_qmat[][4][4] = {
242     { { 5,  3,  3,  0}, { 0,  4,  4,  1}, { 0,  5,  5,  2}, { 0,  6,  6,  3} },
243     { { 4,  2,  2,  0}, { 0,  4,  4,  2}, { 0,  5,  5,  3}, { 0,  7,  7,  5} },
244     { { 5,  3,  3,  0}, { 0,  4,  4,  1}, { 0,  5,  5,  2}, { 0,  6,  6,  3} },
245     { { 8,  4,  4,  0}, { 0,  4,  4,  0}, { 0,  4,  4,  0}, { 0,  4,  4,  0} },
246     { { 8,  4,  4,  0}, { 0,  4,  4,  0}, { 0,  4,  4,  0}, { 0,  4,  4,  0} },
247     { { 0,  4,  4,  8}, { 0,  8,  8, 12}, { 0, 13, 13, 17}, { 0, 17, 17, 21} },
248     { { 3,  1,  1,  0}, { 0,  4,  4,  2}, { 0,  6,  6,  5}, { 0,  9,  9,  7} },
249 };
250
251 static const int qscale_tab[MAX_QUANT+1] = {
252     4,     5,     6,     7,     8,    10,    11,    13,
253     16,    19,    23,    27,    32,    38,    45,    54,
254     64,    76,    91,   108,   128,   152,   181,   215,
255     256,   304,   362,   431,   512,   609,   724,   861,
256     1024,  1218,  1448,  1722,  2048,  2435,  2896,  3444,
257     4096,  4871,  5793,  6889,  8192,  9742, 11585, 13777,
258     16384, 19484, 23170, 27554, 32768, 38968, 46341, 55109,
259     65536, 77936
260 };
261
262 static const int qoffset_intra_tab[MAX_QUANT+1] = {
263     1,     2,     3,     4,     4,     5,     6,     7,
264     8,    10,    12,    14,    16,    19,    23,    27,
265     32,    38,    46,    54,    64,    76,    91,   108,
266     128,   152,   181,   216,   256,   305,   362,   431,
267     512,   609,   724,   861,  1024,  1218,  1448,  1722,
268     2048,  2436,  2897,  3445,  4096,  4871,  5793,  6889,
269     8192,  9742, 11585, 13777, 16384, 19484, 23171, 27555,
270     32768, 38968
271 };
272
273 static const int qoffset_inter_tab[MAX_QUANT+1] = {
274     1,     2,     2,     3,     3,     4,     4,     5,
275     6,     7,     9,    10,    12,    14,    17,    20,
276     24,    29,    34,    41,    48,    57,    68,    81,
277     96,   114,   136,   162,   192,   228,   272,   323,
278     384,   457,   543,   646,   768,   913,  1086,  1292,
279     1536,  1827,  2172,  2583,  3072,  3653,  4344,  5166,
280     6144,  7307,  8689, 10333, 12288, 14613, 17378, 20666,
281     24576, 29226
282 };
283
284 /* magic number division by 3 from schroedinger */
285 static inline int divide3(int x)
286 {
287     return ((x+1)*21845 + 10922) >> 16;
288 }
289
290 static DiracFrame *remove_frame(DiracFrame *framelist[], int picnum)
291 {
292     DiracFrame *remove_pic = NULL;
293     int i, remove_idx = -1;
294
295     for (i = 0; framelist[i]; i++)
296         if (framelist[i]->avframe->display_picture_number == picnum) {
297             remove_pic = framelist[i];
298             remove_idx = i;
299         }
300
301     if (remove_pic)
302         for (i = remove_idx; framelist[i]; i++)
303             framelist[i] = framelist[i+1];
304
305     return remove_pic;
306 }
307
308 static int add_frame(DiracFrame *framelist[], int maxframes, DiracFrame *frame)
309 {
310     int i;
311     for (i = 0; i < maxframes; i++)
312         if (!framelist[i]) {
313             framelist[i] = frame;
314             return 0;
315         }
316     return -1;
317 }
318
319 static int alloc_sequence_buffers(DiracContext *s)
320 {
321     int sbwidth  = DIVRNDUP(s->source.width,  4);
322     int sbheight = DIVRNDUP(s->source.height, 4);
323     int i, w, h, top_padding;
324
325     /* todo: think more about this / use or set Plane here */
326     for (i = 0; i < 3; i++) {
327         int max_xblen = MAX_BLOCKSIZE >> (i ? s->chroma_x_shift : 0);
328         int max_yblen = MAX_BLOCKSIZE >> (i ? s->chroma_y_shift : 0);
329         w = s->source.width  >> (i ? s->chroma_x_shift : 0);
330         h = s->source.height >> (i ? s->chroma_y_shift : 0);
331
332         /* we allocate the max we support here since num decompositions can
333          * change from frame to frame. Stride is aligned to 16 for SIMD, and
334          * 1<<MAX_DWT_LEVELS top padding to avoid if(y>0) in arith decoding
335          * MAX_BLOCKSIZE padding for MC: blocks can spill up to half of that
336          * on each side */
337         top_padding = FFMAX(1<<MAX_DWT_LEVELS, max_yblen/2);
338         w = FFALIGN(CALC_PADDING(w, MAX_DWT_LEVELS), 8); /* FIXME: Should this be 16 for SSE??? */
339         h = top_padding + CALC_PADDING(h, MAX_DWT_LEVELS) + max_yblen/2;
340
341         s->plane[i].idwt_buf_base = av_mallocz_array((w+max_xblen), h * sizeof(IDWTELEM));
342         s->plane[i].idwt_tmp      = av_malloc_array((w+16), sizeof(IDWTELEM));
343         s->plane[i].idwt_buf      = s->plane[i].idwt_buf_base + top_padding*w;
344         if (!s->plane[i].idwt_buf_base || !s->plane[i].idwt_tmp)
345             return AVERROR(ENOMEM);
346     }
347
348     /* fixme: allocate using real stride here */
349     s->sbsplit  = av_malloc_array(sbwidth, sbheight);
350     s->blmotion = av_malloc_array(sbwidth, sbheight * 16 * sizeof(*s->blmotion));
351
352     if (!s->sbsplit || !s->blmotion)
353         return AVERROR(ENOMEM);
354     return 0;
355 }
356
357 static int alloc_buffers(DiracContext *s, int stride)
358 {
359     int w = s->source.width;
360     int h = s->source.height;
361
362     av_assert0(stride >= w);
363     stride += 64;
364
365     if (s->buffer_stride >= stride)
366         return 0;
367     s->buffer_stride = 0;
368
369     av_freep(&s->edge_emu_buffer_base);
370     memset(s->edge_emu_buffer, 0, sizeof(s->edge_emu_buffer));
371     av_freep(&s->mctmp);
372     av_freep(&s->mcscratch);
373
374     s->edge_emu_buffer_base = av_malloc_array(stride, MAX_BLOCKSIZE);
375
376     s->mctmp     = av_malloc_array((stride+MAX_BLOCKSIZE), (h+MAX_BLOCKSIZE) * sizeof(*s->mctmp));
377     s->mcscratch = av_malloc_array(stride, MAX_BLOCKSIZE);
378
379     if (!s->edge_emu_buffer_base || !s->mctmp || !s->mcscratch)
380         return AVERROR(ENOMEM);
381
382     s->buffer_stride = stride;
383     return 0;
384 }
385
386 static void free_sequence_buffers(DiracContext *s)
387 {
388     int i, j, k;
389
390     for (i = 0; i < MAX_FRAMES; i++) {
391         if (s->all_frames[i].avframe->data[0]) {
392             av_frame_unref(s->all_frames[i].avframe);
393             memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
394         }
395
396         for (j = 0; j < 3; j++)
397             for (k = 1; k < 4; k++)
398                 av_freep(&s->all_frames[i].hpel_base[j][k]);
399     }
400
401     memset(s->ref_frames, 0, sizeof(s->ref_frames));
402     memset(s->delay_frames, 0, sizeof(s->delay_frames));
403
404     for (i = 0; i < 3; i++) {
405         av_freep(&s->plane[i].idwt_buf_base);
406         av_freep(&s->plane[i].idwt_tmp);
407     }
408
409     s->buffer_stride = 0;
410     av_freep(&s->sbsplit);
411     av_freep(&s->blmotion);
412     av_freep(&s->edge_emu_buffer_base);
413
414     av_freep(&s->mctmp);
415     av_freep(&s->mcscratch);
416 }
417
418 static av_cold int dirac_decode_init(AVCodecContext *avctx)
419 {
420     DiracContext *s = avctx->priv_data;
421     int i;
422
423     s->avctx = avctx;
424     s->frame_number = -1;
425
426     ff_diracdsp_init(&s->diracdsp);
427     ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
428     ff_videodsp_init(&s->vdsp, 8);
429
430     for (i = 0; i < MAX_FRAMES; i++) {
431         s->all_frames[i].avframe = av_frame_alloc();
432         if (!s->all_frames[i].avframe) {
433             while (i > 0)
434                 av_frame_free(&s->all_frames[--i].avframe);
435             return AVERROR(ENOMEM);
436         }
437     }
438
439     return 0;
440 }
441
442 static void dirac_decode_flush(AVCodecContext *avctx)
443 {
444     DiracContext *s = avctx->priv_data;
445     free_sequence_buffers(s);
446     s->seen_sequence_header = 0;
447     s->frame_number = -1;
448 }
449
450 static av_cold int dirac_decode_end(AVCodecContext *avctx)
451 {
452     DiracContext *s = avctx->priv_data;
453     int i;
454
455     dirac_decode_flush(avctx);
456     for (i = 0; i < MAX_FRAMES; i++)
457         av_frame_free(&s->all_frames[i].avframe);
458
459     return 0;
460 }
461
462 #define SIGN_CTX(x) (CTX_SIGN_ZERO + ((x) > 0) - ((x) < 0))
463
464 static inline void coeff_unpack_arith(DiracArith *c, int qfactor, int qoffset,
465                                       SubBand *b, IDWTELEM *buf, int x, int y)
466 {
467     int coeff, sign;
468     int sign_pred = 0;
469     int pred_ctx = CTX_ZPZN_F1;
470
471     /* Check if the parent subband has a 0 in the corresponding position */
472     if (b->parent)
473         pred_ctx += !!b->parent->ibuf[b->parent->stride * (y>>1) + (x>>1)] << 1;
474
475     if (b->orientation == subband_hl)
476         sign_pred = buf[-b->stride];
477
478     /* Determine if the pixel has only zeros in its neighbourhood */
479     if (x) {
480         pred_ctx += !(buf[-1] | buf[-b->stride] | buf[-1-b->stride]);
481         if (b->orientation == subband_lh)
482             sign_pred = buf[-1];
483     } else {
484         pred_ctx += !buf[-b->stride];
485     }
486
487     coeff = dirac_get_arith_uint(c, pred_ctx, CTX_COEFF_DATA);
488     if (coeff) {
489         coeff = (coeff * qfactor + qoffset + 2) >> 2;
490         sign  = dirac_get_arith_bit(c, SIGN_CTX(sign_pred));
491         coeff = (coeff ^ -sign) + sign;
492     }
493     *buf = coeff;
494 }
495
496 static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset)
497 {
498     int sign, coeff;
499
500     coeff = svq3_get_ue_golomb(gb);
501     if (coeff) {
502         coeff = (coeff * qfactor + qoffset + 2) >> 2;
503         sign  = get_bits1(gb);
504         coeff = (coeff ^ -sign) + sign;
505     }
506     return coeff;
507 }
508
509 /**
510  * Decode the coeffs in the rectangle defined by left, right, top, bottom
511  * [DIRAC_STD] 13.4.3.2 Codeblock unpacking loop. codeblock()
512  */
513 static inline void codeblock(DiracContext *s, SubBand *b,
514                              GetBitContext *gb, DiracArith *c,
515                              int left, int right, int top, int bottom,
516                              int blockcnt_one, int is_arith)
517 {
518     int x, y, zero_block;
519     int qoffset, qfactor;
520     IDWTELEM *buf;
521
522     /* check for any coded coefficients in this codeblock */
523     if (!blockcnt_one) {
524         if (is_arith)
525             zero_block = dirac_get_arith_bit(c, CTX_ZERO_BLOCK);
526         else
527             zero_block = get_bits1(gb);
528
529         if (zero_block)
530             return;
531     }
532
533     if (s->codeblock_mode && !(s->old_delta_quant && blockcnt_one)) {
534         int quant = b->quant;
535         if (is_arith)
536             quant += dirac_get_arith_int(c, CTX_DELTA_Q_F, CTX_DELTA_Q_DATA);
537         else
538             quant += dirac_get_se_golomb(gb);
539         if (quant < 0) {
540             av_log(s->avctx, AV_LOG_ERROR, "Invalid quant\n");
541             return;
542         }
543         b->quant = quant;
544     }
545
546     b->quant = FFMIN(b->quant, MAX_QUANT);
547
548     qfactor = qscale_tab[b->quant];
549     /* TODO: context pointer? */
550     if (!s->num_refs)
551         qoffset = qoffset_intra_tab[b->quant];
552     else
553         qoffset = qoffset_inter_tab[b->quant];
554
555     buf = b->ibuf + top * b->stride;
556     for (y = top; y < bottom; y++) {
557         for (x = left; x < right; x++) {
558             /* [DIRAC_STD] 13.4.4 Subband coefficients. coeff_unpack() */
559             if (is_arith)
560                 coeff_unpack_arith(c, qfactor, qoffset, b, buf+x, x, y);
561             else
562                 buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset);
563         }
564         buf += b->stride;
565     }
566 }
567
568 /**
569  * Dirac Specification ->
570  * 13.3 intra_dc_prediction(band)
571  */
572 static inline void intra_dc_prediction(SubBand *b)
573 {
574     IDWTELEM *buf = b->ibuf;
575     int x, y;
576
577     for (x = 1; x < b->width; x++)
578         buf[x] += buf[x-1];
579     buf += b->stride;
580
581     for (y = 1; y < b->height; y++) {
582         buf[0] += buf[-b->stride];
583
584         for (x = 1; x < b->width; x++) {
585             int pred = buf[x - 1] + buf[x - b->stride] + buf[x - b->stride-1];
586             buf[x]  += divide3(pred);
587         }
588         buf += b->stride;
589     }
590 }
591
592 /**
593  * Dirac Specification ->
594  * 13.4.2 Non-skipped subbands.  subband_coeffs()
595  */
596 static av_always_inline void decode_subband_internal(DiracContext *s, SubBand *b, int is_arith)
597 {
598     int cb_x, cb_y, left, right, top, bottom;
599     DiracArith c;
600     GetBitContext gb;
601     int cb_width  = s->codeblock[b->level + (b->orientation != subband_ll)].width;
602     int cb_height = s->codeblock[b->level + (b->orientation != subband_ll)].height;
603     int blockcnt_one = (cb_width + cb_height) == 2;
604
605     if (!b->length)
606         return;
607
608     init_get_bits8(&gb, b->coeff_data, b->length);
609
610     if (is_arith)
611         ff_dirac_init_arith_decoder(&c, &gb, b->length);
612
613     top = 0;
614     for (cb_y = 0; cb_y < cb_height; cb_y++) {
615         bottom = (b->height * (cb_y+1LL)) / cb_height;
616         left = 0;
617         for (cb_x = 0; cb_x < cb_width; cb_x++) {
618             right = (b->width * (cb_x+1LL)) / cb_width;
619             codeblock(s, b, &gb, &c, left, right, top, bottom, blockcnt_one, is_arith);
620             left = right;
621         }
622         top = bottom;
623     }
624
625     if (b->orientation == subband_ll && s->num_refs == 0)
626         intra_dc_prediction(b);
627 }
628
629 static int decode_subband_arith(AVCodecContext *avctx, void *b)
630 {
631     DiracContext *s = avctx->priv_data;
632     decode_subband_internal(s, b, 1);
633     return 0;
634 }
635
636 static int decode_subband_golomb(AVCodecContext *avctx, void *arg)
637 {
638     DiracContext *s = avctx->priv_data;
639     SubBand **b     = arg;
640     decode_subband_internal(s, *b, 0);
641     return 0;
642 }
643
644 /**
645  * Dirac Specification ->
646  * [DIRAC_STD] 13.4.1 core_transform_data()
647  */
648 static void decode_component(DiracContext *s, int comp)
649 {
650     AVCodecContext *avctx = s->avctx;
651     SubBand *bands[3*MAX_DWT_LEVELS+1];
652     enum dirac_subband orientation;
653     int level, num_bands = 0;
654
655     /* Unpack all subbands at all levels. */
656     for (level = 0; level < s->wavelet_depth; level++) {
657         for (orientation = !!level; orientation < 4; orientation++) {
658             SubBand *b = &s->plane[comp].band[level][orientation];
659             bands[num_bands++] = b;
660
661             align_get_bits(&s->gb);
662             /* [DIRAC_STD] 13.4.2 subband() */
663             b->length = svq3_get_ue_golomb(&s->gb);
664             if (b->length) {
665                 b->quant = svq3_get_ue_golomb(&s->gb);
666                 align_get_bits(&s->gb);
667                 b->coeff_data = s->gb.buffer + get_bits_count(&s->gb)/8;
668                 b->length = FFMIN(b->length, FFMAX(get_bits_left(&s->gb)/8, 0));
669                 skip_bits_long(&s->gb, b->length*8);
670             }
671         }
672         /* arithmetic coding has inter-level dependencies, so we can only execute one level at a time */
673         if (s->is_arith)
674             avctx->execute(avctx, decode_subband_arith, &s->plane[comp].band[level][!!level],
675                            NULL, 4-!!level, sizeof(SubBand));
676     }
677     /* golomb coding has no inter-level dependencies, so we can execute all subbands in parallel */
678     if (!s->is_arith)
679         avctx->execute(avctx, decode_subband_golomb, bands, NULL, num_bands, sizeof(SubBand*));
680 }
681
682 /* [DIRAC_STD] 13.5.5.2 Luma slice subband data. luma_slice_band(level,orient,sx,sy) --> if b2 == NULL */
683 /* [DIRAC_STD] 13.5.5.3 Chroma slice subband data. chroma_slice_band(level,orient,sx,sy) --> if b2 != NULL */
684 static void lowdelay_subband(DiracContext *s, GetBitContext *gb, int quant,
685                              int slice_x, int slice_y, int bits_end,
686                              SubBand *b1, SubBand *b2)
687 {
688     int left   = b1->width  * slice_x    / s->lowdelay.num_x;
689     int right  = b1->width  *(slice_x+1) / s->lowdelay.num_x;
690     int top    = b1->height * slice_y    / s->lowdelay.num_y;
691     int bottom = b1->height *(slice_y+1) / s->lowdelay.num_y;
692
693     int qfactor = qscale_tab[FFMIN(quant, MAX_QUANT)];
694     int qoffset = qoffset_intra_tab[FFMIN(quant, MAX_QUANT)];
695
696     IDWTELEM *buf1 =      b1->ibuf + top * b1->stride;
697     IDWTELEM *buf2 = b2 ? b2->ibuf + top * b2->stride : NULL;
698     int x, y;
699     /* we have to constantly check for overread since the spec explicitly
700        requires this, with the meaning that all remaining coeffs are set to 0 */
701     if (get_bits_count(gb) >= bits_end)
702         return;
703
704     for (y = top; y < bottom; y++) {
705         for (x = left; x < right; x++) {
706             buf1[x] = coeff_unpack_golomb(gb, qfactor, qoffset);
707             if (get_bits_count(gb) >= bits_end)
708                 return;
709             if (buf2) {
710                 buf2[x] = coeff_unpack_golomb(gb, qfactor, qoffset);
711                 if (get_bits_count(gb) >= bits_end)
712                     return;
713             }
714         }
715         buf1 += b1->stride;
716         if (buf2)
717             buf2 += b2->stride;
718     }
719 }
720
721 struct lowdelay_slice {
722     GetBitContext gb;
723     int slice_x;
724     int slice_y;
725     int bytes;
726 };
727
728
729 /**
730  * Dirac Specification ->
731  * 13.5.2 Slices. slice(sx,sy)
732  */
733 static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg)
734 {
735     DiracContext *s = avctx->priv_data;
736     struct lowdelay_slice *slice = arg;
737     GetBitContext *gb = &slice->gb;
738     enum dirac_subband orientation;
739     int level, quant, chroma_bits, chroma_end;
740
741     int quant_base  = get_bits(gb, 7); /*[DIRAC_STD] qindex */
742     int length_bits = av_log2(8 * slice->bytes)+1;
743     int luma_bits   = get_bits_long(gb, length_bits);
744     int luma_end    = get_bits_count(gb) + FFMIN(luma_bits, get_bits_left(gb));
745
746     /* [DIRAC_STD] 13.5.5.2 luma_slice_band */
747     for (level = 0; level < s->wavelet_depth; level++)
748         for (orientation = !!level; orientation < 4; orientation++) {
749             quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0);
750             lowdelay_subband(s, gb, quant, slice->slice_x, slice->slice_y, luma_end,
751                              &s->plane[0].band[level][orientation], NULL);
752         }
753
754     /* consume any unused bits from luma */
755     skip_bits_long(gb, get_bits_count(gb) - luma_end);
756
757     chroma_bits = 8*slice->bytes - 7 - length_bits - luma_bits;
758     chroma_end  = get_bits_count(gb) + FFMIN(chroma_bits, get_bits_left(gb));
759     /* [DIRAC_STD] 13.5.5.3 chroma_slice_band */
760     for (level = 0; level < s->wavelet_depth; level++)
761         for (orientation = !!level; orientation < 4; orientation++) {
762             quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0);
763             lowdelay_subband(s, gb, quant, slice->slice_x, slice->slice_y, chroma_end,
764                              &s->plane[1].band[level][orientation],
765                              &s->plane[2].band[level][orientation]);
766         }
767
768     return 0;
769 }
770
771 /**
772  * Dirac Specification ->
773  * 13.5.1 low_delay_transform_data()
774  */
775 static int decode_lowdelay(DiracContext *s)
776 {
777     AVCodecContext *avctx = s->avctx;
778     int slice_x, slice_y, bytes, bufsize;
779     const uint8_t *buf;
780     struct lowdelay_slice *slices;
781     int slice_num = 0;
782
783     slices = av_mallocz_array(s->lowdelay.num_x, s->lowdelay.num_y * sizeof(struct lowdelay_slice));
784     if (!slices)
785         return AVERROR(ENOMEM);
786
787     align_get_bits(&s->gb);
788     /*[DIRAC_STD] 13.5.2 Slices. slice(sx,sy) */
789     buf = s->gb.buffer + get_bits_count(&s->gb)/8;
790     bufsize = get_bits_left(&s->gb);
791
792     for (slice_y = 0; bufsize > 0 && slice_y < s->lowdelay.num_y; slice_y++)
793         for (slice_x = 0; bufsize > 0 && slice_x < s->lowdelay.num_x; slice_x++) {
794             bytes = (slice_num+1) * s->lowdelay.bytes.num / s->lowdelay.bytes.den
795                 - slice_num    * s->lowdelay.bytes.num / s->lowdelay.bytes.den;
796
797             slices[slice_num].bytes   = bytes;
798             slices[slice_num].slice_x = slice_x;
799             slices[slice_num].slice_y = slice_y;
800             init_get_bits(&slices[slice_num].gb, buf, bufsize);
801             slice_num++;
802
803             buf     += bytes;
804             if (bufsize/8 >= bytes)
805                 bufsize -= bytes*8;
806             else
807                 bufsize = 0;
808         }
809
810     avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num,
811                    sizeof(struct lowdelay_slice)); /* [DIRAC_STD] 13.5.2 Slices */
812     intra_dc_prediction(&s->plane[0].band[0][0]);  /* [DIRAC_STD] 13.3 intra_dc_prediction() */
813     intra_dc_prediction(&s->plane[1].band[0][0]);  /* [DIRAC_STD] 13.3 intra_dc_prediction() */
814     intra_dc_prediction(&s->plane[2].band[0][0]);  /* [DIRAC_STD] 13.3 intra_dc_prediction() */
815     av_free(slices);
816     return 0;
817 }
818
819 static void init_planes(DiracContext *s)
820 {
821     int i, w, h, level, orientation;
822
823     for (i = 0; i < 3; i++) {
824         Plane *p = &s->plane[i];
825
826         p->width       = s->source.width  >> (i ? s->chroma_x_shift : 0);
827         p->height      = s->source.height >> (i ? s->chroma_y_shift : 0);
828         p->idwt_width  = w = CALC_PADDING(p->width , s->wavelet_depth);
829         p->idwt_height = h = CALC_PADDING(p->height, s->wavelet_depth);
830         p->idwt_stride = FFALIGN(p->idwt_width, 8);
831
832         for (level = s->wavelet_depth-1; level >= 0; level--) {
833             w = w>>1;
834             h = h>>1;
835             for (orientation = !!level; orientation < 4; orientation++) {
836                 SubBand *b = &p->band[level][orientation];
837
838                 b->ibuf   = p->idwt_buf;
839                 b->level  = level;
840                 b->stride = p->idwt_stride << (s->wavelet_depth - level);
841                 b->width  = w;
842                 b->height = h;
843                 b->orientation = orientation;
844
845                 if (orientation & 1)
846                     b->ibuf += w;
847                 if (orientation > 1)
848                     b->ibuf += b->stride>>1;
849
850                 if (level)
851                     b->parent = &p->band[level-1][orientation];
852             }
853         }
854
855         if (i > 0) {
856             p->xblen = s->plane[0].xblen >> s->chroma_x_shift;
857             p->yblen = s->plane[0].yblen >> s->chroma_y_shift;
858             p->xbsep = s->plane[0].xbsep >> s->chroma_x_shift;
859             p->ybsep = s->plane[0].ybsep >> s->chroma_y_shift;
860         }
861
862         p->xoffset = (p->xblen - p->xbsep)/2;
863         p->yoffset = (p->yblen - p->ybsep)/2;
864     }
865 }
866
867 /**
868  * Unpack the motion compensation parameters
869  * Dirac Specification ->
870  * 11.2 Picture prediction data. picture_prediction()
871  */
872 static int dirac_unpack_prediction_parameters(DiracContext *s)
873 {
874     static const uint8_t default_blen[] = { 4, 12, 16, 24 };
875
876     GetBitContext *gb = &s->gb;
877     unsigned idx, ref;
878
879     align_get_bits(gb);
880     /* [DIRAC_STD] 11.2.2 Block parameters. block_parameters() */
881     /* Luma and Chroma are equal. 11.2.3 */
882     idx = svq3_get_ue_golomb(gb); /* [DIRAC_STD] index */
883
884     if (idx > 4) {
885         av_log(s->avctx, AV_LOG_ERROR, "Block prediction index too high\n");
886         return AVERROR_INVALIDDATA;
887     }
888
889     if (idx == 0) {
890         s->plane[0].xblen = svq3_get_ue_golomb(gb);
891         s->plane[0].yblen = svq3_get_ue_golomb(gb);
892         s->plane[0].xbsep = svq3_get_ue_golomb(gb);
893         s->plane[0].ybsep = svq3_get_ue_golomb(gb);
894     } else {
895         /*[DIRAC_STD] preset_block_params(index). Table 11.1 */
896         s->plane[0].xblen = default_blen[idx-1];
897         s->plane[0].yblen = default_blen[idx-1];
898         s->plane[0].xbsep = 4 * idx;
899         s->plane[0].ybsep = 4 * idx;
900     }
901     /*[DIRAC_STD] 11.2.4 motion_data_dimensions()
902       Calculated in function dirac_unpack_block_motion_data */
903
904     if (s->plane[0].xblen % (1 << s->chroma_x_shift) != 0 ||
905         s->plane[0].yblen % (1 << s->chroma_y_shift) != 0 ||
906         !s->plane[0].xblen || !s->plane[0].yblen) {
907         av_log(s->avctx, AV_LOG_ERROR,
908                "invalid x/y block length (%d/%d) for x/y chroma shift (%d/%d)\n",
909                s->plane[0].xblen, s->plane[0].yblen, s->chroma_x_shift, s->chroma_y_shift);
910         return AVERROR_INVALIDDATA;
911     }
912     if (!s->plane[0].xbsep || !s->plane[0].ybsep || s->plane[0].xbsep < s->plane[0].xblen/2 || s->plane[0].ybsep < s->plane[0].yblen/2) {
913         av_log(s->avctx, AV_LOG_ERROR, "Block separation too small\n");
914         return AVERROR_INVALIDDATA;
915     }
916     if (s->plane[0].xbsep > s->plane[0].xblen || s->plane[0].ybsep > s->plane[0].yblen) {
917         av_log(s->avctx, AV_LOG_ERROR, "Block separation greater than size\n");
918         return AVERROR_INVALIDDATA;
919     }
920     if (FFMAX(s->plane[0].xblen, s->plane[0].yblen) > MAX_BLOCKSIZE) {
921         av_log(s->avctx, AV_LOG_ERROR, "Unsupported large block size\n");
922         return AVERROR_PATCHWELCOME;
923     }
924
925     /*[DIRAC_STD] 11.2.5 Motion vector precision. motion_vector_precision()
926       Read motion vector precision */
927     s->mv_precision = svq3_get_ue_golomb(gb);
928     if (s->mv_precision > 3) {
929         av_log(s->avctx, AV_LOG_ERROR, "MV precision finer than eighth-pel\n");
930         return AVERROR_INVALIDDATA;
931     }
932
933     /*[DIRAC_STD] 11.2.6 Global motion. global_motion()
934       Read the global motion compensation parameters */
935     s->globalmc_flag = get_bits1(gb);
936     if (s->globalmc_flag) {
937         memset(s->globalmc, 0, sizeof(s->globalmc));
938         /* [DIRAC_STD] pan_tilt(gparams) */
939         for (ref = 0; ref < s->num_refs; ref++) {
940             if (get_bits1(gb)) {
941                 s->globalmc[ref].pan_tilt[0] = dirac_get_se_golomb(gb);
942                 s->globalmc[ref].pan_tilt[1] = dirac_get_se_golomb(gb);
943             }
944             /* [DIRAC_STD] zoom_rotate_shear(gparams)
945                zoom/rotation/shear parameters */
946             if (get_bits1(gb)) {
947                 s->globalmc[ref].zrs_exp   = svq3_get_ue_golomb(gb);
948                 s->globalmc[ref].zrs[0][0] = dirac_get_se_golomb(gb);
949                 s->globalmc[ref].zrs[0][1] = dirac_get_se_golomb(gb);
950                 s->globalmc[ref].zrs[1][0] = dirac_get_se_golomb(gb);
951                 s->globalmc[ref].zrs[1][1] = dirac_get_se_golomb(gb);
952             } else {
953                 s->globalmc[ref].zrs[0][0] = 1;
954                 s->globalmc[ref].zrs[1][1] = 1;
955             }
956             /* [DIRAC_STD] perspective(gparams) */
957             if (get_bits1(gb)) {
958                 s->globalmc[ref].perspective_exp = svq3_get_ue_golomb(gb);
959                 s->globalmc[ref].perspective[0]  = dirac_get_se_golomb(gb);
960                 s->globalmc[ref].perspective[1]  = dirac_get_se_golomb(gb);
961             }
962         }
963     }
964
965     /*[DIRAC_STD] 11.2.7 Picture prediction mode. prediction_mode()
966       Picture prediction mode, not currently used. */
967     if (svq3_get_ue_golomb(gb)) {
968         av_log(s->avctx, AV_LOG_ERROR, "Unknown picture prediction mode\n");
969         return AVERROR_INVALIDDATA;
970     }
971
972     /* [DIRAC_STD] 11.2.8 Reference picture weight. reference_picture_weights()
973        just data read, weight calculation will be done later on. */
974     s->weight_log2denom = 1;
975     s->weight[0]        = 1;
976     s->weight[1]        = 1;
977
978     if (get_bits1(gb)) {
979         s->weight_log2denom = svq3_get_ue_golomb(gb);
980         s->weight[0] = dirac_get_se_golomb(gb);
981         if (s->num_refs == 2)
982             s->weight[1] = dirac_get_se_golomb(gb);
983     }
984     return 0;
985 }
986
987 /**
988  * Dirac Specification ->
989  * 11.3 Wavelet transform data. wavelet_transform()
990  */
991 static int dirac_unpack_idwt_params(DiracContext *s)
992 {
993     GetBitContext *gb = &s->gb;
994     int i, level;
995     unsigned tmp;
996
997 #define CHECKEDREAD(dst, cond, errmsg) \
998     tmp = svq3_get_ue_golomb(gb); \
999     if (cond) { \
1000         av_log(s->avctx, AV_LOG_ERROR, errmsg); \
1001         return AVERROR_INVALIDDATA; \
1002     }\
1003     dst = tmp;
1004
1005     align_get_bits(gb);
1006
1007     s->zero_res = s->num_refs ? get_bits1(gb) : 0;
1008     if (s->zero_res)
1009         return 0;
1010
1011     /*[DIRAC_STD] 11.3.1 Transform parameters. transform_parameters() */
1012     CHECKEDREAD(s->wavelet_idx, tmp > 6, "wavelet_idx is too big\n")
1013
1014     CHECKEDREAD(s->wavelet_depth, tmp > MAX_DWT_LEVELS || tmp < 1, "invalid number of DWT decompositions\n")
1015
1016     if (!s->low_delay) {
1017         /* Codeblock parameters (core syntax only) */
1018         if (get_bits1(gb)) {
1019             for (i = 0; i <= s->wavelet_depth; i++) {
1020                 CHECKEDREAD(s->codeblock[i].width , tmp < 1 || tmp > (s->avctx->width >>s->wavelet_depth-i), "codeblock width invalid\n")
1021                 CHECKEDREAD(s->codeblock[i].height, tmp < 1 || tmp > (s->avctx->height>>s->wavelet_depth-i), "codeblock height invalid\n")
1022             }
1023
1024             CHECKEDREAD(s->codeblock_mode, tmp > 1, "unknown codeblock mode\n")
1025         } else
1026             for (i = 0; i <= s->wavelet_depth; i++)
1027                 s->codeblock[i].width = s->codeblock[i].height = 1;
1028     } else {
1029         /* Slice parameters + quantization matrix*/
1030         /*[DIRAC_STD] 11.3.4 Slice coding Parameters (low delay syntax only). slice_parameters() */
1031         s->lowdelay.num_x     = svq3_get_ue_golomb(gb);
1032         s->lowdelay.num_y     = svq3_get_ue_golomb(gb);
1033         s->lowdelay.bytes.num = svq3_get_ue_golomb(gb);
1034         s->lowdelay.bytes.den = svq3_get_ue_golomb(gb);
1035
1036         if (s->lowdelay.bytes.den <= 0) {
1037             av_log(s->avctx,AV_LOG_ERROR,"Invalid lowdelay.bytes.den\n");
1038             return AVERROR_INVALIDDATA;
1039         }
1040
1041         /* [DIRAC_STD] 11.3.5 Quantisation matrices (low-delay syntax). quant_matrix() */
1042         if (get_bits1(gb)) {
1043             av_log(s->avctx,AV_LOG_DEBUG,"Low Delay: Has Custom Quantization Matrix!\n");
1044             /* custom quantization matrix */
1045             s->lowdelay.quant[0][0] = svq3_get_ue_golomb(gb);
1046             for (level = 0; level < s->wavelet_depth; level++) {
1047                 s->lowdelay.quant[level][1] = svq3_get_ue_golomb(gb);
1048                 s->lowdelay.quant[level][2] = svq3_get_ue_golomb(gb);
1049                 s->lowdelay.quant[level][3] = svq3_get_ue_golomb(gb);
1050             }
1051         } else {
1052             if (s->wavelet_depth > 4) {
1053                 av_log(s->avctx,AV_LOG_ERROR,"Mandatory custom low delay matrix missing for depth %d\n", s->wavelet_depth);
1054                 return AVERROR_INVALIDDATA;
1055             }
1056             /* default quantization matrix */
1057             for (level = 0; level < s->wavelet_depth; level++)
1058                 for (i = 0; i < 4; i++) {
1059                     s->lowdelay.quant[level][i] = default_qmat[s->wavelet_idx][level][i];
1060                     /* haar with no shift differs for different depths */
1061                     if (s->wavelet_idx == 3)
1062                         s->lowdelay.quant[level][i] += 4*(s->wavelet_depth-1 - level);
1063                 }
1064         }
1065     }
1066     return 0;
1067 }
1068
1069 static inline int pred_sbsplit(uint8_t *sbsplit, int stride, int x, int y)
1070 {
1071     static const uint8_t avgsplit[7] = { 0, 0, 1, 1, 1, 2, 2 };
1072
1073     if (!(x|y))
1074         return 0;
1075     else if (!y)
1076         return sbsplit[-1];
1077     else if (!x)
1078         return sbsplit[-stride];
1079
1080     return avgsplit[sbsplit[-1] + sbsplit[-stride] + sbsplit[-stride-1]];
1081 }
1082
1083 static inline int pred_block_mode(DiracBlock *block, int stride, int x, int y, int refmask)
1084 {
1085     int pred;
1086
1087     if (!(x|y))
1088         return 0;
1089     else if (!y)
1090         return block[-1].ref & refmask;
1091     else if (!x)
1092         return block[-stride].ref & refmask;
1093
1094     /* return the majority */
1095     pred = (block[-1].ref & refmask) + (block[-stride].ref & refmask) + (block[-stride-1].ref & refmask);
1096     return (pred >> 1) & refmask;
1097 }
1098
1099 static inline void pred_block_dc(DiracBlock *block, int stride, int x, int y)
1100 {
1101     int i, n = 0;
1102
1103     memset(block->u.dc, 0, sizeof(block->u.dc));
1104
1105     if (x && !(block[-1].ref & 3)) {
1106         for (i = 0; i < 3; i++)
1107             block->u.dc[i] += block[-1].u.dc[i];
1108         n++;
1109     }
1110
1111     if (y && !(block[-stride].ref & 3)) {
1112         for (i = 0; i < 3; i++)
1113             block->u.dc[i] += block[-stride].u.dc[i];
1114         n++;
1115     }
1116
1117     if (x && y && !(block[-1-stride].ref & 3)) {
1118         for (i = 0; i < 3; i++)
1119             block->u.dc[i] += block[-1-stride].u.dc[i];
1120         n++;
1121     }
1122
1123     if (n == 2) {
1124         for (i = 0; i < 3; i++)
1125             block->u.dc[i] = (block->u.dc[i]+1)>>1;
1126     } else if (n == 3) {
1127         for (i = 0; i < 3; i++)
1128             block->u.dc[i] = divide3(block->u.dc[i]);
1129     }
1130 }
1131
1132 static inline void pred_mv(DiracBlock *block, int stride, int x, int y, int ref)
1133 {
1134     int16_t *pred[3];
1135     int refmask = ref+1;
1136     int mask = refmask | DIRAC_REF_MASK_GLOBAL; /*  exclude gmc blocks */
1137     int n = 0;
1138
1139     if (x && (block[-1].ref & mask) == refmask)
1140         pred[n++] = block[-1].u.mv[ref];
1141
1142     if (y && (block[-stride].ref & mask) == refmask)
1143         pred[n++] = block[-stride].u.mv[ref];
1144
1145     if (x && y && (block[-stride-1].ref & mask) == refmask)
1146         pred[n++] = block[-stride-1].u.mv[ref];
1147
1148     switch (n) {
1149     case 0:
1150         block->u.mv[ref][0] = 0;
1151         block->u.mv[ref][1] = 0;
1152         break;
1153     case 1:
1154         block->u.mv[ref][0] = pred[0][0];
1155         block->u.mv[ref][1] = pred[0][1];
1156         break;
1157     case 2:
1158         block->u.mv[ref][0] = (pred[0][0] + pred[1][0] + 1) >> 1;
1159         block->u.mv[ref][1] = (pred[0][1] + pred[1][1] + 1) >> 1;
1160         break;
1161     case 3:
1162         block->u.mv[ref][0] = mid_pred(pred[0][0], pred[1][0], pred[2][0]);
1163         block->u.mv[ref][1] = mid_pred(pred[0][1], pred[1][1], pred[2][1]);
1164         break;
1165     }
1166 }
1167
1168 static void global_mv(DiracContext *s, DiracBlock *block, int x, int y, int ref)
1169 {
1170     int ez      = s->globalmc[ref].zrs_exp;
1171     int ep      = s->globalmc[ref].perspective_exp;
1172     int (*A)[2] = s->globalmc[ref].zrs;
1173     int *b      = s->globalmc[ref].pan_tilt;
1174     int *c      = s->globalmc[ref].perspective;
1175
1176     int m       = (1<<ep) - (c[0]*x + c[1]*y);
1177     int mx      = m * ((A[0][0] * x + A[0][1]*y) + (1<<ez) * b[0]);
1178     int my      = m * ((A[1][0] * x + A[1][1]*y) + (1<<ez) * b[1]);
1179
1180     block->u.mv[ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep);
1181     block->u.mv[ref][1] = (my + (1<<(ez+ep))) >> (ez+ep);
1182 }
1183
1184 static void decode_block_params(DiracContext *s, DiracArith arith[8], DiracBlock *block,
1185                                 int stride, int x, int y)
1186 {
1187     int i;
1188
1189     block->ref  = pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF1);
1190     block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF1);
1191
1192     if (s->num_refs == 2) {
1193         block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF2);
1194         block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF2) << 1;
1195     }
1196
1197     if (!block->ref) {
1198         pred_block_dc(block, stride, x, y);
1199         for (i = 0; i < 3; i++)
1200             block->u.dc[i] += dirac_get_arith_int(arith+1+i, CTX_DC_F1, CTX_DC_DATA);
1201         return;
1202     }
1203
1204     if (s->globalmc_flag) {
1205         block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_GLOBAL);
1206         block->ref ^= dirac_get_arith_bit(arith, CTX_GLOBAL_BLOCK) << 2;
1207     }
1208
1209     for (i = 0; i < s->num_refs; i++)
1210         if (block->ref & (i+1)) {
1211             if (block->ref & DIRAC_REF_MASK_GLOBAL) {
1212                 global_mv(s, block, x, y, i);
1213             } else {
1214                 pred_mv(block, stride, x, y, i);
1215                 block->u.mv[i][0] += dirac_get_arith_int(arith + 4 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
1216                 block->u.mv[i][1] += dirac_get_arith_int(arith + 5 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
1217             }
1218         }
1219 }
1220
1221 /**
1222  * Copies the current block to the other blocks covered by the current superblock split mode
1223  */
1224 static void propagate_block_data(DiracBlock *block, int stride, int size)
1225 {
1226     int x, y;
1227     DiracBlock *dst = block;
1228
1229     for (x = 1; x < size; x++)
1230         dst[x] = *block;
1231
1232     for (y = 1; y < size; y++) {
1233         dst += stride;
1234         for (x = 0; x < size; x++)
1235             dst[x] = *block;
1236     }
1237 }
1238
1239 /**
1240  * Dirac Specification ->
1241  * 12. Block motion data syntax
1242  */
1243 static int dirac_unpack_block_motion_data(DiracContext *s)
1244 {
1245     GetBitContext *gb = &s->gb;
1246     uint8_t *sbsplit = s->sbsplit;
1247     int i, x, y, q, p;
1248     DiracArith arith[8];
1249
1250     align_get_bits(gb);
1251
1252     /* [DIRAC_STD] 11.2.4 and 12.2.1 Number of blocks and superblocks */
1253     s->sbwidth  = DIVRNDUP(s->source.width,  4*s->plane[0].xbsep);
1254     s->sbheight = DIVRNDUP(s->source.height, 4*s->plane[0].ybsep);
1255     s->blwidth  = 4 * s->sbwidth;
1256     s->blheight = 4 * s->sbheight;
1257
1258     /* [DIRAC_STD] 12.3.1 Superblock splitting modes. superblock_split_modes()
1259        decode superblock split modes */
1260     ff_dirac_init_arith_decoder(arith, gb, svq3_get_ue_golomb(gb));     /* svq3_get_ue_golomb(gb) is the length */
1261     for (y = 0; y < s->sbheight; y++) {
1262         for (x = 0; x < s->sbwidth; x++) {
1263             unsigned int split  = dirac_get_arith_uint(arith, CTX_SB_F1, CTX_SB_DATA);
1264             if (split > 2)
1265                 return AVERROR_INVALIDDATA;
1266             sbsplit[x] = (split + pred_sbsplit(sbsplit+x, s->sbwidth, x, y)) % 3;
1267         }
1268         sbsplit += s->sbwidth;
1269     }
1270
1271     /* setup arith decoding */
1272     ff_dirac_init_arith_decoder(arith, gb, svq3_get_ue_golomb(gb));
1273     for (i = 0; i < s->num_refs; i++) {
1274         ff_dirac_init_arith_decoder(arith + 4 + 2 * i, gb, svq3_get_ue_golomb(gb));
1275         ff_dirac_init_arith_decoder(arith + 5 + 2 * i, gb, svq3_get_ue_golomb(gb));
1276     }
1277     for (i = 0; i < 3; i++)
1278         ff_dirac_init_arith_decoder(arith+1+i, gb, svq3_get_ue_golomb(gb));
1279
1280     for (y = 0; y < s->sbheight; y++)
1281         for (x = 0; x < s->sbwidth; x++) {
1282             int blkcnt = 1 << s->sbsplit[y * s->sbwidth + x];
1283             int step   = 4 >> s->sbsplit[y * s->sbwidth + x];
1284
1285             for (q = 0; q < blkcnt; q++)
1286                 for (p = 0; p < blkcnt; p++) {
1287                     int bx = 4 * x + p*step;
1288                     int by = 4 * y + q*step;
1289                     DiracBlock *block = &s->blmotion[by*s->blwidth + bx];
1290                     decode_block_params(s, arith, block, s->blwidth, bx, by);
1291                     propagate_block_data(block, s->blwidth, step);
1292                 }
1293         }
1294
1295     return 0;
1296 }
1297
1298 static int weight(int i, int blen, int offset)
1299 {
1300 #define ROLLOFF(i) offset == 1 ? ((i) ? 5 : 3) :        \
1301     (1 + (6*(i) + offset - 1) / (2*offset - 1))
1302
1303     if (i < 2*offset)
1304         return ROLLOFF(i);
1305     else if (i > blen-1 - 2*offset)
1306         return ROLLOFF(blen-1 - i);
1307     return 8;
1308 }
1309
1310 static void init_obmc_weight_row(Plane *p, uint8_t *obmc_weight, int stride,
1311                                  int left, int right, int wy)
1312 {
1313     int x;
1314     for (x = 0; left && x < p->xblen >> 1; x++)
1315         obmc_weight[x] = wy*8;
1316     for (; x < p->xblen >> right; x++)
1317         obmc_weight[x] = wy*weight(x, p->xblen, p->xoffset);
1318     for (; x < p->xblen; x++)
1319         obmc_weight[x] = wy*8;
1320     for (; x < stride; x++)
1321         obmc_weight[x] = 0;
1322 }
1323
1324 static void init_obmc_weight(Plane *p, uint8_t *obmc_weight, int stride,
1325                              int left, int right, int top, int bottom)
1326 {
1327     int y;
1328     for (y = 0; top && y < p->yblen >> 1; y++) {
1329         init_obmc_weight_row(p, obmc_weight, stride, left, right, 8);
1330         obmc_weight += stride;
1331     }
1332     for (; y < p->yblen >> bottom; y++) {
1333         int wy = weight(y, p->yblen, p->yoffset);
1334         init_obmc_weight_row(p, obmc_weight, stride, left, right, wy);
1335         obmc_weight += stride;
1336     }
1337     for (; y < p->yblen; y++) {
1338         init_obmc_weight_row(p, obmc_weight, stride, left, right, 8);
1339         obmc_weight += stride;
1340     }
1341 }
1342
1343 static void init_obmc_weights(DiracContext *s, Plane *p, int by)
1344 {
1345     int top = !by;
1346     int bottom = by == s->blheight-1;
1347
1348     /* don't bother re-initing for rows 2 to blheight-2, the weights don't change */
1349     if (top || bottom || by == 1) {
1350         init_obmc_weight(p, s->obmc_weight[0], MAX_BLOCKSIZE, 1, 0, top, bottom);
1351         init_obmc_weight(p, s->obmc_weight[1], MAX_BLOCKSIZE, 0, 0, top, bottom);
1352         init_obmc_weight(p, s->obmc_weight[2], MAX_BLOCKSIZE, 0, 1, top, bottom);
1353     }
1354 }
1355
1356 static const uint8_t epel_weights[4][4][4] = {
1357     {{ 16,  0,  0,  0 },
1358      { 12,  4,  0,  0 },
1359      {  8,  8,  0,  0 },
1360      {  4, 12,  0,  0 }},
1361     {{ 12,  0,  4,  0 },
1362      {  9,  3,  3,  1 },
1363      {  6,  6,  2,  2 },
1364      {  3,  9,  1,  3 }},
1365     {{  8,  0,  8,  0 },
1366      {  6,  2,  6,  2 },
1367      {  4,  4,  4,  4 },
1368      {  2,  6,  2,  6 }},
1369     {{  4,  0, 12,  0 },
1370      {  3,  1,  9,  3 },
1371      {  2,  2,  6,  6 },
1372      {  1,  3,  3,  9 }}
1373 };
1374
1375 /**
1376  * For block x,y, determine which of the hpel planes to do bilinear
1377  * interpolation from and set src[] to the location in each hpel plane
1378  * to MC from.
1379  *
1380  * @return the index of the put_dirac_pixels_tab function to use
1381  *  0 for 1 plane (fpel,hpel), 1 for 2 planes (qpel), 2 for 4 planes (qpel), and 3 for epel
1382  */
1383 static int mc_subpel(DiracContext *s, DiracBlock *block, const uint8_t *src[5],
1384                      int x, int y, int ref, int plane)
1385 {
1386     Plane *p = &s->plane[plane];
1387     uint8_t **ref_hpel = s->ref_pics[ref]->hpel[plane];
1388     int motion_x = block->u.mv[ref][0];
1389     int motion_y = block->u.mv[ref][1];
1390     int mx, my, i, epel, nplanes = 0;
1391
1392     if (plane) {
1393         motion_x >>= s->chroma_x_shift;
1394         motion_y >>= s->chroma_y_shift;
1395     }
1396
1397     mx         = motion_x & ~(-1U << s->mv_precision);
1398     my         = motion_y & ~(-1U << s->mv_precision);
1399     motion_x >>= s->mv_precision;
1400     motion_y >>= s->mv_precision;
1401     /* normalize subpel coordinates to epel */
1402     /* TODO: template this function? */
1403     mx      <<= 3 - s->mv_precision;
1404     my      <<= 3 - s->mv_precision;
1405
1406     x += motion_x;
1407     y += motion_y;
1408     epel = (mx|my)&1;
1409
1410     /* hpel position */
1411     if (!((mx|my)&3)) {
1412         nplanes = 1;
1413         src[0] = ref_hpel[(my>>1)+(mx>>2)] + y*p->stride + x;
1414     } else {
1415         /* qpel or epel */
1416         nplanes = 4;
1417         for (i = 0; i < 4; i++)
1418             src[i] = ref_hpel[i] + y*p->stride + x;
1419
1420         /* if we're interpolating in the right/bottom halves, adjust the planes as needed
1421            we increment x/y because the edge changes for half of the pixels */
1422         if (mx > 4) {
1423             src[0] += 1;
1424             src[2] += 1;
1425             x++;
1426         }
1427         if (my > 4) {
1428             src[0] += p->stride;
1429             src[1] += p->stride;
1430             y++;
1431         }
1432
1433         /* hpel planes are:
1434            [0]: F  [1]: H
1435            [2]: V  [3]: C */
1436         if (!epel) {
1437             /* check if we really only need 2 planes since either mx or my is
1438                a hpel position. (epel weights of 0 handle this there) */
1439             if (!(mx&3)) {
1440                 /* mx == 0: average [0] and [2]
1441                    mx == 4: average [1] and [3] */
1442                 src[!mx] = src[2 + !!mx];
1443                 nplanes = 2;
1444             } else if (!(my&3)) {
1445                 src[0] = src[(my>>1)  ];
1446                 src[1] = src[(my>>1)+1];
1447                 nplanes = 2;
1448             }
1449         } else {
1450             /* adjust the ordering if needed so the weights work */
1451             if (mx > 4) {
1452                 FFSWAP(const uint8_t *, src[0], src[1]);
1453                 FFSWAP(const uint8_t *, src[2], src[3]);
1454             }
1455             if (my > 4) {
1456                 FFSWAP(const uint8_t *, src[0], src[2]);
1457                 FFSWAP(const uint8_t *, src[1], src[3]);
1458             }
1459             src[4] = epel_weights[my&3][mx&3];
1460         }
1461     }
1462
1463     /* fixme: v/h _edge_pos */
1464     if (x + p->xblen > p->width +EDGE_WIDTH/2 ||
1465         y + p->yblen > p->height+EDGE_WIDTH/2 ||
1466         x < 0 || y < 0) {
1467         for (i = 0; i < nplanes; i++) {
1468             s->vdsp.emulated_edge_mc(s->edge_emu_buffer[i], src[i],
1469                                      p->stride, p->stride,
1470                                      p->xblen, p->yblen, x, y,
1471                                      p->width+EDGE_WIDTH/2, p->height+EDGE_WIDTH/2);
1472             src[i] = s->edge_emu_buffer[i];
1473         }
1474     }
1475     return (nplanes>>1) + epel;
1476 }
1477
1478 static void add_dc(uint16_t *dst, int dc, int stride,
1479                    uint8_t *obmc_weight, int xblen, int yblen)
1480 {
1481     int x, y;
1482     dc += 128;
1483
1484     for (y = 0; y < yblen; y++) {
1485         for (x = 0; x < xblen; x += 2) {
1486             dst[x  ] += dc * obmc_weight[x  ];
1487             dst[x+1] += dc * obmc_weight[x+1];
1488         }
1489         dst          += stride;
1490         obmc_weight  += MAX_BLOCKSIZE;
1491     }
1492 }
1493
1494 static void block_mc(DiracContext *s, DiracBlock *block,
1495                      uint16_t *mctmp, uint8_t *obmc_weight,
1496                      int plane, int dstx, int dsty)
1497 {
1498     Plane *p = &s->plane[plane];
1499     const uint8_t *src[5];
1500     int idx;
1501
1502     switch (block->ref&3) {
1503     case 0: /* DC */
1504         add_dc(mctmp, block->u.dc[plane], p->stride, obmc_weight, p->xblen, p->yblen);
1505         return;
1506     case 1:
1507     case 2:
1508         idx = mc_subpel(s, block, src, dstx, dsty, (block->ref&3)-1, plane);
1509         s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1510         if (s->weight_func)
1511             s->weight_func(s->mcscratch, p->stride, s->weight_log2denom,
1512                            s->weight[0] + s->weight[1], p->yblen);
1513         break;
1514     case 3:
1515         idx = mc_subpel(s, block, src, dstx, dsty, 0, plane);
1516         s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1517         idx = mc_subpel(s, block, src, dstx, dsty, 1, plane);
1518         if (s->biweight_func) {
1519             /* fixme: +32 is a quick hack */
1520             s->put_pixels_tab[idx](s->mcscratch + 32, src, p->stride, p->yblen);
1521             s->biweight_func(s->mcscratch, s->mcscratch+32, p->stride, s->weight_log2denom,
1522                              s->weight[0], s->weight[1], p->yblen);
1523         } else
1524             s->avg_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1525         break;
1526     }
1527     s->add_obmc(mctmp, s->mcscratch, p->stride, obmc_weight, p->yblen);
1528 }
1529
1530 static void mc_row(DiracContext *s, DiracBlock *block, uint16_t *mctmp, int plane, int dsty)
1531 {
1532     Plane *p = &s->plane[plane];
1533     int x, dstx = p->xbsep - p->xoffset;
1534
1535     block_mc(s, block, mctmp, s->obmc_weight[0], plane, -p->xoffset, dsty);
1536     mctmp += p->xbsep;
1537
1538     for (x = 1; x < s->blwidth-1; x++) {
1539         block_mc(s, block+x, mctmp, s->obmc_weight[1], plane, dstx, dsty);
1540         dstx  += p->xbsep;
1541         mctmp += p->xbsep;
1542     }
1543     block_mc(s, block+x, mctmp, s->obmc_weight[2], plane, dstx, dsty);
1544 }
1545
1546 static void select_dsp_funcs(DiracContext *s, int width, int height, int xblen, int yblen)
1547 {
1548     int idx = 0;
1549     if (xblen > 8)
1550         idx = 1;
1551     if (xblen > 16)
1552         idx = 2;
1553
1554     memcpy(s->put_pixels_tab, s->diracdsp.put_dirac_pixels_tab[idx], sizeof(s->put_pixels_tab));
1555     memcpy(s->avg_pixels_tab, s->diracdsp.avg_dirac_pixels_tab[idx], sizeof(s->avg_pixels_tab));
1556     s->add_obmc = s->diracdsp.add_dirac_obmc[idx];
1557     if (s->weight_log2denom > 1 || s->weight[0] != 1 || s->weight[1] != 1) {
1558         s->weight_func   = s->diracdsp.weight_dirac_pixels_tab[idx];
1559         s->biweight_func = s->diracdsp.biweight_dirac_pixels_tab[idx];
1560     } else {
1561         s->weight_func   = NULL;
1562         s->biweight_func = NULL;
1563     }
1564 }
1565
1566 static int interpolate_refplane(DiracContext *s, DiracFrame *ref, int plane, int width, int height)
1567 {
1568     /* chroma allocates an edge of 8 when subsampled
1569        which for 4:2:2 means an h edge of 16 and v edge of 8
1570        just use 8 for everything for the moment */
1571     int i, edge = EDGE_WIDTH/2;
1572
1573     ref->hpel[plane][0] = ref->avframe->data[plane];
1574     s->mpvencdsp.draw_edges(ref->hpel[plane][0], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM); /* EDGE_TOP | EDGE_BOTTOM values just copied to make it build, this needs to be ensured */
1575
1576     /* no need for hpel if we only have fpel vectors */
1577     if (!s->mv_precision)
1578         return 0;
1579
1580     for (i = 1; i < 4; i++) {
1581         if (!ref->hpel_base[plane][i])
1582             ref->hpel_base[plane][i] = av_malloc((height+2*edge) * ref->avframe->linesize[plane] + 32);
1583         if (!ref->hpel_base[plane][i]) {
1584             return AVERROR(ENOMEM);
1585         }
1586         /* we need to be 16-byte aligned even for chroma */
1587         ref->hpel[plane][i] = ref->hpel_base[plane][i] + edge*ref->avframe->linesize[plane] + 16;
1588     }
1589
1590     if (!ref->interpolated[plane]) {
1591         s->diracdsp.dirac_hpel_filter(ref->hpel[plane][1], ref->hpel[plane][2],
1592                                       ref->hpel[plane][3], ref->hpel[plane][0],
1593                                       ref->avframe->linesize[plane], width, height);
1594         s->mpvencdsp.draw_edges(ref->hpel[plane][1], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1595         s->mpvencdsp.draw_edges(ref->hpel[plane][2], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1596         s->mpvencdsp.draw_edges(ref->hpel[plane][3], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1597     }
1598     ref->interpolated[plane] = 1;
1599
1600     return 0;
1601 }
1602
1603 /**
1604  * Dirac Specification ->
1605  * 13.0 Transform data syntax. transform_data()
1606  */
1607 static int dirac_decode_frame_internal(DiracContext *s)
1608 {
1609     DWTContext d;
1610     int y, i, comp, dsty;
1611     int ret;
1612
1613     if (s->low_delay) {
1614         /* [DIRAC_STD] 13.5.1 low_delay_transform_data() */
1615         for (comp = 0; comp < 3; comp++) {
1616             Plane *p = &s->plane[comp];
1617             memset(p->idwt_buf, 0, p->idwt_stride * p->idwt_height * sizeof(IDWTELEM));
1618         }
1619         if (!s->zero_res) {
1620             if ((ret = decode_lowdelay(s)) < 0)
1621                 return ret;
1622         }
1623     }
1624
1625     for (comp = 0; comp < 3; comp++) {
1626         Plane *p       = &s->plane[comp];
1627         uint8_t *frame = s->current_picture->avframe->data[comp];
1628
1629         /* FIXME: small resolutions */
1630         for (i = 0; i < 4; i++)
1631             s->edge_emu_buffer[i] = s->edge_emu_buffer_base + i*FFALIGN(p->width, 16);
1632
1633         if (!s->zero_res && !s->low_delay)
1634         {
1635             memset(p->idwt_buf, 0, p->idwt_stride * p->idwt_height * sizeof(IDWTELEM));
1636             decode_component(s, comp); /* [DIRAC_STD] 13.4.1 core_transform_data() */
1637         }
1638         ret = ff_spatial_idwt_init2(&d, p->idwt_buf, p->idwt_width, p->idwt_height, p->idwt_stride,
1639                                     s->wavelet_idx+2, s->wavelet_depth, p->idwt_tmp);
1640         if (ret < 0)
1641             return ret;
1642
1643         if (!s->num_refs) { /* intra */
1644             for (y = 0; y < p->height; y += 16) {
1645                 ff_spatial_idwt_slice2(&d, y+16); /* decode */
1646                 s->diracdsp.put_signed_rect_clamped(frame + y*p->stride, p->stride,
1647                                                     p->idwt_buf + y*p->idwt_stride, p->idwt_stride, p->width, 16);
1648             }
1649         } else { /* inter */
1650             int rowheight = p->ybsep*p->stride;
1651
1652             select_dsp_funcs(s, p->width, p->height, p->xblen, p->yblen);
1653
1654             for (i = 0; i < s->num_refs; i++) {
1655                 int ret = interpolate_refplane(s, s->ref_pics[i], comp, p->width, p->height);
1656                 if (ret < 0)
1657                     return ret;
1658             }
1659
1660             memset(s->mctmp, 0, 4*p->yoffset*p->stride);
1661
1662             dsty = -p->yoffset;
1663             for (y = 0; y < s->blheight; y++) {
1664                 int h     = 0,
1665                     start = FFMAX(dsty, 0);
1666                 uint16_t *mctmp    = s->mctmp + y*rowheight;
1667                 DiracBlock *blocks = s->blmotion + y*s->blwidth;
1668
1669                 init_obmc_weights(s, p, y);
1670
1671                 if (y == s->blheight-1 || start+p->ybsep > p->height)
1672                     h = p->height - start;
1673                 else
1674                     h = p->ybsep - (start - dsty);
1675                 if (h < 0)
1676                     break;
1677
1678                 memset(mctmp+2*p->yoffset*p->stride, 0, 2*rowheight);
1679                 mc_row(s, blocks, mctmp, comp, dsty);
1680
1681                 mctmp += (start - dsty)*p->stride + p->xoffset;
1682                 ff_spatial_idwt_slice2(&d, start + h); /* decode */
1683                 s->diracdsp.add_rect_clamped(frame + start*p->stride, mctmp, p->stride,
1684                                              p->idwt_buf + start*p->idwt_stride, p->idwt_stride, p->width, h);
1685
1686                 dsty += p->ybsep;
1687             }
1688         }
1689     }
1690
1691
1692     return 0;
1693 }
1694
1695 static int get_buffer_with_edge(AVCodecContext *avctx, AVFrame *f, int flags)
1696 {
1697     int ret, i;
1698     int chroma_x_shift, chroma_y_shift;
1699     avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_x_shift, &chroma_y_shift);
1700
1701     f->width  = avctx->width  + 2 * EDGE_WIDTH;
1702     f->height = avctx->height + 2 * EDGE_WIDTH + 2;
1703     ret = ff_get_buffer(avctx, f, flags);
1704     if (ret < 0)
1705         return ret;
1706
1707     for (i = 0; f->data[i]; i++) {
1708         int offset = (EDGE_WIDTH >> (i && i<3 ? chroma_y_shift : 0)) *
1709                      f->linesize[i] + 32;
1710         f->data[i] += offset;
1711     }
1712     f->width  = avctx->width;
1713     f->height = avctx->height;
1714
1715     return 0;
1716 }
1717
1718 /**
1719  * Dirac Specification ->
1720  * 11.1.1 Picture Header. picture_header()
1721  */
1722 static int dirac_decode_picture_header(DiracContext *s)
1723 {
1724     unsigned retire, picnum;
1725     int i, j, ret;
1726     int64_t refdist, refnum;
1727     GetBitContext *gb = &s->gb;
1728
1729     /* [DIRAC_STD] 11.1.1 Picture Header. picture_header() PICTURE_NUM */
1730     picnum = s->current_picture->avframe->display_picture_number = get_bits_long(gb, 32);
1731
1732
1733     av_log(s->avctx,AV_LOG_DEBUG,"PICTURE_NUM: %d\n",picnum);
1734
1735     /* if this is the first keyframe after a sequence header, start our
1736        reordering from here */
1737     if (s->frame_number < 0)
1738         s->frame_number = picnum;
1739
1740     s->ref_pics[0] = s->ref_pics[1] = NULL;
1741     for (i = 0; i < s->num_refs; i++) {
1742         refnum = (picnum + dirac_get_se_golomb(gb)) & 0xFFFFFFFF;
1743         refdist = INT64_MAX;
1744
1745         /* find the closest reference to the one we want */
1746         /* Jordi: this is needed if the referenced picture hasn't yet arrived */
1747         for (j = 0; j < MAX_REFERENCE_FRAMES && refdist; j++)
1748             if (s->ref_frames[j]
1749                 && FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum) < refdist) {
1750                 s->ref_pics[i] = s->ref_frames[j];
1751                 refdist = FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum);
1752             }
1753
1754         if (!s->ref_pics[i] || refdist)
1755             av_log(s->avctx, AV_LOG_DEBUG, "Reference not found\n");
1756
1757         /* if there were no references at all, allocate one */
1758         if (!s->ref_pics[i])
1759             for (j = 0; j < MAX_FRAMES; j++)
1760                 if (!s->all_frames[j].avframe->data[0]) {
1761                     s->ref_pics[i] = &s->all_frames[j];
1762                     get_buffer_with_edge(s->avctx, s->ref_pics[i]->avframe, AV_GET_BUFFER_FLAG_REF);
1763                     break;
1764                 }
1765
1766         if (!s->ref_pics[i]) {
1767             av_log(s->avctx, AV_LOG_ERROR, "Reference could not be allocated\n");
1768             return AVERROR_INVALIDDATA;
1769         }
1770
1771     }
1772
1773     /* retire the reference frames that are not used anymore */
1774     if (s->current_picture->avframe->reference) {
1775         retire = (picnum + dirac_get_se_golomb(gb)) & 0xFFFFFFFF;
1776         if (retire != picnum) {
1777             DiracFrame *retire_pic = remove_frame(s->ref_frames, retire);
1778
1779             if (retire_pic)
1780                 retire_pic->avframe->reference &= DELAYED_PIC_REF;
1781             else
1782                 av_log(s->avctx, AV_LOG_DEBUG, "Frame to retire not found\n");
1783         }
1784
1785         /* if reference array is full, remove the oldest as per the spec */
1786         while (add_frame(s->ref_frames, MAX_REFERENCE_FRAMES, s->current_picture)) {
1787             av_log(s->avctx, AV_LOG_ERROR, "Reference frame overflow\n");
1788             remove_frame(s->ref_frames, s->ref_frames[0]->avframe->display_picture_number)->avframe->reference &= DELAYED_PIC_REF;
1789         }
1790     }
1791
1792     if (s->num_refs) {
1793         ret = dirac_unpack_prediction_parameters(s);  /* [DIRAC_STD] 11.2 Picture Prediction Data. picture_prediction() */
1794         if (ret < 0)
1795             return ret;
1796         ret = dirac_unpack_block_motion_data(s);      /* [DIRAC_STD] 12. Block motion data syntax                       */
1797         if (ret < 0)
1798             return ret;
1799     }
1800     ret = dirac_unpack_idwt_params(s);                /* [DIRAC_STD] 11.3 Wavelet transform data                        */
1801     if (ret < 0)
1802         return ret;
1803
1804     init_planes(s);
1805     return 0;
1806 }
1807
1808 static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame)
1809 {
1810     DiracFrame *out = s->delay_frames[0];
1811     int i, out_idx  = 0;
1812     int ret;
1813
1814     /* find frame with lowest picture number */
1815     for (i = 1; s->delay_frames[i]; i++)
1816         if (s->delay_frames[i]->avframe->display_picture_number < out->avframe->display_picture_number) {
1817             out     = s->delay_frames[i];
1818             out_idx = i;
1819         }
1820
1821     for (i = out_idx; s->delay_frames[i]; i++)
1822         s->delay_frames[i] = s->delay_frames[i+1];
1823
1824     if (out) {
1825         out->avframe->reference ^= DELAYED_PIC_REF;
1826         *got_frame = 1;
1827         if((ret = av_frame_ref(picture, out->avframe)) < 0)
1828             return ret;
1829     }
1830
1831     return 0;
1832 }
1833
1834 /**
1835  * Dirac Specification ->
1836  * 9.6 Parse Info Header Syntax. parse_info()
1837  * 4 byte start code + byte parse code + 4 byte size + 4 byte previous size
1838  */
1839 #define DATA_UNIT_HEADER_SIZE 13
1840
1841 /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3
1842    inside the function parse_sequence() */
1843 static int dirac_decode_data_unit(AVCodecContext *avctx, const uint8_t *buf, int size)
1844 {
1845     DiracContext *s   = avctx->priv_data;
1846     DiracFrame *pic   = NULL;
1847     int ret, i, parse_code;
1848     unsigned tmp;
1849
1850     if (size < DATA_UNIT_HEADER_SIZE)
1851         return AVERROR_INVALIDDATA;
1852
1853     parse_code = buf[4];
1854
1855     init_get_bits(&s->gb, &buf[13], 8*(size - DATA_UNIT_HEADER_SIZE));
1856
1857     if (parse_code == pc_seq_header) {
1858         if (s->seen_sequence_header)
1859             return 0;
1860
1861         /* [DIRAC_STD] 10. Sequence header */
1862         ret = avpriv_dirac_parse_sequence_header(avctx, &s->gb, &s->source);
1863         if (ret < 0)
1864             return ret;
1865
1866         avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_x_shift, &s->chroma_y_shift);
1867
1868         ret = alloc_sequence_buffers(s);
1869         if (ret < 0)
1870             return ret;
1871
1872         s->seen_sequence_header = 1;
1873     } else if (parse_code == pc_eos) { /* [DIRAC_STD] End of Sequence */
1874         free_sequence_buffers(s);
1875         s->seen_sequence_header = 0;
1876     } else if (parse_code == pc_aux_data) {
1877         if (buf[13] == 1) {     /* encoder implementation/version */
1878             int ver[3];
1879             /* versions older than 1.0.8 don't store quant delta for
1880                subbands with only one codeblock */
1881             if (sscanf(buf+14, "Schroedinger %d.%d.%d", ver, ver+1, ver+2) == 3)
1882                 if (ver[0] == 1 && ver[1] == 0 && ver[2] <= 7)
1883                     s->old_delta_quant = 1;
1884         }
1885     } else if (parse_code & 0x8) {  /* picture data unit */
1886         if (!s->seen_sequence_header) {
1887             av_log(avctx, AV_LOG_DEBUG, "Dropping frame without sequence header\n");
1888             return AVERROR_INVALIDDATA;
1889         }
1890
1891         /* find an unused frame */
1892         for (i = 0; i < MAX_FRAMES; i++)
1893             if (s->all_frames[i].avframe->data[0] == NULL)
1894                 pic = &s->all_frames[i];
1895         if (!pic) {
1896             av_log(avctx, AV_LOG_ERROR, "framelist full\n");
1897             return AVERROR_INVALIDDATA;
1898         }
1899
1900         av_frame_unref(pic->avframe);
1901
1902         /* [DIRAC_STD] Defined in 9.6.1 ... */
1903         tmp            =  parse_code & 0x03;                   /* [DIRAC_STD] num_refs()      */
1904         if (tmp > 2) {
1905             av_log(avctx, AV_LOG_ERROR, "num_refs of 3\n");
1906             return AVERROR_INVALIDDATA;
1907         }
1908         s->num_refs    = tmp;
1909         s->is_arith    = (parse_code & 0x48) == 0x08;          /* [DIRAC_STD] using_ac()      */
1910         s->low_delay   = (parse_code & 0x88) == 0x88;          /* [DIRAC_STD] is_low_delay()  */
1911         pic->avframe->reference = (parse_code & 0x0C) == 0x0C;  /* [DIRAC_STD]  is_reference() */
1912         pic->avframe->key_frame = s->num_refs == 0;             /* [DIRAC_STD] is_intra()      */
1913         pic->avframe->pict_type = s->num_refs + 1;              /* Definition of AVPictureType in avutil.h */
1914
1915         if ((ret = get_buffer_with_edge(avctx, pic->avframe, (parse_code & 0x0C) == 0x0C ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
1916             return ret;
1917         s->current_picture = pic;
1918         s->plane[0].stride = pic->avframe->linesize[0];
1919         s->plane[1].stride = pic->avframe->linesize[1];
1920         s->plane[2].stride = pic->avframe->linesize[2];
1921
1922         if (alloc_buffers(s, FFMAX3(FFABS(s->plane[0].stride), FFABS(s->plane[1].stride), FFABS(s->plane[2].stride))) < 0)
1923             return AVERROR(ENOMEM);
1924
1925         /* [DIRAC_STD] 11.1 Picture parse. picture_parse() */
1926         ret = dirac_decode_picture_header(s);
1927         if (ret < 0)
1928             return ret;
1929
1930         /* [DIRAC_STD] 13.0 Transform data syntax. transform_data() */
1931         ret = dirac_decode_frame_internal(s);
1932         if (ret < 0)
1933             return ret;
1934     }
1935     return 0;
1936 }
1937
1938 static int dirac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *pkt)
1939 {
1940     DiracContext *s     = avctx->priv_data;
1941     AVFrame *picture    = data;
1942     uint8_t *buf        = pkt->data;
1943     int buf_size        = pkt->size;
1944     int i, buf_idx      = 0;
1945     int ret;
1946     unsigned data_unit_size;
1947
1948     /* release unused frames */
1949     for (i = 0; i < MAX_FRAMES; i++)
1950         if (s->all_frames[i].avframe->data[0] && !s->all_frames[i].avframe->reference) {
1951             av_frame_unref(s->all_frames[i].avframe);
1952             memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
1953         }
1954
1955     s->current_picture = NULL;
1956     *got_frame = 0;
1957
1958     /* end of stream, so flush delayed pics */
1959     if (buf_size == 0)
1960         return get_delayed_pic(s, (AVFrame *)data, got_frame);
1961
1962     for (;;) {
1963         /*[DIRAC_STD] Here starts the code from parse_info() defined in 9.6
1964           [DIRAC_STD] PARSE_INFO_PREFIX = "BBCD" as defined in ISO/IEC 646
1965           BBCD start code search */
1966         for (; buf_idx + DATA_UNIT_HEADER_SIZE < buf_size; buf_idx++) {
1967             if (buf[buf_idx  ] == 'B' && buf[buf_idx+1] == 'B' &&
1968                 buf[buf_idx+2] == 'C' && buf[buf_idx+3] == 'D')
1969                 break;
1970         }
1971         /* BBCD found or end of data */
1972         if (buf_idx + DATA_UNIT_HEADER_SIZE >= buf_size)
1973             break;
1974
1975         data_unit_size = AV_RB32(buf+buf_idx+5);
1976         if (data_unit_size > buf_size - buf_idx || !data_unit_size) {
1977             if(data_unit_size > buf_size - buf_idx)
1978             av_log(s->avctx, AV_LOG_ERROR,
1979                    "Data unit with size %d is larger than input buffer, discarding\n",
1980                    data_unit_size);
1981             buf_idx += 4;
1982             continue;
1983         }
1984         /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3 inside the function parse_sequence() */
1985         ret = dirac_decode_data_unit(avctx, buf+buf_idx, data_unit_size);
1986         if (ret < 0)
1987         {
1988             av_log(s->avctx, AV_LOG_ERROR,"Error in dirac_decode_data_unit\n");
1989             return ret;
1990         }
1991         buf_idx += data_unit_size;
1992     }
1993
1994     if (!s->current_picture)
1995         return buf_size;
1996
1997     if (s->current_picture->avframe->display_picture_number > s->frame_number) {
1998         DiracFrame *delayed_frame = remove_frame(s->delay_frames, s->frame_number);
1999
2000         s->current_picture->avframe->reference |= DELAYED_PIC_REF;
2001
2002         if (add_frame(s->delay_frames, MAX_DELAY, s->current_picture)) {
2003             int min_num = s->delay_frames[0]->avframe->display_picture_number;
2004             /* Too many delayed frames, so we display the frame with the lowest pts */
2005             av_log(avctx, AV_LOG_ERROR, "Delay frame overflow\n");
2006
2007             for (i = 1; s->delay_frames[i]; i++)
2008                 if (s->delay_frames[i]->avframe->display_picture_number < min_num)
2009                     min_num = s->delay_frames[i]->avframe->display_picture_number;
2010
2011             delayed_frame = remove_frame(s->delay_frames, min_num);
2012             add_frame(s->delay_frames, MAX_DELAY, s->current_picture);
2013         }
2014
2015         if (delayed_frame) {
2016             delayed_frame->avframe->reference ^= DELAYED_PIC_REF;
2017             if((ret=av_frame_ref(data, delayed_frame->avframe)) < 0)
2018                 return ret;
2019             *got_frame = 1;
2020         }
2021     } else if (s->current_picture->avframe->display_picture_number == s->frame_number) {
2022         /* The right frame at the right time :-) */
2023         if((ret=av_frame_ref(data, s->current_picture->avframe)) < 0)
2024             return ret;
2025         *got_frame = 1;
2026     }
2027
2028     if (*got_frame)
2029         s->frame_number = picture->display_picture_number + 1;
2030
2031     return buf_idx;
2032 }
2033
2034 AVCodec ff_dirac_decoder = {
2035     .name           = "dirac",
2036     .long_name      = NULL_IF_CONFIG_SMALL("BBC Dirac VC-2"),
2037     .type           = AVMEDIA_TYPE_VIDEO,
2038     .id             = AV_CODEC_ID_DIRAC,
2039     .priv_data_size = sizeof(DiracContext),
2040     .init           = dirac_decode_init,
2041     .close          = dirac_decode_end,
2042     .decode         = dirac_decode_frame,
2043     .capabilities   = AV_CODEC_CAP_DELAY,
2044     .flush          = dirac_decode_flush,
2045 };