Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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