Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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