2 * Copyright (C) 2007 Marco Gerards <marco@gnu.org>
3 * Copyright (C) 2009 David Conrad
4 * Copyright (C) 2011 Jordi Ortiz
6 * This file is part of FFmpeg.
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.
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.
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
26 * @author Marco Gerards <marco@gnu.org>, David Conrad, Jordi Ortiz <nenjordi@gmail.com>
31 #include "bytestream.h"
34 #include "dirac_arith.h"
35 #include "mpeg12data.h"
36 #include "libavcodec/mpegvideo.h"
37 #include "mpegvideoencdsp.h"
38 #include "dirac_dwt.h"
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).
50 * We use this instead of MAX_DECOMPOSITIONS to save some memory.
52 #define MAX_DWT_LEVELS 5
55 * The spec limits this to 3 for frame coding, but in practice can be as high as 6
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 */
64 * DiracBlock->ref flags, if set then the block does MC from the given ref
66 #define DIRAC_REF_MASK_REF1 1
67 #define DIRAC_REF_MASK_REF2 2
68 #define DIRAC_REF_MASK_GLOBAL 4
71 * Value of Picture.reference when Picture is not a reference picture, but
72 * is held for delayed output.
74 #define DELAYED_PIC_REF 4
76 #define CALC_PADDING(size, depth) \
77 (((size + (1 << depth) - 1) >> depth) << depth)
79 #define DIVRNDUP(a, b) (((a) + (b) - 1) / (b))
83 int interpolated[3]; /* 1 if hpel[] is valid */
85 uint8_t *hpel_base[3][4];
93 } u; /* anonymous unions aren't in C99 :( */
97 typedef struct SubBand {
100 int stride; /* in bytes */
106 struct SubBand *parent;
110 const uint8_t *coeff_data;
113 typedef struct Plane {
122 uint8_t *idwt_buf_base;
128 /* block separation (block n+1 starts after this many pixels in block n) */
131 /* amount of overspill on each edge (half of the overlap between blocks) */
135 SubBand band[MAX_DWT_LEVELS][4];
138 typedef struct DiracContext {
139 AVCodecContext *avctx;
140 MpegvideoEncDSPContext mpvencdsp;
141 VideoDSPContext vdsp;
142 DiracDSPContext diracdsp;
144 dirac_source_params source;
145 int seen_sequence_header;
146 int frame_number; /* number of the next frame to display */
151 int bit_depth; /* bit depth */
152 int pshift; /* pixel shift = bit_depth > 8 */
154 int zero_res; /* zero residue flag */
155 int is_arith; /* whether coeffs use arith or golomb coding */
156 int low_delay; /* use the low delay syntax */
157 int globalmc_flag; /* use global motion compensation */
158 int num_refs; /* number of reference pictures */
160 /* wavelet decoding */
161 unsigned wavelet_depth; /* depth of the IDWT */
162 unsigned wavelet_idx;
165 * schroedinger older than 1.0.8 doesn't store
166 * quant delta if only one codebook exists in a band
168 unsigned old_delta_quant;
169 unsigned codeblock_mode;
171 unsigned num_x; /* number of horizontal slices */
172 unsigned num_y; /* number of vertical slices */
177 } codeblock[MAX_DWT_LEVELS+1];
180 AVRational bytes; /* average bytes per slice */
181 uint8_t quant[MAX_DWT_LEVELS][4]; /* [DIRAC_STD] E.1 */
185 int pan_tilt[2]; /* pan/tilt vector */
186 int zrs[2][2]; /* zoom/rotate/shear matrix */
187 int perspective[2]; /* perspective vector */
189 unsigned perspective_exp;
192 /* motion compensation */
193 uint8_t mv_precision; /* [DIRAC_STD] REFS_WT_PRECISION */
194 int16_t weight[2]; /* [DIRAC_STD] REF1_WT and REF2_WT */
195 unsigned weight_log2denom; /* [DIRAC_STD] REFS_WT_PRECISION */
197 int blwidth; /* number of blocks (horizontally) */
198 int blheight; /* number of blocks (vertically) */
199 int sbwidth; /* number of superblocks (horizontally) */
200 int sbheight; /* number of superblocks (vertically) */
203 DiracBlock *blmotion;
205 uint8_t *edge_emu_buffer[4];
206 uint8_t *edge_emu_buffer_base;
208 uint16_t *mctmp; /* buffer holding the MC data multiplied by OBMC weights */
212 DECLARE_ALIGNED(16, uint8_t, obmc_weight)[3][MAX_BLOCKSIZE*MAX_BLOCKSIZE];
214 void (*put_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h);
215 void (*avg_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h);
216 void (*add_obmc)(uint16_t *dst, const uint8_t *src, int stride, const uint8_t *obmc_weight, int yblen);
217 dirac_weight_func weight_func;
218 dirac_biweight_func biweight_func;
220 DiracFrame *current_picture;
221 DiracFrame *ref_pics[2];
223 DiracFrame *ref_frames[MAX_REFERENCE_FRAMES+1];
224 DiracFrame *delay_frames[MAX_DELAY+1];
225 DiracFrame all_frames[MAX_FRAMES];
229 * Dirac Specification ->
230 * Parse code values. 9.6.1 Table 9.1
232 enum dirac_parse_code {
233 pc_seq_header = 0x00,
247 static const uint8_t default_qmat[][4][4] = {
248 { { 5, 3, 3, 0}, { 0, 4, 4, 1}, { 0, 5, 5, 2}, { 0, 6, 6, 3} },
249 { { 4, 2, 2, 0}, { 0, 4, 4, 2}, { 0, 5, 5, 3}, { 0, 7, 7, 5} },
250 { { 5, 3, 3, 0}, { 0, 4, 4, 1}, { 0, 5, 5, 2}, { 0, 6, 6, 3} },
251 { { 8, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0} },
252 { { 8, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0} },
253 { { 0, 4, 4, 8}, { 0, 8, 8, 12}, { 0, 13, 13, 17}, { 0, 17, 17, 21} },
254 { { 3, 1, 1, 0}, { 0, 4, 4, 2}, { 0, 6, 6, 5}, { 0, 9, 9, 7} },
257 static const int qscale_tab[MAX_QUANT+1] = {
258 4, 5, 6, 7, 8, 10, 11, 13,
259 16, 19, 23, 27, 32, 38, 45, 54,
260 64, 76, 91, 108, 128, 152, 181, 215,
261 256, 304, 362, 431, 512, 609, 724, 861,
262 1024, 1218, 1448, 1722, 2048, 2435, 2896, 3444,
263 4096, 4871, 5793, 6889, 8192, 9742, 11585, 13777,
264 16384, 19484, 23170, 27554, 32768, 38968, 46341, 55109,
268 static const int qoffset_intra_tab[MAX_QUANT+1] = {
269 1, 2, 3, 4, 4, 5, 6, 7,
270 8, 10, 12, 14, 16, 19, 23, 27,
271 32, 38, 46, 54, 64, 76, 91, 108,
272 128, 152, 181, 216, 256, 305, 362, 431,
273 512, 609, 724, 861, 1024, 1218, 1448, 1722,
274 2048, 2436, 2897, 3445, 4096, 4871, 5793, 6889,
275 8192, 9742, 11585, 13777, 16384, 19484, 23171, 27555,
279 static const int qoffset_inter_tab[MAX_QUANT+1] = {
280 1, 2, 2, 3, 3, 4, 4, 5,
281 6, 7, 9, 10, 12, 14, 17, 20,
282 24, 29, 34, 41, 48, 57, 68, 81,
283 96, 114, 136, 162, 192, 228, 272, 323,
284 384, 457, 543, 646, 768, 913, 1086, 1292,
285 1536, 1827, 2172, 2583, 3072, 3653, 4344, 5166,
286 6144, 7307, 8689, 10333, 12288, 14613, 17378, 20666,
290 /* magic number division by 3 from schroedinger */
291 static inline int divide3(int x)
293 return ((x+1)*21845 + 10922) >> 16;
296 static DiracFrame *remove_frame(DiracFrame *framelist[], int picnum)
298 DiracFrame *remove_pic = NULL;
299 int i, remove_idx = -1;
301 for (i = 0; framelist[i]; i++)
302 if (framelist[i]->avframe->display_picture_number == picnum) {
303 remove_pic = framelist[i];
308 for (i = remove_idx; framelist[i]; i++)
309 framelist[i] = framelist[i+1];
314 static int add_frame(DiracFrame *framelist[], int maxframes, DiracFrame *frame)
317 for (i = 0; i < maxframes; i++)
319 framelist[i] = frame;
325 static int alloc_sequence_buffers(DiracContext *s)
327 int sbwidth = DIVRNDUP(s->source.width, 4);
328 int sbheight = DIVRNDUP(s->source.height, 4);
329 int i, w, h, top_padding;
331 /* todo: think more about this / use or set Plane here */
332 for (i = 0; i < 3; i++) {
333 int max_xblen = MAX_BLOCKSIZE >> (i ? s->chroma_x_shift : 0);
334 int max_yblen = MAX_BLOCKSIZE >> (i ? s->chroma_y_shift : 0);
335 w = s->source.width >> (i ? s->chroma_x_shift : 0);
336 h = s->source.height >> (i ? s->chroma_y_shift : 0);
338 /* we allocate the max we support here since num decompositions can
339 * change from frame to frame. Stride is aligned to 16 for SIMD, and
340 * 1<<MAX_DWT_LEVELS top padding to avoid if(y>0) in arith decoding
341 * MAX_BLOCKSIZE padding for MC: blocks can spill up to half of that
343 top_padding = FFMAX(1<<MAX_DWT_LEVELS, max_yblen/2);
344 w = FFALIGN(CALC_PADDING(w, MAX_DWT_LEVELS), 8); /* FIXME: Should this be 16 for SSE??? */
345 h = top_padding + CALC_PADDING(h, MAX_DWT_LEVELS) + max_yblen/2;
347 s->plane[i].idwt_buf_base = av_mallocz_array((w+max_xblen), h * (2 << s->pshift));
348 s->plane[i].idwt_tmp = av_malloc_array((w+16), 2 << s->pshift);
349 s->plane[i].idwt_buf = s->plane[i].idwt_buf_base + (top_padding*w)*(2 << s->pshift);
350 if (!s->plane[i].idwt_buf_base || !s->plane[i].idwt_tmp)
351 return AVERROR(ENOMEM);
354 /* fixme: allocate using real stride here */
355 s->sbsplit = av_malloc_array(sbwidth, sbheight);
356 s->blmotion = av_malloc_array(sbwidth, sbheight * 16 * sizeof(*s->blmotion));
358 if (!s->sbsplit || !s->blmotion)
359 return AVERROR(ENOMEM);
363 static int alloc_buffers(DiracContext *s, int stride)
365 int w = s->source.width;
366 int h = s->source.height;
368 av_assert0(stride >= w);
371 if (s->buffer_stride >= stride)
373 s->buffer_stride = 0;
375 av_freep(&s->edge_emu_buffer_base);
376 memset(s->edge_emu_buffer, 0, sizeof(s->edge_emu_buffer));
378 av_freep(&s->mcscratch);
380 s->edge_emu_buffer_base = av_malloc_array(stride, MAX_BLOCKSIZE);
382 s->mctmp = av_malloc_array((stride+MAX_BLOCKSIZE), (h+MAX_BLOCKSIZE) * sizeof(*s->mctmp));
383 s->mcscratch = av_malloc_array(stride, MAX_BLOCKSIZE);
385 if (!s->edge_emu_buffer_base || !s->mctmp || !s->mcscratch)
386 return AVERROR(ENOMEM);
388 s->buffer_stride = stride;
392 static void free_sequence_buffers(DiracContext *s)
396 for (i = 0; i < MAX_FRAMES; i++) {
397 if (s->all_frames[i].avframe->data[0]) {
398 av_frame_unref(s->all_frames[i].avframe);
399 memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
402 for (j = 0; j < 3; j++)
403 for (k = 1; k < 4; k++)
404 av_freep(&s->all_frames[i].hpel_base[j][k]);
407 memset(s->ref_frames, 0, sizeof(s->ref_frames));
408 memset(s->delay_frames, 0, sizeof(s->delay_frames));
410 for (i = 0; i < 3; i++) {
411 av_freep(&s->plane[i].idwt_buf_base);
412 av_freep(&s->plane[i].idwt_tmp);
415 s->buffer_stride = 0;
416 av_freep(&s->sbsplit);
417 av_freep(&s->blmotion);
418 av_freep(&s->edge_emu_buffer_base);
421 av_freep(&s->mcscratch);
424 static av_cold int dirac_decode_init(AVCodecContext *avctx)
426 DiracContext *s = avctx->priv_data;
430 s->frame_number = -1;
432 ff_diracdsp_init(&s->diracdsp);
433 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
434 ff_videodsp_init(&s->vdsp, 8);
436 for (i = 0; i < MAX_FRAMES; i++) {
437 s->all_frames[i].avframe = av_frame_alloc();
438 if (!s->all_frames[i].avframe) {
440 av_frame_free(&s->all_frames[--i].avframe);
441 return AVERROR(ENOMEM);
448 static void dirac_decode_flush(AVCodecContext *avctx)
450 DiracContext *s = avctx->priv_data;
451 free_sequence_buffers(s);
452 s->seen_sequence_header = 0;
453 s->frame_number = -1;
456 static av_cold int dirac_decode_end(AVCodecContext *avctx)
458 DiracContext *s = avctx->priv_data;
461 dirac_decode_flush(avctx);
462 for (i = 0; i < MAX_FRAMES; i++)
463 av_frame_free(&s->all_frames[i].avframe);
468 #define SIGN_CTX(x) (CTX_SIGN_ZERO + ((x) > 0) - ((x) < 0))
470 static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset)
474 coeff = svq3_get_ue_golomb(gb);
476 coeff = (coeff * qfactor + qoffset + 2) >> 2;
477 sign = get_bits1(gb);
478 coeff = (coeff ^ -sign) + sign;
483 #define UNPACK_ARITH(n, type) \
484 static inline void coeff_unpack_arith_##n(DiracArith *c, int qfactor, int qoffset, \
485 SubBand *b, type *buf, int x, int y) \
487 int coeff, sign, sign_pred = 0, pred_ctx = CTX_ZPZN_F1; \
488 const int mstride = -(b->stride >> (1+b->pshift)); \
490 const type *pbuf = (type *)b->parent->ibuf; \
491 const int stride = b->parent->stride >> (1+b->parent->pshift); \
492 pred_ctx += !!pbuf[stride * (y>>1) + (x>>1)] << 1; \
494 if (b->orientation == subband_hl) \
495 sign_pred = buf[mstride]; \
497 pred_ctx += !(buf[-1] | buf[mstride] | buf[-1 + mstride]); \
498 if (b->orientation == subband_lh) \
499 sign_pred = buf[-1]; \
501 pred_ctx += !buf[mstride]; \
503 coeff = dirac_get_arith_uint(c, pred_ctx, CTX_COEFF_DATA); \
505 coeff = (coeff * qfactor + qoffset + 2) >> 2; \
506 sign = dirac_get_arith_bit(c, SIGN_CTX(sign_pred)); \
507 coeff = (coeff ^ -sign) + sign; \
512 UNPACK_ARITH(8, int16_t)
513 UNPACK_ARITH(10, int32_t)
516 * Decode the coeffs in the rectangle defined by left, right, top, bottom
517 * [DIRAC_STD] 13.4.3.2 Codeblock unpacking loop. codeblock()
519 static inline void codeblock(DiracContext *s, SubBand *b,
520 GetBitContext *gb, DiracArith *c,
521 int left, int right, int top, int bottom,
522 int blockcnt_one, int is_arith)
524 int x, y, zero_block;
525 int qoffset, qfactor;
528 /* check for any coded coefficients in this codeblock */
531 zero_block = dirac_get_arith_bit(c, CTX_ZERO_BLOCK);
533 zero_block = get_bits1(gb);
539 if (s->codeblock_mode && !(s->old_delta_quant && blockcnt_one)) {
540 int quant = b->quant;
542 quant += dirac_get_arith_int(c, CTX_DELTA_Q_F, CTX_DELTA_Q_DATA);
544 quant += dirac_get_se_golomb(gb);
546 av_log(s->avctx, AV_LOG_ERROR, "Invalid quant\n");
552 b->quant = FFMIN(b->quant, MAX_QUANT);
554 qfactor = qscale_tab[b->quant];
555 /* TODO: context pointer? */
557 qoffset = qoffset_intra_tab[b->quant];
559 qoffset = qoffset_inter_tab[b->quant];
561 buf = b->ibuf + top * b->stride;
563 for (y = top; y < bottom; y++) {
564 for (x = left; x < right; x++) {
566 coeff_unpack_arith_10(c, qfactor, qoffset, b, (int32_t*)(buf)+x, x, y);
568 coeff_unpack_arith_8(c, qfactor, qoffset, b, (int16_t*)(buf)+x, x, y);
574 for (y = top; y < bottom; y++) {
575 for (x = left; x < right; x++) {
576 int val = coeff_unpack_golomb(gb, qfactor, qoffset);
578 AV_WN32(&buf[4*x], val);
580 AV_WN16(&buf[2*x], val);
589 * Dirac Specification ->
590 * 13.3 intra_dc_prediction(band)
592 #define INTRA_DC_PRED(n, type) \
593 static inline void intra_dc_prediction_##n(SubBand *b) \
595 type *buf = (type*)b->ibuf; \
598 for (x = 1; x < b->width; x++) \
599 buf[x] += buf[x-1]; \
600 buf += (b->stride >> (1+b->pshift)); \
602 for (y = 1; y < b->height; y++) { \
603 buf[0] += buf[-(b->stride >> (1+b->pshift))]; \
605 for (x = 1; x < b->width; x++) { \
606 int pred = buf[x - 1] + buf[x - (b->stride >> (1+b->pshift))] + buf[x - (b->stride >> (1+b->pshift))-1]; \
607 buf[x] += divide3(pred); \
609 buf += (b->stride >> (1+b->pshift)); \
613 INTRA_DC_PRED(8, int16_t)
614 INTRA_DC_PRED(10, int32_t)
617 * Dirac Specification ->
618 * 13.4.2 Non-skipped subbands. subband_coeffs()
620 static av_always_inline void decode_subband_internal(DiracContext *s, SubBand *b, int is_arith)
622 int cb_x, cb_y, left, right, top, bottom;
625 int cb_width = s->codeblock[b->level + (b->orientation != subband_ll)].width;
626 int cb_height = s->codeblock[b->level + (b->orientation != subband_ll)].height;
627 int blockcnt_one = (cb_width + cb_height) == 2;
632 init_get_bits8(&gb, b->coeff_data, b->length);
635 ff_dirac_init_arith_decoder(&c, &gb, b->length);
638 for (cb_y = 0; cb_y < cb_height; cb_y++) {
639 bottom = (b->height * (cb_y+1LL)) / cb_height;
641 for (cb_x = 0; cb_x < cb_width; cb_x++) {
642 right = (b->width * (cb_x+1LL)) / cb_width;
643 codeblock(s, b, &gb, &c, left, right, top, bottom, blockcnt_one, is_arith);
649 if (b->orientation == subband_ll && s->num_refs == 0) {
651 intra_dc_prediction_10(b);
653 intra_dc_prediction_8(b);
658 static int decode_subband_arith(AVCodecContext *avctx, void *b)
660 DiracContext *s = avctx->priv_data;
661 decode_subband_internal(s, b, 1);
665 static int decode_subband_golomb(AVCodecContext *avctx, void *arg)
667 DiracContext *s = avctx->priv_data;
669 decode_subband_internal(s, *b, 0);
674 * Dirac Specification ->
675 * [DIRAC_STD] 13.4.1 core_transform_data()
677 static void decode_component(DiracContext *s, int comp)
679 AVCodecContext *avctx = s->avctx;
680 SubBand *bands[3*MAX_DWT_LEVELS+1];
681 enum dirac_subband orientation;
682 int level, num_bands = 0;
684 /* Unpack all subbands at all levels. */
685 for (level = 0; level < s->wavelet_depth; level++) {
686 for (orientation = !!level; orientation < 4; orientation++) {
687 SubBand *b = &s->plane[comp].band[level][orientation];
688 bands[num_bands++] = b;
690 align_get_bits(&s->gb);
691 /* [DIRAC_STD] 13.4.2 subband() */
692 b->length = svq3_get_ue_golomb(&s->gb);
694 b->quant = svq3_get_ue_golomb(&s->gb);
695 align_get_bits(&s->gb);
696 b->coeff_data = s->gb.buffer + get_bits_count(&s->gb)/8;
697 b->length = FFMIN(b->length, FFMAX(get_bits_left(&s->gb)/8, 0));
698 skip_bits_long(&s->gb, b->length*8);
701 /* arithmetic coding has inter-level dependencies, so we can only execute one level at a time */
703 avctx->execute(avctx, decode_subband_arith, &s->plane[comp].band[level][!!level],
704 NULL, 4-!!level, sizeof(SubBand));
706 /* golomb coding has no inter-level dependencies, so we can execute all subbands in parallel */
708 avctx->execute(avctx, decode_subband_golomb, bands, NULL, num_bands, sizeof(SubBand*));
711 #define PARSE_VALUES(type, x, gb, ebits, buf1, buf2) \
712 type *buf = (type *)buf1; \
713 buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset); \
714 if (get_bits_count(gb) >= ebits) \
717 buf = (type *)buf2; \
718 buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset); \
719 if (get_bits_count(gb) >= ebits) \
723 static void decode_subband(DiracContext *s, GetBitContext *gb, int quant,
724 int slice_x, int slice_y, int bits_end,
725 SubBand *b1, SubBand *b2)
727 int left = b1->width * slice_x / s->num_x;
728 int right = b1->width *(slice_x+1) / s->num_x;
729 int top = b1->height * slice_y / s->num_y;
730 int bottom = b1->height *(slice_y+1) / s->num_y;
732 int qfactor = qscale_tab[FFMIN(quant, MAX_QUANT)];
733 int qoffset = qoffset_intra_tab[FFMIN(quant, MAX_QUANT)];
735 uint8_t *buf1 = b1->ibuf + top * b1->stride;
736 uint8_t *buf2 = b2 ? b2->ibuf + top * b2->stride: NULL;
738 /* we have to constantly check for overread since the spec explicitly
739 requires this, with the meaning that all remaining coeffs are set to 0 */
740 if (get_bits_count(gb) >= bits_end)
744 for (y = top; y < bottom; y++) {
745 for (x = left; x < right; x++) {
746 PARSE_VALUES(int32_t, x, gb, bits_end, buf1, buf2);
754 for (y = top; y < bottom; y++) {
755 for (x = left; x < right; x++) {
756 PARSE_VALUES(int16_t, x, gb, bits_end, buf1, buf2);
765 /* Used by Low Delay and High Quality profiles */
766 typedef struct DiracSlice {
775 * Dirac Specification ->
776 * 13.5.2 Slices. slice(sx,sy)
778 static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg)
780 DiracContext *s = avctx->priv_data;
781 DiracSlice *slice = arg;
782 GetBitContext *gb = &slice->gb;
783 enum dirac_subband orientation;
784 int level, quant, chroma_bits, chroma_end;
786 int quant_base = get_bits(gb, 7); /*[DIRAC_STD] qindex */
787 int length_bits = av_log2(8 * slice->bytes)+1;
788 int luma_bits = get_bits_long(gb, length_bits);
789 int luma_end = get_bits_count(gb) + FFMIN(luma_bits, get_bits_left(gb));
791 /* [DIRAC_STD] 13.5.5.2 luma_slice_band */
792 for (level = 0; level < s->wavelet_depth; level++)
793 for (orientation = !!level; orientation < 4; orientation++) {
794 quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0);
795 decode_subband(s, gb, quant, slice->slice_x, slice->slice_y, luma_end,
796 &s->plane[0].band[level][orientation], NULL);
799 /* consume any unused bits from luma */
800 skip_bits_long(gb, get_bits_count(gb) - luma_end);
802 chroma_bits = 8*slice->bytes - 7 - length_bits - luma_bits;
803 chroma_end = get_bits_count(gb) + FFMIN(chroma_bits, get_bits_left(gb));
804 /* [DIRAC_STD] 13.5.5.3 chroma_slice_band */
805 for (level = 0; level < s->wavelet_depth; level++)
806 for (orientation = !!level; orientation < 4; orientation++) {
807 quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0);
808 decode_subband(s, gb, quant, slice->slice_x, slice->slice_y, chroma_end,
809 &s->plane[1].band[level][orientation],
810 &s->plane[2].band[level][orientation]);
817 * Dirac Specification ->
818 * 13.5.1 low_delay_transform_data()
820 static int decode_lowdelay(DiracContext *s)
822 AVCodecContext *avctx = s->avctx;
823 int slice_x, slice_y, bytes, bufsize;
828 slices = av_mallocz_array(s->num_x, s->num_y * sizeof(DiracSlice));
830 return AVERROR(ENOMEM);
832 align_get_bits(&s->gb);
833 /*[DIRAC_STD] 13.5.2 Slices. slice(sx,sy) */
834 buf = s->gb.buffer + get_bits_count(&s->gb)/8;
835 bufsize = get_bits_left(&s->gb);
837 for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) {
838 for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) {
839 bytes = (slice_num+1) * s->lowdelay.bytes.num / s->lowdelay.bytes.den
840 - slice_num * s->lowdelay.bytes.num / s->lowdelay.bytes.den;
841 slices[slice_num].bytes = bytes;
842 slices[slice_num].slice_x = slice_x;
843 slices[slice_num].slice_y = slice_y;
844 init_get_bits(&slices[slice_num].gb, buf, bufsize);
848 if (bufsize/8 >= bytes)
855 avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num,
856 sizeof(struct DiracSlice)); /* [DIRAC_STD] 13.5.2 Slices */
858 intra_dc_prediction_10(&s->plane[0].band[0][0]);
859 intra_dc_prediction_10(&s->plane[1].band[0][0]);
860 intra_dc_prediction_10(&s->plane[2].band[0][0]);
862 intra_dc_prediction_8(&s->plane[0].band[0][0]);
863 intra_dc_prediction_8(&s->plane[1].band[0][0]);
864 intra_dc_prediction_8(&s->plane[2].band[0][0]);
870 static void init_planes(DiracContext *s)
872 int i, w, h, level, orientation;
874 for (i = 0; i < 3; i++) {
875 Plane *p = &s->plane[i];
877 p->width = s->source.width >> (i ? s->chroma_x_shift : 0);
878 p->height = s->source.height >> (i ? s->chroma_y_shift : 0);
879 p->idwt_width = w = CALC_PADDING(p->width , s->wavelet_depth);
880 p->idwt_height = h = CALC_PADDING(p->height, s->wavelet_depth);
881 p->idwt_stride = FFALIGN(p->idwt_width << (1 + s->pshift), 8);
883 for (level = s->wavelet_depth-1; level >= 0; level--) {
886 for (orientation = !!level; orientation < 4; orientation++) {
887 SubBand *b = &p->band[level][orientation];
889 b->pshift = s->pshift;
890 b->ibuf = p->idwt_buf;
892 b->stride = p->idwt_stride << (s->wavelet_depth - level);
895 b->orientation = orientation;
898 b->ibuf += w << (1+b->pshift);
900 b->ibuf += (b->stride>>1);
903 b->parent = &p->band[level-1][orientation];
908 p->xblen = s->plane[0].xblen >> s->chroma_x_shift;
909 p->yblen = s->plane[0].yblen >> s->chroma_y_shift;
910 p->xbsep = s->plane[0].xbsep >> s->chroma_x_shift;
911 p->ybsep = s->plane[0].ybsep >> s->chroma_y_shift;
914 p->xoffset = (p->xblen - p->xbsep)/2;
915 p->yoffset = (p->yblen - p->ybsep)/2;
920 * Unpack the motion compensation parameters
921 * Dirac Specification ->
922 * 11.2 Picture prediction data. picture_prediction()
924 static int dirac_unpack_prediction_parameters(DiracContext *s)
926 static const uint8_t default_blen[] = { 4, 12, 16, 24 };
928 GetBitContext *gb = &s->gb;
932 /* [DIRAC_STD] 11.2.2 Block parameters. block_parameters() */
933 /* Luma and Chroma are equal. 11.2.3 */
934 idx = svq3_get_ue_golomb(gb); /* [DIRAC_STD] index */
937 av_log(s->avctx, AV_LOG_ERROR, "Block prediction index too high\n");
938 return AVERROR_INVALIDDATA;
942 s->plane[0].xblen = svq3_get_ue_golomb(gb);
943 s->plane[0].yblen = svq3_get_ue_golomb(gb);
944 s->plane[0].xbsep = svq3_get_ue_golomb(gb);
945 s->plane[0].ybsep = svq3_get_ue_golomb(gb);
947 /*[DIRAC_STD] preset_block_params(index). Table 11.1 */
948 s->plane[0].xblen = default_blen[idx-1];
949 s->plane[0].yblen = default_blen[idx-1];
950 s->plane[0].xbsep = 4 * idx;
951 s->plane[0].ybsep = 4 * idx;
953 /*[DIRAC_STD] 11.2.4 motion_data_dimensions()
954 Calculated in function dirac_unpack_block_motion_data */
956 if (s->plane[0].xblen % (1 << s->chroma_x_shift) != 0 ||
957 s->plane[0].yblen % (1 << s->chroma_y_shift) != 0 ||
958 !s->plane[0].xblen || !s->plane[0].yblen) {
959 av_log(s->avctx, AV_LOG_ERROR,
960 "invalid x/y block length (%d/%d) for x/y chroma shift (%d/%d)\n",
961 s->plane[0].xblen, s->plane[0].yblen, s->chroma_x_shift, s->chroma_y_shift);
962 return AVERROR_INVALIDDATA;
964 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) {
965 av_log(s->avctx, AV_LOG_ERROR, "Block separation too small\n");
966 return AVERROR_INVALIDDATA;
968 if (s->plane[0].xbsep > s->plane[0].xblen || s->plane[0].ybsep > s->plane[0].yblen) {
969 av_log(s->avctx, AV_LOG_ERROR, "Block separation greater than size\n");
970 return AVERROR_INVALIDDATA;
972 if (FFMAX(s->plane[0].xblen, s->plane[0].yblen) > MAX_BLOCKSIZE) {
973 av_log(s->avctx, AV_LOG_ERROR, "Unsupported large block size\n");
974 return AVERROR_PATCHWELCOME;
977 /*[DIRAC_STD] 11.2.5 Motion vector precision. motion_vector_precision()
978 Read motion vector precision */
979 s->mv_precision = svq3_get_ue_golomb(gb);
980 if (s->mv_precision > 3) {
981 av_log(s->avctx, AV_LOG_ERROR, "MV precision finer than eighth-pel\n");
982 return AVERROR_INVALIDDATA;
985 /*[DIRAC_STD] 11.2.6 Global motion. global_motion()
986 Read the global motion compensation parameters */
987 s->globalmc_flag = get_bits1(gb);
988 if (s->globalmc_flag) {
989 memset(s->globalmc, 0, sizeof(s->globalmc));
990 /* [DIRAC_STD] pan_tilt(gparams) */
991 for (ref = 0; ref < s->num_refs; ref++) {
993 s->globalmc[ref].pan_tilt[0] = dirac_get_se_golomb(gb);
994 s->globalmc[ref].pan_tilt[1] = dirac_get_se_golomb(gb);
996 /* [DIRAC_STD] zoom_rotate_shear(gparams)
997 zoom/rotation/shear parameters */
999 s->globalmc[ref].zrs_exp = svq3_get_ue_golomb(gb);
1000 s->globalmc[ref].zrs[0][0] = dirac_get_se_golomb(gb);
1001 s->globalmc[ref].zrs[0][1] = dirac_get_se_golomb(gb);
1002 s->globalmc[ref].zrs[1][0] = dirac_get_se_golomb(gb);
1003 s->globalmc[ref].zrs[1][1] = dirac_get_se_golomb(gb);
1005 s->globalmc[ref].zrs[0][0] = 1;
1006 s->globalmc[ref].zrs[1][1] = 1;
1008 /* [DIRAC_STD] perspective(gparams) */
1009 if (get_bits1(gb)) {
1010 s->globalmc[ref].perspective_exp = svq3_get_ue_golomb(gb);
1011 s->globalmc[ref].perspective[0] = dirac_get_se_golomb(gb);
1012 s->globalmc[ref].perspective[1] = dirac_get_se_golomb(gb);
1017 /*[DIRAC_STD] 11.2.7 Picture prediction mode. prediction_mode()
1018 Picture prediction mode, not currently used. */
1019 if (svq3_get_ue_golomb(gb)) {
1020 av_log(s->avctx, AV_LOG_ERROR, "Unknown picture prediction mode\n");
1021 return AVERROR_INVALIDDATA;
1024 /* [DIRAC_STD] 11.2.8 Reference picture weight. reference_picture_weights()
1025 just data read, weight calculation will be done later on. */
1026 s->weight_log2denom = 1;
1030 if (get_bits1(gb)) {
1031 s->weight_log2denom = svq3_get_ue_golomb(gb);
1032 s->weight[0] = dirac_get_se_golomb(gb);
1033 if (s->num_refs == 2)
1034 s->weight[1] = dirac_get_se_golomb(gb);
1040 * Dirac Specification ->
1041 * 11.3 Wavelet transform data. wavelet_transform()
1043 static int dirac_unpack_idwt_params(DiracContext *s)
1045 GetBitContext *gb = &s->gb;
1049 #define CHECKEDREAD(dst, cond, errmsg) \
1050 tmp = svq3_get_ue_golomb(gb); \
1052 av_log(s->avctx, AV_LOG_ERROR, errmsg); \
1053 return AVERROR_INVALIDDATA; \
1059 s->zero_res = s->num_refs ? get_bits1(gb) : 0;
1063 /*[DIRAC_STD] 11.3.1 Transform parameters. transform_parameters() */
1064 CHECKEDREAD(s->wavelet_idx, tmp > 6, "wavelet_idx is too big\n")
1066 CHECKEDREAD(s->wavelet_depth, tmp > MAX_DWT_LEVELS || tmp < 1, "invalid number of DWT decompositions\n")
1068 if (!s->low_delay) {
1069 /* Codeblock parameters (core syntax only) */
1070 if (get_bits1(gb)) {
1071 for (i = 0; i <= s->wavelet_depth; i++) {
1072 CHECKEDREAD(s->codeblock[i].width , tmp < 1 || tmp > (s->avctx->width >>s->wavelet_depth-i), "codeblock width invalid\n")
1073 CHECKEDREAD(s->codeblock[i].height, tmp < 1 || tmp > (s->avctx->height>>s->wavelet_depth-i), "codeblock height invalid\n")
1076 CHECKEDREAD(s->codeblock_mode, tmp > 1, "unknown codeblock mode\n")
1078 for (i = 0; i <= s->wavelet_depth; i++)
1079 s->codeblock[i].width = s->codeblock[i].height = 1;
1081 /* Slice parameters + quantization matrix*/
1082 /*[DIRAC_STD] 11.3.4 Slice coding Parameters (low delay syntax only). slice_parameters() */
1083 s->num_x = svq3_get_ue_golomb(gb);
1084 s->num_y = svq3_get_ue_golomb(gb);
1085 s->lowdelay.bytes.num = svq3_get_ue_golomb(gb);
1086 s->lowdelay.bytes.den = svq3_get_ue_golomb(gb);
1088 if (s->lowdelay.bytes.den <= 0) {
1089 av_log(s->avctx,AV_LOG_ERROR,"Invalid lowdelay.bytes.den\n");
1090 return AVERROR_INVALIDDATA;
1093 /* [DIRAC_STD] 11.3.5 Quantisation matrices (low-delay syntax). quant_matrix() */
1094 if (get_bits1(gb)) {
1095 av_log(s->avctx,AV_LOG_DEBUG,"Low Delay: Has Custom Quantization Matrix!\n");
1096 /* custom quantization matrix */
1097 s->lowdelay.quant[0][0] = svq3_get_ue_golomb(gb);
1098 for (level = 0; level < s->wavelet_depth; level++) {
1099 s->lowdelay.quant[level][1] = svq3_get_ue_golomb(gb);
1100 s->lowdelay.quant[level][2] = svq3_get_ue_golomb(gb);
1101 s->lowdelay.quant[level][3] = svq3_get_ue_golomb(gb);
1104 if (s->wavelet_depth > 4) {
1105 av_log(s->avctx,AV_LOG_ERROR,"Mandatory custom low delay matrix missing for depth %d\n", s->wavelet_depth);
1106 return AVERROR_INVALIDDATA;
1108 /* default quantization matrix */
1109 for (level = 0; level < s->wavelet_depth; level++)
1110 for (i = 0; i < 4; i++) {
1111 s->lowdelay.quant[level][i] = default_qmat[s->wavelet_idx][level][i];
1112 /* haar with no shift differs for different depths */
1113 if (s->wavelet_idx == 3)
1114 s->lowdelay.quant[level][i] += 4*(s->wavelet_depth-1 - level);
1121 static inline int pred_sbsplit(uint8_t *sbsplit, int stride, int x, int y)
1123 static const uint8_t avgsplit[7] = { 0, 0, 1, 1, 1, 2, 2 };
1130 return sbsplit[-stride];
1132 return avgsplit[sbsplit[-1] + sbsplit[-stride] + sbsplit[-stride-1]];
1135 static inline int pred_block_mode(DiracBlock *block, int stride, int x, int y, int refmask)
1142 return block[-1].ref & refmask;
1144 return block[-stride].ref & refmask;
1146 /* return the majority */
1147 pred = (block[-1].ref & refmask) + (block[-stride].ref & refmask) + (block[-stride-1].ref & refmask);
1148 return (pred >> 1) & refmask;
1151 static inline void pred_block_dc(DiracBlock *block, int stride, int x, int y)
1155 memset(block->u.dc, 0, sizeof(block->u.dc));
1157 if (x && !(block[-1].ref & 3)) {
1158 for (i = 0; i < 3; i++)
1159 block->u.dc[i] += block[-1].u.dc[i];
1163 if (y && !(block[-stride].ref & 3)) {
1164 for (i = 0; i < 3; i++)
1165 block->u.dc[i] += block[-stride].u.dc[i];
1169 if (x && y && !(block[-1-stride].ref & 3)) {
1170 for (i = 0; i < 3; i++)
1171 block->u.dc[i] += block[-1-stride].u.dc[i];
1176 for (i = 0; i < 3; i++)
1177 block->u.dc[i] = (block->u.dc[i]+1)>>1;
1178 } else if (n == 3) {
1179 for (i = 0; i < 3; i++)
1180 block->u.dc[i] = divide3(block->u.dc[i]);
1184 static inline void pred_mv(DiracBlock *block, int stride, int x, int y, int ref)
1187 int refmask = ref+1;
1188 int mask = refmask | DIRAC_REF_MASK_GLOBAL; /* exclude gmc blocks */
1191 if (x && (block[-1].ref & mask) == refmask)
1192 pred[n++] = block[-1].u.mv[ref];
1194 if (y && (block[-stride].ref & mask) == refmask)
1195 pred[n++] = block[-stride].u.mv[ref];
1197 if (x && y && (block[-stride-1].ref & mask) == refmask)
1198 pred[n++] = block[-stride-1].u.mv[ref];
1202 block->u.mv[ref][0] = 0;
1203 block->u.mv[ref][1] = 0;
1206 block->u.mv[ref][0] = pred[0][0];
1207 block->u.mv[ref][1] = pred[0][1];
1210 block->u.mv[ref][0] = (pred[0][0] + pred[1][0] + 1) >> 1;
1211 block->u.mv[ref][1] = (pred[0][1] + pred[1][1] + 1) >> 1;
1214 block->u.mv[ref][0] = mid_pred(pred[0][0], pred[1][0], pred[2][0]);
1215 block->u.mv[ref][1] = mid_pred(pred[0][1], pred[1][1], pred[2][1]);
1220 static void global_mv(DiracContext *s, DiracBlock *block, int x, int y, int ref)
1222 int ez = s->globalmc[ref].zrs_exp;
1223 int ep = s->globalmc[ref].perspective_exp;
1224 int (*A)[2] = s->globalmc[ref].zrs;
1225 int *b = s->globalmc[ref].pan_tilt;
1226 int *c = s->globalmc[ref].perspective;
1228 int m = (1<<ep) - (c[0]*x + c[1]*y);
1229 int mx = m * ((A[0][0] * x + A[0][1]*y) + (1<<ez) * b[0]);
1230 int my = m * ((A[1][0] * x + A[1][1]*y) + (1<<ez) * b[1]);
1232 block->u.mv[ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep);
1233 block->u.mv[ref][1] = (my + (1<<(ez+ep))) >> (ez+ep);
1236 static void decode_block_params(DiracContext *s, DiracArith arith[8], DiracBlock *block,
1237 int stride, int x, int y)
1241 block->ref = pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF1);
1242 block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF1);
1244 if (s->num_refs == 2) {
1245 block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF2);
1246 block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF2) << 1;
1250 pred_block_dc(block, stride, x, y);
1251 for (i = 0; i < 3; i++)
1252 block->u.dc[i] += dirac_get_arith_int(arith+1+i, CTX_DC_F1, CTX_DC_DATA);
1256 if (s->globalmc_flag) {
1257 block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_GLOBAL);
1258 block->ref ^= dirac_get_arith_bit(arith, CTX_GLOBAL_BLOCK) << 2;
1261 for (i = 0; i < s->num_refs; i++)
1262 if (block->ref & (i+1)) {
1263 if (block->ref & DIRAC_REF_MASK_GLOBAL) {
1264 global_mv(s, block, x, y, i);
1266 pred_mv(block, stride, x, y, i);
1267 block->u.mv[i][0] += dirac_get_arith_int(arith + 4 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
1268 block->u.mv[i][1] += dirac_get_arith_int(arith + 5 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
1274 * Copies the current block to the other blocks covered by the current superblock split mode
1276 static void propagate_block_data(DiracBlock *block, int stride, int size)
1279 DiracBlock *dst = block;
1281 for (x = 1; x < size; x++)
1284 for (y = 1; y < size; y++) {
1286 for (x = 0; x < size; x++)
1292 * Dirac Specification ->
1293 * 12. Block motion data syntax
1295 static int dirac_unpack_block_motion_data(DiracContext *s)
1297 GetBitContext *gb = &s->gb;
1298 uint8_t *sbsplit = s->sbsplit;
1300 DiracArith arith[8];
1304 /* [DIRAC_STD] 11.2.4 and 12.2.1 Number of blocks and superblocks */
1305 s->sbwidth = DIVRNDUP(s->source.width, 4*s->plane[0].xbsep);
1306 s->sbheight = DIVRNDUP(s->source.height, 4*s->plane[0].ybsep);
1307 s->blwidth = 4 * s->sbwidth;
1308 s->blheight = 4 * s->sbheight;
1310 /* [DIRAC_STD] 12.3.1 Superblock splitting modes. superblock_split_modes()
1311 decode superblock split modes */
1312 ff_dirac_init_arith_decoder(arith, gb, svq3_get_ue_golomb(gb)); /* svq3_get_ue_golomb(gb) is the length */
1313 for (y = 0; y < s->sbheight; y++) {
1314 for (x = 0; x < s->sbwidth; x++) {
1315 unsigned int split = dirac_get_arith_uint(arith, CTX_SB_F1, CTX_SB_DATA);
1317 return AVERROR_INVALIDDATA;
1318 sbsplit[x] = (split + pred_sbsplit(sbsplit+x, s->sbwidth, x, y)) % 3;
1320 sbsplit += s->sbwidth;
1323 /* setup arith decoding */
1324 ff_dirac_init_arith_decoder(arith, gb, svq3_get_ue_golomb(gb));
1325 for (i = 0; i < s->num_refs; i++) {
1326 ff_dirac_init_arith_decoder(arith + 4 + 2 * i, gb, svq3_get_ue_golomb(gb));
1327 ff_dirac_init_arith_decoder(arith + 5 + 2 * i, gb, svq3_get_ue_golomb(gb));
1329 for (i = 0; i < 3; i++)
1330 ff_dirac_init_arith_decoder(arith+1+i, gb, svq3_get_ue_golomb(gb));
1332 for (y = 0; y < s->sbheight; y++)
1333 for (x = 0; x < s->sbwidth; x++) {
1334 int blkcnt = 1 << s->sbsplit[y * s->sbwidth + x];
1335 int step = 4 >> s->sbsplit[y * s->sbwidth + x];
1337 for (q = 0; q < blkcnt; q++)
1338 for (p = 0; p < blkcnt; p++) {
1339 int bx = 4 * x + p*step;
1340 int by = 4 * y + q*step;
1341 DiracBlock *block = &s->blmotion[by*s->blwidth + bx];
1342 decode_block_params(s, arith, block, s->blwidth, bx, by);
1343 propagate_block_data(block, s->blwidth, step);
1350 static int weight(int i, int blen, int offset)
1352 #define ROLLOFF(i) offset == 1 ? ((i) ? 5 : 3) : \
1353 (1 + (6*(i) + offset - 1) / (2*offset - 1))
1357 else if (i > blen-1 - 2*offset)
1358 return ROLLOFF(blen-1 - i);
1362 static void init_obmc_weight_row(Plane *p, uint8_t *obmc_weight, int stride,
1363 int left, int right, int wy)
1366 for (x = 0; left && x < p->xblen >> 1; x++)
1367 obmc_weight[x] = wy*8;
1368 for (; x < p->xblen >> right; x++)
1369 obmc_weight[x] = wy*weight(x, p->xblen, p->xoffset);
1370 for (; x < p->xblen; x++)
1371 obmc_weight[x] = wy*8;
1372 for (; x < stride; x++)
1376 static void init_obmc_weight(Plane *p, uint8_t *obmc_weight, int stride,
1377 int left, int right, int top, int bottom)
1380 for (y = 0; top && y < p->yblen >> 1; y++) {
1381 init_obmc_weight_row(p, obmc_weight, stride, left, right, 8);
1382 obmc_weight += stride;
1384 for (; y < p->yblen >> bottom; y++) {
1385 int wy = weight(y, p->yblen, p->yoffset);
1386 init_obmc_weight_row(p, obmc_weight, stride, left, right, wy);
1387 obmc_weight += stride;
1389 for (; y < p->yblen; y++) {
1390 init_obmc_weight_row(p, obmc_weight, stride, left, right, 8);
1391 obmc_weight += stride;
1395 static void init_obmc_weights(DiracContext *s, Plane *p, int by)
1398 int bottom = by == s->blheight-1;
1400 /* don't bother re-initing for rows 2 to blheight-2, the weights don't change */
1401 if (top || bottom || by == 1) {
1402 init_obmc_weight(p, s->obmc_weight[0], MAX_BLOCKSIZE, 1, 0, top, bottom);
1403 init_obmc_weight(p, s->obmc_weight[1], MAX_BLOCKSIZE, 0, 0, top, bottom);
1404 init_obmc_weight(p, s->obmc_weight[2], MAX_BLOCKSIZE, 0, 1, top, bottom);
1408 static const uint8_t epel_weights[4][4][4] = {
1428 * For block x,y, determine which of the hpel planes to do bilinear
1429 * interpolation from and set src[] to the location in each hpel plane
1432 * @return the index of the put_dirac_pixels_tab function to use
1433 * 0 for 1 plane (fpel,hpel), 1 for 2 planes (qpel), 2 for 4 planes (qpel), and 3 for epel
1435 static int mc_subpel(DiracContext *s, DiracBlock *block, const uint8_t *src[5],
1436 int x, int y, int ref, int plane)
1438 Plane *p = &s->plane[plane];
1439 uint8_t **ref_hpel = s->ref_pics[ref]->hpel[plane];
1440 int motion_x = block->u.mv[ref][0];
1441 int motion_y = block->u.mv[ref][1];
1442 int mx, my, i, epel, nplanes = 0;
1445 motion_x >>= s->chroma_x_shift;
1446 motion_y >>= s->chroma_y_shift;
1449 mx = motion_x & ~(-1U << s->mv_precision);
1450 my = motion_y & ~(-1U << s->mv_precision);
1451 motion_x >>= s->mv_precision;
1452 motion_y >>= s->mv_precision;
1453 /* normalize subpel coordinates to epel */
1454 /* TODO: template this function? */
1455 mx <<= 3 - s->mv_precision;
1456 my <<= 3 - s->mv_precision;
1465 src[0] = ref_hpel[(my>>1)+(mx>>2)] + y*p->stride + x;
1469 for (i = 0; i < 4; i++)
1470 src[i] = ref_hpel[i] + y*p->stride + x;
1472 /* if we're interpolating in the right/bottom halves, adjust the planes as needed
1473 we increment x/y because the edge changes for half of the pixels */
1480 src[0] += p->stride;
1481 src[1] += p->stride;
1489 /* check if we really only need 2 planes since either mx or my is
1490 a hpel position. (epel weights of 0 handle this there) */
1492 /* mx == 0: average [0] and [2]
1493 mx == 4: average [1] and [3] */
1494 src[!mx] = src[2 + !!mx];
1496 } else if (!(my&3)) {
1497 src[0] = src[(my>>1) ];
1498 src[1] = src[(my>>1)+1];
1502 /* adjust the ordering if needed so the weights work */
1504 FFSWAP(const uint8_t *, src[0], src[1]);
1505 FFSWAP(const uint8_t *, src[2], src[3]);
1508 FFSWAP(const uint8_t *, src[0], src[2]);
1509 FFSWAP(const uint8_t *, src[1], src[3]);
1511 src[4] = epel_weights[my&3][mx&3];
1515 /* fixme: v/h _edge_pos */
1516 if (x + p->xblen > p->width +EDGE_WIDTH/2 ||
1517 y + p->yblen > p->height+EDGE_WIDTH/2 ||
1519 for (i = 0; i < nplanes; i++) {
1520 s->vdsp.emulated_edge_mc(s->edge_emu_buffer[i], src[i],
1521 p->stride, p->stride,
1522 p->xblen, p->yblen, x, y,
1523 p->width+EDGE_WIDTH/2, p->height+EDGE_WIDTH/2);
1524 src[i] = s->edge_emu_buffer[i];
1527 return (nplanes>>1) + epel;
1530 static void add_dc(uint16_t *dst, int dc, int stride,
1531 uint8_t *obmc_weight, int xblen, int yblen)
1536 for (y = 0; y < yblen; y++) {
1537 for (x = 0; x < xblen; x += 2) {
1538 dst[x ] += dc * obmc_weight[x ];
1539 dst[x+1] += dc * obmc_weight[x+1];
1542 obmc_weight += MAX_BLOCKSIZE;
1546 static void block_mc(DiracContext *s, DiracBlock *block,
1547 uint16_t *mctmp, uint8_t *obmc_weight,
1548 int plane, int dstx, int dsty)
1550 Plane *p = &s->plane[plane];
1551 const uint8_t *src[5];
1554 switch (block->ref&3) {
1556 add_dc(mctmp, block->u.dc[plane], p->stride, obmc_weight, p->xblen, p->yblen);
1560 idx = mc_subpel(s, block, src, dstx, dsty, (block->ref&3)-1, plane);
1561 s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1563 s->weight_func(s->mcscratch, p->stride, s->weight_log2denom,
1564 s->weight[0] + s->weight[1], p->yblen);
1567 idx = mc_subpel(s, block, src, dstx, dsty, 0, plane);
1568 s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1569 idx = mc_subpel(s, block, src, dstx, dsty, 1, plane);
1570 if (s->biweight_func) {
1571 /* fixme: +32 is a quick hack */
1572 s->put_pixels_tab[idx](s->mcscratch + 32, src, p->stride, p->yblen);
1573 s->biweight_func(s->mcscratch, s->mcscratch+32, p->stride, s->weight_log2denom,
1574 s->weight[0], s->weight[1], p->yblen);
1576 s->avg_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1579 s->add_obmc(mctmp, s->mcscratch, p->stride, obmc_weight, p->yblen);
1582 static void mc_row(DiracContext *s, DiracBlock *block, uint16_t *mctmp, int plane, int dsty)
1584 Plane *p = &s->plane[plane];
1585 int x, dstx = p->xbsep - p->xoffset;
1587 block_mc(s, block, mctmp, s->obmc_weight[0], plane, -p->xoffset, dsty);
1590 for (x = 1; x < s->blwidth-1; x++) {
1591 block_mc(s, block+x, mctmp, s->obmc_weight[1], plane, dstx, dsty);
1595 block_mc(s, block+x, mctmp, s->obmc_weight[2], plane, dstx, dsty);
1598 static void select_dsp_funcs(DiracContext *s, int width, int height, int xblen, int yblen)
1606 memcpy(s->put_pixels_tab, s->diracdsp.put_dirac_pixels_tab[idx], sizeof(s->put_pixels_tab));
1607 memcpy(s->avg_pixels_tab, s->diracdsp.avg_dirac_pixels_tab[idx], sizeof(s->avg_pixels_tab));
1608 s->add_obmc = s->diracdsp.add_dirac_obmc[idx];
1609 if (s->weight_log2denom > 1 || s->weight[0] != 1 || s->weight[1] != 1) {
1610 s->weight_func = s->diracdsp.weight_dirac_pixels_tab[idx];
1611 s->biweight_func = s->diracdsp.biweight_dirac_pixels_tab[idx];
1613 s->weight_func = NULL;
1614 s->biweight_func = NULL;
1618 static int interpolate_refplane(DiracContext *s, DiracFrame *ref, int plane, int width, int height)
1620 /* chroma allocates an edge of 8 when subsampled
1621 which for 4:2:2 means an h edge of 16 and v edge of 8
1622 just use 8 for everything for the moment */
1623 int i, edge = EDGE_WIDTH/2;
1625 ref->hpel[plane][0] = ref->avframe->data[plane];
1626 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 */
1628 /* no need for hpel if we only have fpel vectors */
1629 if (!s->mv_precision)
1632 for (i = 1; i < 4; i++) {
1633 if (!ref->hpel_base[plane][i])
1634 ref->hpel_base[plane][i] = av_malloc((height+2*edge) * ref->avframe->linesize[plane] + 32);
1635 if (!ref->hpel_base[plane][i]) {
1636 return AVERROR(ENOMEM);
1638 /* we need to be 16-byte aligned even for chroma */
1639 ref->hpel[plane][i] = ref->hpel_base[plane][i] + edge*ref->avframe->linesize[plane] + 16;
1642 if (!ref->interpolated[plane]) {
1643 s->diracdsp.dirac_hpel_filter(ref->hpel[plane][1], ref->hpel[plane][2],
1644 ref->hpel[plane][3], ref->hpel[plane][0],
1645 ref->avframe->linesize[plane], width, height);
1646 s->mpvencdsp.draw_edges(ref->hpel[plane][1], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1647 s->mpvencdsp.draw_edges(ref->hpel[plane][2], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1648 s->mpvencdsp.draw_edges(ref->hpel[plane][3], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1650 ref->interpolated[plane] = 1;
1656 * Dirac Specification ->
1657 * 13.0 Transform data syntax. transform_data()
1659 static int dirac_decode_frame_internal(DiracContext *s)
1662 int y, i, comp, dsty;
1666 /* [DIRAC_STD] 13.5.1 low_delay_transform_data() */
1667 for (comp = 0; comp < 3; comp++) {
1668 Plane *p = &s->plane[comp];
1669 memset(p->idwt_buf, 0, p->idwt_stride * p->idwt_height);
1672 if ((ret = decode_lowdelay(s)) < 0)
1677 for (comp = 0; comp < 3; comp++) {
1678 Plane *p = &s->plane[comp];
1679 uint8_t *frame = s->current_picture->avframe->data[comp];
1681 /* FIXME: small resolutions */
1682 for (i = 0; i < 4; i++)
1683 s->edge_emu_buffer[i] = s->edge_emu_buffer_base + i*FFALIGN(p->width, 16);
1685 if (!s->zero_res && !s->low_delay)
1687 memset(p->idwt_buf, 0, p->idwt_stride * p->idwt_height);
1688 decode_component(s, comp); /* [DIRAC_STD] 13.4.1 core_transform_data() */
1690 ret = ff_spatial_idwt_init2(&d, p->idwt_buf, p->idwt_width, p->idwt_height, p->idwt_stride,
1691 s->wavelet_idx+2, s->wavelet_depth, p->idwt_tmp, s->bit_depth);
1695 if (!s->num_refs) { /* intra */
1696 for (y = 0; y < p->height; y += 16) {
1697 ff_spatial_idwt_slice2(&d, y+16); /* decode */
1698 s->diracdsp.put_signed_rect_clamped[s->pshift](frame + y*p->stride, p->stride,
1699 p->idwt_buf + y*p->idwt_stride, p->idwt_stride, p->width, 16);
1701 } else { /* inter */
1702 int rowheight = p->ybsep*p->stride;
1704 select_dsp_funcs(s, p->width, p->height, p->xblen, p->yblen);
1706 for (i = 0; i < s->num_refs; i++) {
1707 int ret = interpolate_refplane(s, s->ref_pics[i], comp, p->width, p->height);
1712 memset(s->mctmp, 0, 4*p->yoffset*p->stride);
1715 for (y = 0; y < s->blheight; y++) {
1717 start = FFMAX(dsty, 0);
1718 uint16_t *mctmp = s->mctmp + y*rowheight;
1719 DiracBlock *blocks = s->blmotion + y*s->blwidth;
1721 init_obmc_weights(s, p, y);
1723 if (y == s->blheight-1 || start+p->ybsep > p->height)
1724 h = p->height - start;
1726 h = p->ybsep - (start - dsty);
1730 memset(mctmp+2*p->yoffset*p->stride, 0, 2*rowheight);
1731 mc_row(s, blocks, mctmp, comp, dsty);
1733 mctmp += (start - dsty)*p->stride + p->xoffset;
1734 ff_spatial_idwt_slice2(&d, start + h); /* decode */
1735 /* NOTE: add_rect_clamped hasn't been templated hence the shifts.
1736 * idwt_stride is passed as pixels, not in bytes as in the rest of the decoder */
1737 s->diracdsp.add_rect_clamped(frame + start*p->stride, mctmp, p->stride,
1738 (int16_t*)(p->idwt_buf) + start*(p->idwt_stride >> 1), (p->idwt_stride >> 1), p->width, h);
1749 static int get_buffer_with_edge(AVCodecContext *avctx, AVFrame *f, int flags)
1752 int chroma_x_shift, chroma_y_shift;
1753 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_x_shift, &chroma_y_shift);
1755 f->width = avctx->width + 2 * EDGE_WIDTH;
1756 f->height = avctx->height + 2 * EDGE_WIDTH + 2;
1757 ret = ff_get_buffer(avctx, f, flags);
1761 for (i = 0; f->data[i]; i++) {
1762 int offset = (EDGE_WIDTH >> (i && i<3 ? chroma_y_shift : 0)) *
1763 f->linesize[i] + 32;
1764 f->data[i] += offset;
1766 f->width = avctx->width;
1767 f->height = avctx->height;
1773 * Dirac Specification ->
1774 * 11.1.1 Picture Header. picture_header()
1776 static int dirac_decode_picture_header(DiracContext *s)
1778 unsigned retire, picnum;
1780 int64_t refdist, refnum;
1781 GetBitContext *gb = &s->gb;
1783 /* [DIRAC_STD] 11.1.1 Picture Header. picture_header() PICTURE_NUM */
1784 picnum = s->current_picture->avframe->display_picture_number = get_bits_long(gb, 32);
1787 av_log(s->avctx,AV_LOG_DEBUG,"PICTURE_NUM: %d\n",picnum);
1789 /* if this is the first keyframe after a sequence header, start our
1790 reordering from here */
1791 if (s->frame_number < 0)
1792 s->frame_number = picnum;
1794 s->ref_pics[0] = s->ref_pics[1] = NULL;
1795 for (i = 0; i < s->num_refs; i++) {
1796 refnum = (picnum + dirac_get_se_golomb(gb)) & 0xFFFFFFFF;
1797 refdist = INT64_MAX;
1799 /* find the closest reference to the one we want */
1800 /* Jordi: this is needed if the referenced picture hasn't yet arrived */
1801 for (j = 0; j < MAX_REFERENCE_FRAMES && refdist; j++)
1802 if (s->ref_frames[j]
1803 && FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum) < refdist) {
1804 s->ref_pics[i] = s->ref_frames[j];
1805 refdist = FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum);
1808 if (!s->ref_pics[i] || refdist)
1809 av_log(s->avctx, AV_LOG_DEBUG, "Reference not found\n");
1811 /* if there were no references at all, allocate one */
1812 if (!s->ref_pics[i])
1813 for (j = 0; j < MAX_FRAMES; j++)
1814 if (!s->all_frames[j].avframe->data[0]) {
1815 s->ref_pics[i] = &s->all_frames[j];
1816 get_buffer_with_edge(s->avctx, s->ref_pics[i]->avframe, AV_GET_BUFFER_FLAG_REF);
1820 if (!s->ref_pics[i]) {
1821 av_log(s->avctx, AV_LOG_ERROR, "Reference could not be allocated\n");
1822 return AVERROR_INVALIDDATA;
1827 /* retire the reference frames that are not used anymore */
1828 if (s->current_picture->reference) {
1829 retire = (picnum + dirac_get_se_golomb(gb)) & 0xFFFFFFFF;
1830 if (retire != picnum) {
1831 DiracFrame *retire_pic = remove_frame(s->ref_frames, retire);
1834 retire_pic->reference &= DELAYED_PIC_REF;
1836 av_log(s->avctx, AV_LOG_DEBUG, "Frame to retire not found\n");
1839 /* if reference array is full, remove the oldest as per the spec */
1840 while (add_frame(s->ref_frames, MAX_REFERENCE_FRAMES, s->current_picture)) {
1841 av_log(s->avctx, AV_LOG_ERROR, "Reference frame overflow\n");
1842 remove_frame(s->ref_frames, s->ref_frames[0]->avframe->display_picture_number)->reference &= DELAYED_PIC_REF;
1847 ret = dirac_unpack_prediction_parameters(s); /* [DIRAC_STD] 11.2 Picture Prediction Data. picture_prediction() */
1850 ret = dirac_unpack_block_motion_data(s); /* [DIRAC_STD] 12. Block motion data syntax */
1854 ret = dirac_unpack_idwt_params(s); /* [DIRAC_STD] 11.3 Wavelet transform data */
1862 static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame)
1864 DiracFrame *out = s->delay_frames[0];
1868 /* find frame with lowest picture number */
1869 for (i = 1; s->delay_frames[i]; i++)
1870 if (s->delay_frames[i]->avframe->display_picture_number < out->avframe->display_picture_number) {
1871 out = s->delay_frames[i];
1875 for (i = out_idx; s->delay_frames[i]; i++)
1876 s->delay_frames[i] = s->delay_frames[i+1];
1879 out->reference ^= DELAYED_PIC_REF;
1881 if((ret = av_frame_ref(picture, out->avframe)) < 0)
1889 * Dirac Specification ->
1890 * 9.6 Parse Info Header Syntax. parse_info()
1891 * 4 byte start code + byte parse code + 4 byte size + 4 byte previous size
1893 #define DATA_UNIT_HEADER_SIZE 13
1895 /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3
1896 inside the function parse_sequence() */
1897 static int dirac_decode_data_unit(AVCodecContext *avctx, const uint8_t *buf, int size)
1899 DiracContext *s = avctx->priv_data;
1900 DiracFrame *pic = NULL;
1901 int ret, i, parse_code;
1904 if (size < DATA_UNIT_HEADER_SIZE)
1905 return AVERROR_INVALIDDATA;
1907 parse_code = buf[4];
1909 init_get_bits(&s->gb, &buf[13], 8*(size - DATA_UNIT_HEADER_SIZE));
1911 if (parse_code == pc_seq_header) {
1912 if (s->seen_sequence_header)
1915 /* [DIRAC_STD] 10. Sequence header */
1916 ret = avpriv_dirac_parse_sequence_header(avctx, &s->gb, &s->source,
1921 s->pshift = s->bit_depth > 8;
1923 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_x_shift, &s->chroma_y_shift);
1925 ret = alloc_sequence_buffers(s);
1929 s->seen_sequence_header = 1;
1930 } else if (parse_code == pc_eos) { /* [DIRAC_STD] End of Sequence */
1931 free_sequence_buffers(s);
1932 s->seen_sequence_header = 0;
1933 } else if (parse_code == pc_aux_data) {
1934 if (buf[13] == 1) { /* encoder implementation/version */
1936 /* versions older than 1.0.8 don't store quant delta for
1937 subbands with only one codeblock */
1938 if (sscanf(buf+14, "Schroedinger %d.%d.%d", ver, ver+1, ver+2) == 3)
1939 if (ver[0] == 1 && ver[1] == 0 && ver[2] <= 7)
1940 s->old_delta_quant = 1;
1942 } else if (parse_code & 0x8) { /* picture data unit */
1943 if (!s->seen_sequence_header) {
1944 av_log(avctx, AV_LOG_DEBUG, "Dropping frame without sequence header\n");
1945 return AVERROR_INVALIDDATA;
1948 /* find an unused frame */
1949 for (i = 0; i < MAX_FRAMES; i++)
1950 if (s->all_frames[i].avframe->data[0] == NULL)
1951 pic = &s->all_frames[i];
1953 av_log(avctx, AV_LOG_ERROR, "framelist full\n");
1954 return AVERROR_INVALIDDATA;
1957 av_frame_unref(pic->avframe);
1959 /* [DIRAC_STD] Defined in 9.6.1 ... */
1960 tmp = parse_code & 0x03; /* [DIRAC_STD] num_refs() */
1962 av_log(avctx, AV_LOG_ERROR, "num_refs of 3\n");
1963 return AVERROR_INVALIDDATA;
1966 s->is_arith = (parse_code & 0x48) == 0x08; /* [DIRAC_STD] using_ac() */
1967 s->low_delay = (parse_code & 0x88) == 0x88; /* [DIRAC_STD] is_low_delay() */
1968 pic->reference = (parse_code & 0x0C) == 0x0C; /* [DIRAC_STD] is_reference() */
1969 pic->avframe->key_frame = s->num_refs == 0; /* [DIRAC_STD] is_intra() */
1970 pic->avframe->pict_type = s->num_refs + 1; /* Definition of AVPictureType in avutil.h */
1972 if ((ret = get_buffer_with_edge(avctx, pic->avframe, (parse_code & 0x0C) == 0x0C ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
1974 s->current_picture = pic;
1975 s->plane[0].stride = pic->avframe->linesize[0];
1976 s->plane[1].stride = pic->avframe->linesize[1];
1977 s->plane[2].stride = pic->avframe->linesize[2];
1979 if (alloc_buffers(s, FFMAX3(FFABS(s->plane[0].stride), FFABS(s->plane[1].stride), FFABS(s->plane[2].stride))) < 0)
1980 return AVERROR(ENOMEM);
1982 /* [DIRAC_STD] 11.1 Picture parse. picture_parse() */
1983 ret = dirac_decode_picture_header(s);
1987 /* [DIRAC_STD] 13.0 Transform data syntax. transform_data() */
1988 ret = dirac_decode_frame_internal(s);
1995 static int dirac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *pkt)
1997 DiracContext *s = avctx->priv_data;
1998 AVFrame *picture = data;
1999 uint8_t *buf = pkt->data;
2000 int buf_size = pkt->size;
2003 unsigned data_unit_size;
2005 /* release unused frames */
2006 for (i = 0; i < MAX_FRAMES; i++)
2007 if (s->all_frames[i].avframe->data[0] && !s->all_frames[i].reference) {
2008 av_frame_unref(s->all_frames[i].avframe);
2009 memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
2012 s->current_picture = NULL;
2015 /* end of stream, so flush delayed pics */
2017 return get_delayed_pic(s, (AVFrame *)data, got_frame);
2020 /*[DIRAC_STD] Here starts the code from parse_info() defined in 9.6
2021 [DIRAC_STD] PARSE_INFO_PREFIX = "BBCD" as defined in ISO/IEC 646
2022 BBCD start code search */
2023 for (; buf_idx + DATA_UNIT_HEADER_SIZE < buf_size; buf_idx++) {
2024 if (buf[buf_idx ] == 'B' && buf[buf_idx+1] == 'B' &&
2025 buf[buf_idx+2] == 'C' && buf[buf_idx+3] == 'D')
2028 /* BBCD found or end of data */
2029 if (buf_idx + DATA_UNIT_HEADER_SIZE >= buf_size)
2032 data_unit_size = AV_RB32(buf+buf_idx+5);
2033 if (data_unit_size > buf_size - buf_idx || !data_unit_size) {
2034 if(data_unit_size > buf_size - buf_idx)
2035 av_log(s->avctx, AV_LOG_ERROR,
2036 "Data unit with size %d is larger than input buffer, discarding\n",
2041 /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3 inside the function parse_sequence() */
2042 ret = dirac_decode_data_unit(avctx, buf+buf_idx, data_unit_size);
2045 av_log(s->avctx, AV_LOG_ERROR,"Error in dirac_decode_data_unit\n");
2048 buf_idx += data_unit_size;
2051 if (!s->current_picture)
2054 if (s->current_picture->avframe->display_picture_number > s->frame_number) {
2055 DiracFrame *delayed_frame = remove_frame(s->delay_frames, s->frame_number);
2057 s->current_picture->reference |= DELAYED_PIC_REF;
2059 if (add_frame(s->delay_frames, MAX_DELAY, s->current_picture)) {
2060 int min_num = s->delay_frames[0]->avframe->display_picture_number;
2061 /* Too many delayed frames, so we display the frame with the lowest pts */
2062 av_log(avctx, AV_LOG_ERROR, "Delay frame overflow\n");
2064 for (i = 1; s->delay_frames[i]; i++)
2065 if (s->delay_frames[i]->avframe->display_picture_number < min_num)
2066 min_num = s->delay_frames[i]->avframe->display_picture_number;
2068 delayed_frame = remove_frame(s->delay_frames, min_num);
2069 add_frame(s->delay_frames, MAX_DELAY, s->current_picture);
2072 if (delayed_frame) {
2073 delayed_frame->reference ^= DELAYED_PIC_REF;
2074 if((ret=av_frame_ref(data, delayed_frame->avframe)) < 0)
2078 } else if (s->current_picture->avframe->display_picture_number == s->frame_number) {
2079 /* The right frame at the right time :-) */
2080 if((ret=av_frame_ref(data, s->current_picture->avframe)) < 0)
2086 s->frame_number = picture->display_picture_number + 1;
2091 AVCodec ff_dirac_decoder = {
2093 .long_name = NULL_IF_CONFIG_SMALL("BBC Dirac VC-2"),
2094 .type = AVMEDIA_TYPE_VIDEO,
2095 .id = AV_CODEC_ID_DIRAC,
2096 .priv_data_size = sizeof(DiracContext),
2097 .init = dirac_decode_init,
2098 .close = dirac_decode_end,
2099 .decode = dirac_decode_frame,
2100 .capabilities = AV_CODEC_CAP_DELAY,
2101 .flush = dirac_decode_flush,