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 255 /* 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;
143 DiracVersionInfo version;
145 AVDiracSeqHeader seq;
146 int seen_sequence_header;
147 int frame_number; /* number of the next frame to display */
152 int bit_depth; /* bit depth */
153 int pshift; /* pixel shift = bit_depth > 8 */
155 int zero_res; /* zero residue flag */
156 int is_arith; /* whether coeffs use arith or golomb coding */
157 int core_syntax; /* use core syntax only */
158 int low_delay; /* use the low delay syntax */
159 int hq_picture; /* high quality picture, enables low_delay */
160 int ld_picture; /* use low delay picture, turns on low_delay */
161 int dc_prediction; /* has dc prediction */
162 int globalmc_flag; /* use global motion compensation */
163 int num_refs; /* number of reference pictures */
165 /* wavelet decoding */
166 unsigned wavelet_depth; /* depth of the IDWT */
167 unsigned wavelet_idx;
170 * schroedinger older than 1.0.8 doesn't store
171 * quant delta if only one codebook exists in a band
173 unsigned old_delta_quant;
174 unsigned codeblock_mode;
176 unsigned num_x; /* number of horizontal slices */
177 unsigned num_y; /* number of vertical slices */
182 } codeblock[MAX_DWT_LEVELS+1];
185 AVRational bytes; /* average bytes per slice */
186 uint8_t quant[MAX_DWT_LEVELS][4]; /* [DIRAC_STD] E.1 */
190 unsigned prefix_bytes;
191 unsigned size_scaler;
195 int pan_tilt[2]; /* pan/tilt vector */
196 int zrs[2][2]; /* zoom/rotate/shear matrix */
197 int perspective[2]; /* perspective vector */
199 unsigned perspective_exp;
202 /* motion compensation */
203 uint8_t mv_precision; /* [DIRAC_STD] REFS_WT_PRECISION */
204 int16_t weight[2]; /* [DIRAC_STD] REF1_WT and REF2_WT */
205 unsigned weight_log2denom; /* [DIRAC_STD] REFS_WT_PRECISION */
207 int blwidth; /* number of blocks (horizontally) */
208 int blheight; /* number of blocks (vertically) */
209 int sbwidth; /* number of superblocks (horizontally) */
210 int sbheight; /* number of superblocks (vertically) */
213 DiracBlock *blmotion;
215 uint8_t *edge_emu_buffer[4];
216 uint8_t *edge_emu_buffer_base;
218 uint16_t *mctmp; /* buffer holding the MC data multiplied by OBMC weights */
222 DECLARE_ALIGNED(16, uint8_t, obmc_weight)[3][MAX_BLOCKSIZE*MAX_BLOCKSIZE];
224 void (*put_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h);
225 void (*avg_pixels_tab[4])(uint8_t *dst, const uint8_t *src[5], int stride, int h);
226 void (*add_obmc)(uint16_t *dst, const uint8_t *src, int stride, const uint8_t *obmc_weight, int yblen);
227 dirac_weight_func weight_func;
228 dirac_biweight_func biweight_func;
230 DiracFrame *current_picture;
231 DiracFrame *ref_pics[2];
233 DiracFrame *ref_frames[MAX_REFERENCE_FRAMES+1];
234 DiracFrame *delay_frames[MAX_DELAY+1];
235 DiracFrame all_frames[MAX_FRAMES];
246 static const uint8_t default_qmat[][4][4] = {
247 { { 5, 3, 3, 0}, { 0, 4, 4, 1}, { 0, 5, 5, 2}, { 0, 6, 6, 3} },
248 { { 4, 2, 2, 0}, { 0, 4, 4, 2}, { 0, 5, 5, 3}, { 0, 7, 7, 5} },
249 { { 5, 3, 3, 0}, { 0, 4, 4, 1}, { 0, 5, 5, 2}, { 0, 6, 6, 3} },
250 { { 8, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0} },
251 { { 8, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0}, { 0, 4, 4, 0} },
252 { { 0, 4, 4, 8}, { 0, 8, 8, 12}, { 0, 13, 13, 17}, { 0, 17, 17, 21} },
253 { { 3, 1, 1, 0}, { 0, 4, 4, 2}, { 0, 6, 6, 5}, { 0, 9, 9, 7} },
256 static const int32_t qscale_tab[128] = {
257 4, 5, 6, 7, 8, 10, 11, 13,
258 16, 19, 23, 27, 32, 38, 45, 54,
259 64, 76, 91, 108, 128, 152, 181, 215,
260 256, 304, 362, 431, 512, 609, 724, 861,
261 1024, 1218, 1448, 1722, 2048, 2435, 2896, 3444,
262 4096, 4871, 5793, 6889, 8192, 9742, 11585, 13777,
263 16384, 19484, -13317, 27554, 32768, -1581, 9853, -10518,
264 65536, -3164, -16782, -21037, 131072, -6328, 2922, 23552,
265 262144, -12658, 5844, -18524, 524288, 15232, 11689, 28578,
266 1048576, -10085, -13110, -8471, 2097152, -20170, 10267, -16943,
267 4194304, 208, -15954, 31741, 8388608, 416, 4579, -2146,
268 16777216, 832, 9158, -4293, 33554432, 1663, -18172, -8587,
269 67108864, 3326, 143, -17175, 134217728, 6653, 285, 31276,
270 268435456, 13306, 570, -3075, 536870912, -13938, 1140, -6152,
271 1073741824, 12672, 2281, -12304, -2147483648, -15205, 4561, -24610,
272 0, 10138, 9122, 16407, 0, -20274, -18243, -32813,
275 static const int32_t qoffset_intra_tab[128] = {
276 1, 2, 3, 4, 4, 5, 6, 7,
277 8, 10, 12, 14, 16, 19, 23, 27,
278 32, 38, 46, 54, 64, 76, 91, 108,
279 128, 152, 181, 216, 256, 305, 362, 431,
280 512, 609, 724, 861, 1024, 1218, 1448, 1722,
281 2048, 2436, 2897, 3445, 4096, 4871, 5793, 6889,
282 8192, 9742, -6658, 13777, 16384, -790, 4927, -5258,
283 32768, -1581, -8390, -10518, 65536, -3163, 1461, 11776,
284 131072, -6328, 2922, -9261, 262144, 7616, 5845, 14289,
285 524288, -5042, -6554, -4235, 1048576, -10084, 5134, -8471,
286 2097152, 104, -7976, 15871, 4194304, 208, 2290, -1072,
287 8388608, 416, 4579, -2146, 16777216, 832, -9085, -4293,
288 33554432, 1663, 72, -8587, 67108864, 3327, 143, 15638,
289 134217728, 6653, 285, -1537, 268435456, -6968, 570, -3075,
290 536870912, 6336, 1141, -6151, -1073741823, -7602, 2281, -12304,
291 0, 5069, 4561, 8204, 0, -10136, -9121, -16406,
294 static const int qoffset_inter_tab[MAX_QUANT+1] = {
295 1, 2, 2, 3, 3, 4, 4, 5,
296 6, 7, 9, 10, 12, 14, 17, 20,
297 24, 29, 34, 41, 48, 57, 68, 81,
298 96, 114, 136, 162, 192, 228, 272, 323,
299 384, 457, 543, 646, 768, 913, 1086, 1292,
300 1536, 1827, 2172, 2583, 3072, 3653, 4344, 5166,
301 6144, 7307, 8689, 10333, 12288, 14613, 17378, 20666,
305 /* magic number division by 3 from schroedinger */
306 static inline int divide3(int x)
308 return ((x+1)*21845 + 10922) >> 16;
311 static DiracFrame *remove_frame(DiracFrame *framelist[], int picnum)
313 DiracFrame *remove_pic = NULL;
314 int i, remove_idx = -1;
316 for (i = 0; framelist[i]; i++)
317 if (framelist[i]->avframe->display_picture_number == picnum) {
318 remove_pic = framelist[i];
323 for (i = remove_idx; framelist[i]; i++)
324 framelist[i] = framelist[i+1];
329 static int add_frame(DiracFrame *framelist[], int maxframes, DiracFrame *frame)
332 for (i = 0; i < maxframes; i++)
334 framelist[i] = frame;
340 static int alloc_sequence_buffers(DiracContext *s)
342 int sbwidth = DIVRNDUP(s->seq.width, 4);
343 int sbheight = DIVRNDUP(s->seq.height, 4);
344 int i, w, h, top_padding;
346 /* todo: think more about this / use or set Plane here */
347 for (i = 0; i < 3; i++) {
348 int max_xblen = MAX_BLOCKSIZE >> (i ? s->chroma_x_shift : 0);
349 int max_yblen = MAX_BLOCKSIZE >> (i ? s->chroma_y_shift : 0);
350 w = s->seq.width >> (i ? s->chroma_x_shift : 0);
351 h = s->seq.height >> (i ? s->chroma_y_shift : 0);
353 /* we allocate the max we support here since num decompositions can
354 * change from frame to frame. Stride is aligned to 16 for SIMD, and
355 * 1<<MAX_DWT_LEVELS top padding to avoid if(y>0) in arith decoding
356 * MAX_BLOCKSIZE padding for MC: blocks can spill up to half of that
358 top_padding = FFMAX(1<<MAX_DWT_LEVELS, max_yblen/2);
359 w = FFALIGN(CALC_PADDING(w, MAX_DWT_LEVELS), 8); /* FIXME: Should this be 16 for SSE??? */
360 h = top_padding + CALC_PADDING(h, MAX_DWT_LEVELS) + max_yblen/2;
362 s->plane[i].idwt_buf_base = av_mallocz_array((w+max_xblen), h * (2 << s->pshift));
363 s->plane[i].idwt_tmp = av_malloc_array((w+16), 2 << s->pshift);
364 s->plane[i].idwt_buf = s->plane[i].idwt_buf_base + (top_padding*w)*(2 << s->pshift);
365 if (!s->plane[i].idwt_buf_base || !s->plane[i].idwt_tmp)
366 return AVERROR(ENOMEM);
369 /* fixme: allocate using real stride here */
370 s->sbsplit = av_malloc_array(sbwidth, sbheight);
371 s->blmotion = av_malloc_array(sbwidth, sbheight * 16 * sizeof(*s->blmotion));
373 if (!s->sbsplit || !s->blmotion)
374 return AVERROR(ENOMEM);
378 static int alloc_buffers(DiracContext *s, int stride)
380 int w = s->seq.width;
381 int h = s->seq.height;
383 av_assert0(stride >= w);
386 if (s->buffer_stride >= stride)
388 s->buffer_stride = 0;
390 av_freep(&s->edge_emu_buffer_base);
391 memset(s->edge_emu_buffer, 0, sizeof(s->edge_emu_buffer));
393 av_freep(&s->mcscratch);
395 s->edge_emu_buffer_base = av_malloc_array(stride, MAX_BLOCKSIZE);
397 s->mctmp = av_malloc_array((stride+MAX_BLOCKSIZE), (h+MAX_BLOCKSIZE) * sizeof(*s->mctmp));
398 s->mcscratch = av_malloc_array(stride, MAX_BLOCKSIZE);
400 if (!s->edge_emu_buffer_base || !s->mctmp || !s->mcscratch)
401 return AVERROR(ENOMEM);
403 s->buffer_stride = stride;
407 static void free_sequence_buffers(DiracContext *s)
411 for (i = 0; i < MAX_FRAMES; i++) {
412 if (s->all_frames[i].avframe->data[0]) {
413 av_frame_unref(s->all_frames[i].avframe);
414 memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
417 for (j = 0; j < 3; j++)
418 for (k = 1; k < 4; k++)
419 av_freep(&s->all_frames[i].hpel_base[j][k]);
422 memset(s->ref_frames, 0, sizeof(s->ref_frames));
423 memset(s->delay_frames, 0, sizeof(s->delay_frames));
425 for (i = 0; i < 3; i++) {
426 av_freep(&s->plane[i].idwt_buf_base);
427 av_freep(&s->plane[i].idwt_tmp);
430 s->buffer_stride = 0;
431 av_freep(&s->sbsplit);
432 av_freep(&s->blmotion);
433 av_freep(&s->edge_emu_buffer_base);
436 av_freep(&s->mcscratch);
439 static av_cold int dirac_decode_init(AVCodecContext *avctx)
441 DiracContext *s = avctx->priv_data;
445 s->frame_number = -1;
447 ff_diracdsp_init(&s->diracdsp);
448 ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx);
449 ff_videodsp_init(&s->vdsp, 8);
451 for (i = 0; i < MAX_FRAMES; i++) {
452 s->all_frames[i].avframe = av_frame_alloc();
453 if (!s->all_frames[i].avframe) {
455 av_frame_free(&s->all_frames[--i].avframe);
456 return AVERROR(ENOMEM);
463 static void dirac_decode_flush(AVCodecContext *avctx)
465 DiracContext *s = avctx->priv_data;
466 free_sequence_buffers(s);
467 s->seen_sequence_header = 0;
468 s->frame_number = -1;
471 static av_cold int dirac_decode_end(AVCodecContext *avctx)
473 DiracContext *s = avctx->priv_data;
476 dirac_decode_flush(avctx);
477 for (i = 0; i < MAX_FRAMES; i++)
478 av_frame_free(&s->all_frames[i].avframe);
483 #define SIGN_CTX(x) (CTX_SIGN_ZERO + ((x) > 0) - ((x) < 0))
485 static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset)
491 UPDATE_CACHE(re, gb);
492 buf = GET_CACHE(re, gb);
494 if (buf & 0x80000000) {
495 LAST_SKIP_BITS(re,gb,1);
496 CLOSE_READER(re, gb);
500 if (buf & 0xAA800000) {
502 SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
504 coeff = ff_interleaved_ue_golomb_vlc_code[buf];
511 FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
513 if (ff_interleaved_golomb_vlc_len[buf] != 9) {
514 ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
515 ret |= ff_interleaved_dirac_golomb_vlc_code[buf];
518 ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
519 UPDATE_CACHE(re, gb);
520 buf = GET_CACHE(re, gb);
521 } while (ret<0x8000000U && BITS_AVAILABLE(re, gb));
526 coeff = (coeff * qfactor + qoffset) >> 2;
527 sign = SHOW_SBITS(re, gb, 1);
528 LAST_SKIP_BITS(re, gb, 1);
529 coeff = (coeff ^ sign) - sign;
531 CLOSE_READER(re, gb);
535 #define UNPACK_ARITH(n, type) \
536 static inline void coeff_unpack_arith_##n(DiracArith *c, int qfactor, int qoffset, \
537 SubBand *b, type *buf, int x, int y) \
539 int coeff, sign, sign_pred = 0, pred_ctx = CTX_ZPZN_F1; \
540 const int mstride = -(b->stride >> (1+b->pshift)); \
542 const type *pbuf = (type *)b->parent->ibuf; \
543 const int stride = b->parent->stride >> (1+b->parent->pshift); \
544 pred_ctx += !!pbuf[stride * (y>>1) + (x>>1)] << 1; \
546 if (b->orientation == subband_hl) \
547 sign_pred = buf[mstride]; \
549 pred_ctx += !(buf[-1] | buf[mstride] | buf[-1 + mstride]); \
550 if (b->orientation == subband_lh) \
551 sign_pred = buf[-1]; \
553 pred_ctx += !buf[mstride]; \
555 coeff = dirac_get_arith_uint(c, pred_ctx, CTX_COEFF_DATA); \
557 coeff = (coeff * qfactor + qoffset) >> 2; \
558 sign = dirac_get_arith_bit(c, SIGN_CTX(sign_pred)); \
559 coeff = (coeff ^ -sign) + sign; \
564 UNPACK_ARITH(8, int16_t)
565 UNPACK_ARITH(10, int32_t)
568 * Decode the coeffs in the rectangle defined by left, right, top, bottom
569 * [DIRAC_STD] 13.4.3.2 Codeblock unpacking loop. codeblock()
571 static inline void codeblock(DiracContext *s, SubBand *b,
572 GetBitContext *gb, DiracArith *c,
573 int left, int right, int top, int bottom,
574 int blockcnt_one, int is_arith)
576 int x, y, zero_block;
577 int qoffset, qfactor;
580 /* check for any coded coefficients in this codeblock */
583 zero_block = dirac_get_arith_bit(c, CTX_ZERO_BLOCK);
585 zero_block = get_bits1(gb);
591 if (s->codeblock_mode && !(s->old_delta_quant && blockcnt_one)) {
592 int quant = b->quant;
594 quant += dirac_get_arith_int(c, CTX_DELTA_Q_F, CTX_DELTA_Q_DATA);
596 quant += dirac_get_se_golomb(gb);
598 av_log(s->avctx, AV_LOG_ERROR, "Invalid quant\n");
604 b->quant = FFMIN(b->quant, MAX_QUANT);
606 qfactor = qscale_tab[b->quant];
607 /* TODO: context pointer? */
609 qoffset = qoffset_intra_tab[b->quant] + 2;
611 qoffset = qoffset_inter_tab[b->quant] + 2;
613 buf = b->ibuf + top * b->stride;
615 for (y = top; y < bottom; y++) {
616 for (x = left; x < right; x++) {
618 coeff_unpack_arith_10(c, qfactor, qoffset, b, (int32_t*)(buf)+x, x, y);
620 coeff_unpack_arith_8(c, qfactor, qoffset, b, (int16_t*)(buf)+x, x, y);
626 for (y = top; y < bottom; y++) {
627 for (x = left; x < right; x++) {
628 int val = coeff_unpack_golomb(gb, qfactor, qoffset);
630 AV_WN32(&buf[4*x], val);
632 AV_WN16(&buf[2*x], val);
641 * Dirac Specification ->
642 * 13.3 intra_dc_prediction(band)
644 #define INTRA_DC_PRED(n, type) \
645 static inline void intra_dc_prediction_##n(SubBand *b) \
647 type *buf = (type*)b->ibuf; \
650 for (x = 1; x < b->width; x++) \
651 buf[x] += buf[x-1]; \
652 buf += (b->stride >> (1+b->pshift)); \
654 for (y = 1; y < b->height; y++) { \
655 buf[0] += buf[-(b->stride >> (1+b->pshift))]; \
657 for (x = 1; x < b->width; x++) { \
658 int pred = buf[x - 1] + buf[x - (b->stride >> (1+b->pshift))] + buf[x - (b->stride >> (1+b->pshift))-1]; \
659 buf[x] += divide3(pred); \
661 buf += (b->stride >> (1+b->pshift)); \
665 INTRA_DC_PRED(8, int16_t)
666 INTRA_DC_PRED(10, int32_t)
669 * Dirac Specification ->
670 * 13.4.2 Non-skipped subbands. subband_coeffs()
672 static av_always_inline void decode_subband_internal(DiracContext *s, SubBand *b, int is_arith)
674 int cb_x, cb_y, left, right, top, bottom;
677 int cb_width = s->codeblock[b->level + (b->orientation != subband_ll)].width;
678 int cb_height = s->codeblock[b->level + (b->orientation != subband_ll)].height;
679 int blockcnt_one = (cb_width + cb_height) == 2;
684 init_get_bits8(&gb, b->coeff_data, b->length);
687 ff_dirac_init_arith_decoder(&c, &gb, b->length);
690 for (cb_y = 0; cb_y < cb_height; cb_y++) {
691 bottom = (b->height * (cb_y+1LL)) / cb_height;
693 for (cb_x = 0; cb_x < cb_width; cb_x++) {
694 right = (b->width * (cb_x+1LL)) / cb_width;
695 codeblock(s, b, &gb, &c, left, right, top, bottom, blockcnt_one, is_arith);
701 if (b->orientation == subband_ll && s->num_refs == 0) {
703 intra_dc_prediction_10(b);
705 intra_dc_prediction_8(b);
710 static int decode_subband_arith(AVCodecContext *avctx, void *b)
712 DiracContext *s = avctx->priv_data;
713 decode_subband_internal(s, b, 1);
717 static int decode_subband_golomb(AVCodecContext *avctx, void *arg)
719 DiracContext *s = avctx->priv_data;
721 decode_subband_internal(s, *b, 0);
726 * Dirac Specification ->
727 * [DIRAC_STD] 13.4.1 core_transform_data()
729 static void decode_component(DiracContext *s, int comp)
731 AVCodecContext *avctx = s->avctx;
732 SubBand *bands[3*MAX_DWT_LEVELS+1];
733 enum dirac_subband orientation;
734 int level, num_bands = 0;
736 /* Unpack all subbands at all levels. */
737 for (level = 0; level < s->wavelet_depth; level++) {
738 for (orientation = !!level; orientation < 4; orientation++) {
739 SubBand *b = &s->plane[comp].band[level][orientation];
740 bands[num_bands++] = b;
742 align_get_bits(&s->gb);
743 /* [DIRAC_STD] 13.4.2 subband() */
744 b->length = svq3_get_ue_golomb(&s->gb);
746 b->quant = svq3_get_ue_golomb(&s->gb);
747 align_get_bits(&s->gb);
748 b->coeff_data = s->gb.buffer + get_bits_count(&s->gb)/8;
749 b->length = FFMIN(b->length, FFMAX(get_bits_left(&s->gb)/8, 0));
750 skip_bits_long(&s->gb, b->length*8);
753 /* arithmetic coding has inter-level dependencies, so we can only execute one level at a time */
755 avctx->execute(avctx, decode_subband_arith, &s->plane[comp].band[level][!!level],
756 NULL, 4-!!level, sizeof(SubBand));
758 /* golomb coding has no inter-level dependencies, so we can execute all subbands in parallel */
760 avctx->execute(avctx, decode_subband_golomb, bands, NULL, num_bands, sizeof(SubBand*));
763 #define PARSE_VALUES(type, x, gb, ebits, buf1, buf2) \
764 type *buf = (type *)buf1; \
765 buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset); \
766 if (get_bits_count(gb) >= ebits) \
769 buf = (type *)buf2; \
770 buf[x] = coeff_unpack_golomb(gb, qfactor, qoffset); \
771 if (get_bits_count(gb) >= ebits) \
775 static void decode_subband(DiracContext *s, GetBitContext *gb, int quant,
776 int slice_x, int slice_y, int bits_end,
777 SubBand *b1, SubBand *b2)
779 int left = b1->width * slice_x / s->num_x;
780 int right = b1->width *(slice_x+1) / s->num_x;
781 int top = b1->height * slice_y / s->num_y;
782 int bottom = b1->height *(slice_y+1) / s->num_y;
784 int qfactor = qscale_tab[quant & 0x7f];
785 int qoffset = qoffset_intra_tab[quant & 0x7f] + 2;
787 uint8_t *buf1 = b1->ibuf + top * b1->stride;
788 uint8_t *buf2 = b2 ? b2->ibuf + top * b2->stride: NULL;
790 /* we have to constantly check for overread since the spec explicitly
791 requires this, with the meaning that all remaining coeffs are set to 0 */
792 if (get_bits_count(gb) >= bits_end)
796 for (y = top; y < bottom; y++) {
797 for (x = left; x < right; x++) {
798 PARSE_VALUES(int32_t, x, gb, bits_end, buf1, buf2);
806 for (y = top; y < bottom; y++) {
807 for (x = left; x < right; x++) {
808 PARSE_VALUES(int16_t, x, gb, bits_end, buf1, buf2);
817 /* Used by Low Delay and High Quality profiles */
818 typedef struct DiracSlice {
827 * Dirac Specification ->
828 * 13.5.2 Slices. slice(sx,sy)
830 static int decode_lowdelay_slice(AVCodecContext *avctx, void *arg)
832 DiracContext *s = avctx->priv_data;
833 DiracSlice *slice = arg;
834 GetBitContext *gb = &slice->gb;
835 enum dirac_subband orientation;
836 int level, quant, chroma_bits, chroma_end;
838 int quant_base = get_bits(gb, 7); /*[DIRAC_STD] qindex */
839 int length_bits = av_log2(8 * slice->bytes)+1;
840 int luma_bits = get_bits_long(gb, length_bits);
841 int luma_end = get_bits_count(gb) + FFMIN(luma_bits, get_bits_left(gb));
843 /* [DIRAC_STD] 13.5.5.2 luma_slice_band */
844 for (level = 0; level < s->wavelet_depth; level++)
845 for (orientation = !!level; orientation < 4; orientation++) {
846 quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0);
847 decode_subband(s, gb, quant, slice->slice_x, slice->slice_y, luma_end,
848 &s->plane[0].band[level][orientation], NULL);
851 /* consume any unused bits from luma */
852 skip_bits_long(gb, get_bits_count(gb) - luma_end);
854 chroma_bits = 8*slice->bytes - 7 - length_bits - luma_bits;
855 chroma_end = get_bits_count(gb) + FFMIN(chroma_bits, get_bits_left(gb));
856 /* [DIRAC_STD] 13.5.5.3 chroma_slice_band */
857 for (level = 0; level < s->wavelet_depth; level++)
858 for (orientation = !!level; orientation < 4; orientation++) {
859 quant = FFMAX(quant_base - s->lowdelay.quant[level][orientation], 0);
860 decode_subband(s, gb, quant, slice->slice_x, slice->slice_y, chroma_end,
861 &s->plane[1].band[level][orientation],
862 &s->plane[2].band[level][orientation]);
869 * VC-2 Specification ->
870 * 13.5.3 hq_slice(sx,sy)
872 static int decode_hq_slice(AVCodecContext *avctx, void *arg)
874 int i, quant, level, orientation, quant_idx;
875 uint8_t quants[MAX_DWT_LEVELS][4];
876 DiracContext *s = avctx->priv_data;
877 DiracSlice *slice = arg;
878 GetBitContext *gb = &slice->gb;
880 skip_bits_long(gb, 8*s->highquality.prefix_bytes);
881 quant_idx = get_bits(gb, 8);
883 /* Slice quantization (slice_quantizers() in the specs) */
884 for (level = 0; level < s->wavelet_depth; level++) {
885 for (orientation = !!level; orientation < 4; orientation++) {
886 quant = FFMAX(quant_idx - s->lowdelay.quant[level][orientation], 0);
887 quants[level][orientation] = quant;
891 /* Luma + 2 Chroma planes */
892 for (i = 0; i < 3; i++) {
893 int length = s->highquality.size_scaler * get_bits(gb, 8);
894 int bits_left = 8 * length;
895 int bits_end = get_bits_count(gb) + bits_left;
896 for (level = 0; level < s->wavelet_depth; level++) {
897 for (orientation = !!level; orientation < 4; orientation++) {
898 decode_subband(s, gb, quants[level][orientation], slice->slice_x, slice->slice_y, bits_end,
899 &s->plane[i].band[level][orientation], NULL);
902 skip_bits_long(gb, bits_end - get_bits_count(gb));
909 * Dirac Specification ->
910 * 13.5.1 low_delay_transform_data()
912 static int decode_lowdelay(DiracContext *s)
914 AVCodecContext *avctx = s->avctx;
915 int slice_x, slice_y, bytes = 0, bufsize;
920 slices = av_mallocz_array(s->num_x, s->num_y * sizeof(DiracSlice));
922 return AVERROR(ENOMEM);
924 align_get_bits(&s->gb);
925 /*[DIRAC_STD] 13.5.2 Slices. slice(sx,sy) */
926 buf = s->gb.buffer + get_bits_count(&s->gb)/8;
927 bufsize = get_bits_left(&s->gb);
932 for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) {
933 for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) {
934 bytes = s->highquality.prefix_bytes + 1;
935 for (i = 0; i < 3; i++) {
936 if (bytes <= bufsize/8)
937 bytes += buf[bytes] * s->highquality.size_scaler + 1;
940 slices[slice_num].bytes = bytes;
941 slices[slice_num].slice_x = slice_x;
942 slices[slice_num].slice_y = slice_y;
943 init_get_bits(&slices[slice_num].gb, buf, bufsize);
947 if (bufsize/8 >= bytes)
953 avctx->execute(avctx, decode_hq_slice, slices, NULL, slice_num,
956 for (slice_y = 0; bufsize > 0 && slice_y < s->num_y; slice_y++) {
957 for (slice_x = 0; bufsize > 0 && slice_x < s->num_x; slice_x++) {
958 bytes = (slice_num+1) * s->lowdelay.bytes.num / s->lowdelay.bytes.den
959 - slice_num * s->lowdelay.bytes.num / s->lowdelay.bytes.den;
960 slices[slice_num].bytes = bytes;
961 slices[slice_num].slice_x = slice_x;
962 slices[slice_num].slice_y = slice_y;
963 init_get_bits(&slices[slice_num].gb, buf, bufsize);
967 if (bufsize/8 >= bytes)
973 avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num,
974 sizeof(DiracSlice)); /* [DIRAC_STD] 13.5.2 Slices */
977 if (s->dc_prediction) {
979 intra_dc_prediction_10(&s->plane[0].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
980 intra_dc_prediction_10(&s->plane[1].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
981 intra_dc_prediction_10(&s->plane[2].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
983 intra_dc_prediction_8(&s->plane[0].band[0][0]);
984 intra_dc_prediction_8(&s->plane[1].band[0][0]);
985 intra_dc_prediction_8(&s->plane[2].band[0][0]);
992 static void init_planes(DiracContext *s)
994 int i, w, h, level, orientation;
996 for (i = 0; i < 3; i++) {
997 Plane *p = &s->plane[i];
999 p->width = s->seq.width >> (i ? s->chroma_x_shift : 0);
1000 p->height = s->seq.height >> (i ? s->chroma_y_shift : 0);
1001 p->idwt_width = w = CALC_PADDING(p->width , s->wavelet_depth);
1002 p->idwt_height = h = CALC_PADDING(p->height, s->wavelet_depth);
1003 p->idwt_stride = FFALIGN(p->idwt_width, 8) << (1 + s->pshift);
1005 for (level = s->wavelet_depth-1; level >= 0; level--) {
1008 for (orientation = !!level; orientation < 4; orientation++) {
1009 SubBand *b = &p->band[level][orientation];
1011 b->pshift = s->pshift;
1012 b->ibuf = p->idwt_buf;
1014 b->stride = p->idwt_stride << (s->wavelet_depth - level);
1017 b->orientation = orientation;
1019 if (orientation & 1)
1020 b->ibuf += w << (1+b->pshift);
1021 if (orientation > 1)
1022 b->ibuf += (b->stride>>1);
1025 b->parent = &p->band[level-1][orientation];
1030 p->xblen = s->plane[0].xblen >> s->chroma_x_shift;
1031 p->yblen = s->plane[0].yblen >> s->chroma_y_shift;
1032 p->xbsep = s->plane[0].xbsep >> s->chroma_x_shift;
1033 p->ybsep = s->plane[0].ybsep >> s->chroma_y_shift;
1036 p->xoffset = (p->xblen - p->xbsep)/2;
1037 p->yoffset = (p->yblen - p->ybsep)/2;
1042 * Unpack the motion compensation parameters
1043 * Dirac Specification ->
1044 * 11.2 Picture prediction data. picture_prediction()
1046 static int dirac_unpack_prediction_parameters(DiracContext *s)
1048 static const uint8_t default_blen[] = { 4, 12, 16, 24 };
1050 GetBitContext *gb = &s->gb;
1054 /* [DIRAC_STD] 11.2.2 Block parameters. block_parameters() */
1055 /* Luma and Chroma are equal. 11.2.3 */
1056 idx = svq3_get_ue_golomb(gb); /* [DIRAC_STD] index */
1059 av_log(s->avctx, AV_LOG_ERROR, "Block prediction index too high\n");
1060 return AVERROR_INVALIDDATA;
1064 s->plane[0].xblen = svq3_get_ue_golomb(gb);
1065 s->plane[0].yblen = svq3_get_ue_golomb(gb);
1066 s->plane[0].xbsep = svq3_get_ue_golomb(gb);
1067 s->plane[0].ybsep = svq3_get_ue_golomb(gb);
1069 /*[DIRAC_STD] preset_block_params(index). Table 11.1 */
1070 s->plane[0].xblen = default_blen[idx-1];
1071 s->plane[0].yblen = default_blen[idx-1];
1072 s->plane[0].xbsep = 4 * idx;
1073 s->plane[0].ybsep = 4 * idx;
1075 /*[DIRAC_STD] 11.2.4 motion_data_dimensions()
1076 Calculated in function dirac_unpack_block_motion_data */
1078 if (s->plane[0].xblen % (1 << s->chroma_x_shift) != 0 ||
1079 s->plane[0].yblen % (1 << s->chroma_y_shift) != 0 ||
1080 !s->plane[0].xblen || !s->plane[0].yblen) {
1081 av_log(s->avctx, AV_LOG_ERROR,
1082 "invalid x/y block length (%d/%d) for x/y chroma shift (%d/%d)\n",
1083 s->plane[0].xblen, s->plane[0].yblen, s->chroma_x_shift, s->chroma_y_shift);
1084 return AVERROR_INVALIDDATA;
1086 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) {
1087 av_log(s->avctx, AV_LOG_ERROR, "Block separation too small\n");
1088 return AVERROR_INVALIDDATA;
1090 if (s->plane[0].xbsep > s->plane[0].xblen || s->plane[0].ybsep > s->plane[0].yblen) {
1091 av_log(s->avctx, AV_LOG_ERROR, "Block separation greater than size\n");
1092 return AVERROR_INVALIDDATA;
1094 if (FFMAX(s->plane[0].xblen, s->plane[0].yblen) > MAX_BLOCKSIZE) {
1095 av_log(s->avctx, AV_LOG_ERROR, "Unsupported large block size\n");
1096 return AVERROR_PATCHWELCOME;
1099 /*[DIRAC_STD] 11.2.5 Motion vector precision. motion_vector_precision()
1100 Read motion vector precision */
1101 s->mv_precision = svq3_get_ue_golomb(gb);
1102 if (s->mv_precision > 3) {
1103 av_log(s->avctx, AV_LOG_ERROR, "MV precision finer than eighth-pel\n");
1104 return AVERROR_INVALIDDATA;
1107 /*[DIRAC_STD] 11.2.6 Global motion. global_motion()
1108 Read the global motion compensation parameters */
1109 s->globalmc_flag = get_bits1(gb);
1110 if (s->globalmc_flag) {
1111 memset(s->globalmc, 0, sizeof(s->globalmc));
1112 /* [DIRAC_STD] pan_tilt(gparams) */
1113 for (ref = 0; ref < s->num_refs; ref++) {
1114 if (get_bits1(gb)) {
1115 s->globalmc[ref].pan_tilt[0] = dirac_get_se_golomb(gb);
1116 s->globalmc[ref].pan_tilt[1] = dirac_get_se_golomb(gb);
1118 /* [DIRAC_STD] zoom_rotate_shear(gparams)
1119 zoom/rotation/shear parameters */
1120 if (get_bits1(gb)) {
1121 s->globalmc[ref].zrs_exp = svq3_get_ue_golomb(gb);
1122 s->globalmc[ref].zrs[0][0] = dirac_get_se_golomb(gb);
1123 s->globalmc[ref].zrs[0][1] = dirac_get_se_golomb(gb);
1124 s->globalmc[ref].zrs[1][0] = dirac_get_se_golomb(gb);
1125 s->globalmc[ref].zrs[1][1] = dirac_get_se_golomb(gb);
1127 s->globalmc[ref].zrs[0][0] = 1;
1128 s->globalmc[ref].zrs[1][1] = 1;
1130 /* [DIRAC_STD] perspective(gparams) */
1131 if (get_bits1(gb)) {
1132 s->globalmc[ref].perspective_exp = svq3_get_ue_golomb(gb);
1133 s->globalmc[ref].perspective[0] = dirac_get_se_golomb(gb);
1134 s->globalmc[ref].perspective[1] = dirac_get_se_golomb(gb);
1139 /*[DIRAC_STD] 11.2.7 Picture prediction mode. prediction_mode()
1140 Picture prediction mode, not currently used. */
1141 if (svq3_get_ue_golomb(gb)) {
1142 av_log(s->avctx, AV_LOG_ERROR, "Unknown picture prediction mode\n");
1143 return AVERROR_INVALIDDATA;
1146 /* [DIRAC_STD] 11.2.8 Reference picture weight. reference_picture_weights()
1147 just data read, weight calculation will be done later on. */
1148 s->weight_log2denom = 1;
1152 if (get_bits1(gb)) {
1153 s->weight_log2denom = svq3_get_ue_golomb(gb);
1154 s->weight[0] = dirac_get_se_golomb(gb);
1155 if (s->num_refs == 2)
1156 s->weight[1] = dirac_get_se_golomb(gb);
1162 * Dirac Specification ->
1163 * 11.3 Wavelet transform data. wavelet_transform()
1165 static int dirac_unpack_idwt_params(DiracContext *s)
1167 GetBitContext *gb = &s->gb;
1171 #define CHECKEDREAD(dst, cond, errmsg) \
1172 tmp = svq3_get_ue_golomb(gb); \
1174 av_log(s->avctx, AV_LOG_ERROR, errmsg); \
1175 return AVERROR_INVALIDDATA; \
1181 s->zero_res = s->num_refs ? get_bits1(gb) : 0;
1185 /*[DIRAC_STD] 11.3.1 Transform parameters. transform_parameters() */
1186 CHECKEDREAD(s->wavelet_idx, tmp > 6, "wavelet_idx is too big\n")
1188 CHECKEDREAD(s->wavelet_depth, tmp > MAX_DWT_LEVELS || tmp < 1, "invalid number of DWT decompositions\n")
1190 if (!s->low_delay) {
1191 /* Codeblock parameters (core syntax only) */
1192 if (get_bits1(gb)) {
1193 for (i = 0; i <= s->wavelet_depth; i++) {
1194 CHECKEDREAD(s->codeblock[i].width , tmp < 1 || tmp > (s->avctx->width >>s->wavelet_depth-i), "codeblock width invalid\n")
1195 CHECKEDREAD(s->codeblock[i].height, tmp < 1 || tmp > (s->avctx->height>>s->wavelet_depth-i), "codeblock height invalid\n")
1198 CHECKEDREAD(s->codeblock_mode, tmp > 1, "unknown codeblock mode\n")
1201 for (i = 0; i <= s->wavelet_depth; i++)
1202 s->codeblock[i].width = s->codeblock[i].height = 1;
1206 s->num_x = svq3_get_ue_golomb(gb);
1207 s->num_y = svq3_get_ue_golomb(gb);
1208 if (s->ld_picture) {
1209 s->lowdelay.bytes.num = svq3_get_ue_golomb(gb);
1210 s->lowdelay.bytes.den = svq3_get_ue_golomb(gb);
1211 if (s->lowdelay.bytes.den <= 0) {
1212 av_log(s->avctx,AV_LOG_ERROR,"Invalid lowdelay.bytes.den\n");
1213 return AVERROR_INVALIDDATA;
1215 } else if (s->hq_picture) {
1216 s->highquality.prefix_bytes = svq3_get_ue_golomb(gb);
1217 s->highquality.size_scaler = svq3_get_ue_golomb(gb);
1220 /* [DIRAC_STD] 11.3.5 Quantisation matrices (low-delay syntax). quant_matrix() */
1221 if (get_bits1(gb)) {
1222 av_log(s->avctx,AV_LOG_DEBUG,"Low Delay: Has Custom Quantization Matrix!\n");
1223 /* custom quantization matrix */
1224 s->lowdelay.quant[0][0] = svq3_get_ue_golomb(gb);
1225 for (level = 0; level < s->wavelet_depth; level++) {
1226 s->lowdelay.quant[level][1] = svq3_get_ue_golomb(gb);
1227 s->lowdelay.quant[level][2] = svq3_get_ue_golomb(gb);
1228 s->lowdelay.quant[level][3] = svq3_get_ue_golomb(gb);
1231 if (s->wavelet_depth > 4) {
1232 av_log(s->avctx,AV_LOG_ERROR,"Mandatory custom low delay matrix missing for depth %d\n", s->wavelet_depth);
1233 return AVERROR_INVALIDDATA;
1235 /* default quantization matrix */
1236 for (level = 0; level < s->wavelet_depth; level++)
1237 for (i = 0; i < 4; i++) {
1238 s->lowdelay.quant[level][i] = default_qmat[s->wavelet_idx][level][i];
1239 /* haar with no shift differs for different depths */
1240 if (s->wavelet_idx == 3)
1241 s->lowdelay.quant[level][i] += 4*(s->wavelet_depth-1 - level);
1248 static inline int pred_sbsplit(uint8_t *sbsplit, int stride, int x, int y)
1250 static const uint8_t avgsplit[7] = { 0, 0, 1, 1, 1, 2, 2 };
1257 return sbsplit[-stride];
1259 return avgsplit[sbsplit[-1] + sbsplit[-stride] + sbsplit[-stride-1]];
1262 static inline int pred_block_mode(DiracBlock *block, int stride, int x, int y, int refmask)
1269 return block[-1].ref & refmask;
1271 return block[-stride].ref & refmask;
1273 /* return the majority */
1274 pred = (block[-1].ref & refmask) + (block[-stride].ref & refmask) + (block[-stride-1].ref & refmask);
1275 return (pred >> 1) & refmask;
1278 static inline void pred_block_dc(DiracBlock *block, int stride, int x, int y)
1282 memset(block->u.dc, 0, sizeof(block->u.dc));
1284 if (x && !(block[-1].ref & 3)) {
1285 for (i = 0; i < 3; i++)
1286 block->u.dc[i] += block[-1].u.dc[i];
1290 if (y && !(block[-stride].ref & 3)) {
1291 for (i = 0; i < 3; i++)
1292 block->u.dc[i] += block[-stride].u.dc[i];
1296 if (x && y && !(block[-1-stride].ref & 3)) {
1297 for (i = 0; i < 3; i++)
1298 block->u.dc[i] += block[-1-stride].u.dc[i];
1303 for (i = 0; i < 3; i++)
1304 block->u.dc[i] = (block->u.dc[i]+1)>>1;
1305 } else if (n == 3) {
1306 for (i = 0; i < 3; i++)
1307 block->u.dc[i] = divide3(block->u.dc[i]);
1311 static inline void pred_mv(DiracBlock *block, int stride, int x, int y, int ref)
1314 int refmask = ref+1;
1315 int mask = refmask | DIRAC_REF_MASK_GLOBAL; /* exclude gmc blocks */
1318 if (x && (block[-1].ref & mask) == refmask)
1319 pred[n++] = block[-1].u.mv[ref];
1321 if (y && (block[-stride].ref & mask) == refmask)
1322 pred[n++] = block[-stride].u.mv[ref];
1324 if (x && y && (block[-stride-1].ref & mask) == refmask)
1325 pred[n++] = block[-stride-1].u.mv[ref];
1329 block->u.mv[ref][0] = 0;
1330 block->u.mv[ref][1] = 0;
1333 block->u.mv[ref][0] = pred[0][0];
1334 block->u.mv[ref][1] = pred[0][1];
1337 block->u.mv[ref][0] = (pred[0][0] + pred[1][0] + 1) >> 1;
1338 block->u.mv[ref][1] = (pred[0][1] + pred[1][1] + 1) >> 1;
1341 block->u.mv[ref][0] = mid_pred(pred[0][0], pred[1][0], pred[2][0]);
1342 block->u.mv[ref][1] = mid_pred(pred[0][1], pred[1][1], pred[2][1]);
1347 static void global_mv(DiracContext *s, DiracBlock *block, int x, int y, int ref)
1349 int ez = s->globalmc[ref].zrs_exp;
1350 int ep = s->globalmc[ref].perspective_exp;
1351 int (*A)[2] = s->globalmc[ref].zrs;
1352 int *b = s->globalmc[ref].pan_tilt;
1353 int *c = s->globalmc[ref].perspective;
1355 int m = (1<<ep) - (c[0]*x + c[1]*y);
1356 int mx = m * ((A[0][0] * x + A[0][1]*y) + (1<<ez) * b[0]);
1357 int my = m * ((A[1][0] * x + A[1][1]*y) + (1<<ez) * b[1]);
1359 block->u.mv[ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep);
1360 block->u.mv[ref][1] = (my + (1<<(ez+ep))) >> (ez+ep);
1363 static void decode_block_params(DiracContext *s, DiracArith arith[8], DiracBlock *block,
1364 int stride, int x, int y)
1368 block->ref = pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF1);
1369 block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF1);
1371 if (s->num_refs == 2) {
1372 block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF2);
1373 block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF2) << 1;
1377 pred_block_dc(block, stride, x, y);
1378 for (i = 0; i < 3; i++)
1379 block->u.dc[i] += dirac_get_arith_int(arith+1+i, CTX_DC_F1, CTX_DC_DATA);
1383 if (s->globalmc_flag) {
1384 block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_GLOBAL);
1385 block->ref ^= dirac_get_arith_bit(arith, CTX_GLOBAL_BLOCK) << 2;
1388 for (i = 0; i < s->num_refs; i++)
1389 if (block->ref & (i+1)) {
1390 if (block->ref & DIRAC_REF_MASK_GLOBAL) {
1391 global_mv(s, block, x, y, i);
1393 pred_mv(block, stride, x, y, i);
1394 block->u.mv[i][0] += dirac_get_arith_int(arith + 4 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
1395 block->u.mv[i][1] += dirac_get_arith_int(arith + 5 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
1401 * Copies the current block to the other blocks covered by the current superblock split mode
1403 static void propagate_block_data(DiracBlock *block, int stride, int size)
1406 DiracBlock *dst = block;
1408 for (x = 1; x < size; x++)
1411 for (y = 1; y < size; y++) {
1413 for (x = 0; x < size; x++)
1419 * Dirac Specification ->
1420 * 12. Block motion data syntax
1422 static int dirac_unpack_block_motion_data(DiracContext *s)
1424 GetBitContext *gb = &s->gb;
1425 uint8_t *sbsplit = s->sbsplit;
1427 DiracArith arith[8];
1431 /* [DIRAC_STD] 11.2.4 and 12.2.1 Number of blocks and superblocks */
1432 s->sbwidth = DIVRNDUP(s->seq.width, 4*s->plane[0].xbsep);
1433 s->sbheight = DIVRNDUP(s->seq.height, 4*s->plane[0].ybsep);
1434 s->blwidth = 4 * s->sbwidth;
1435 s->blheight = 4 * s->sbheight;
1437 /* [DIRAC_STD] 12.3.1 Superblock splitting modes. superblock_split_modes()
1438 decode superblock split modes */
1439 ff_dirac_init_arith_decoder(arith, gb, svq3_get_ue_golomb(gb)); /* svq3_get_ue_golomb(gb) is the length */
1440 for (y = 0; y < s->sbheight; y++) {
1441 for (x = 0; x < s->sbwidth; x++) {
1442 unsigned int split = dirac_get_arith_uint(arith, CTX_SB_F1, CTX_SB_DATA);
1444 return AVERROR_INVALIDDATA;
1445 sbsplit[x] = (split + pred_sbsplit(sbsplit+x, s->sbwidth, x, y)) % 3;
1447 sbsplit += s->sbwidth;
1450 /* setup arith decoding */
1451 ff_dirac_init_arith_decoder(arith, gb, svq3_get_ue_golomb(gb));
1452 for (i = 0; i < s->num_refs; i++) {
1453 ff_dirac_init_arith_decoder(arith + 4 + 2 * i, gb, svq3_get_ue_golomb(gb));
1454 ff_dirac_init_arith_decoder(arith + 5 + 2 * i, gb, svq3_get_ue_golomb(gb));
1456 for (i = 0; i < 3; i++)
1457 ff_dirac_init_arith_decoder(arith+1+i, gb, svq3_get_ue_golomb(gb));
1459 for (y = 0; y < s->sbheight; y++)
1460 for (x = 0; x < s->sbwidth; x++) {
1461 int blkcnt = 1 << s->sbsplit[y * s->sbwidth + x];
1462 int step = 4 >> s->sbsplit[y * s->sbwidth + x];
1464 for (q = 0; q < blkcnt; q++)
1465 for (p = 0; p < blkcnt; p++) {
1466 int bx = 4 * x + p*step;
1467 int by = 4 * y + q*step;
1468 DiracBlock *block = &s->blmotion[by*s->blwidth + bx];
1469 decode_block_params(s, arith, block, s->blwidth, bx, by);
1470 propagate_block_data(block, s->blwidth, step);
1477 static int weight(int i, int blen, int offset)
1479 #define ROLLOFF(i) offset == 1 ? ((i) ? 5 : 3) : \
1480 (1 + (6*(i) + offset - 1) / (2*offset - 1))
1484 else if (i > blen-1 - 2*offset)
1485 return ROLLOFF(blen-1 - i);
1489 static void init_obmc_weight_row(Plane *p, uint8_t *obmc_weight, int stride,
1490 int left, int right, int wy)
1493 for (x = 0; left && x < p->xblen >> 1; x++)
1494 obmc_weight[x] = wy*8;
1495 for (; x < p->xblen >> right; x++)
1496 obmc_weight[x] = wy*weight(x, p->xblen, p->xoffset);
1497 for (; x < p->xblen; x++)
1498 obmc_weight[x] = wy*8;
1499 for (; x < stride; x++)
1503 static void init_obmc_weight(Plane *p, uint8_t *obmc_weight, int stride,
1504 int left, int right, int top, int bottom)
1507 for (y = 0; top && y < p->yblen >> 1; y++) {
1508 init_obmc_weight_row(p, obmc_weight, stride, left, right, 8);
1509 obmc_weight += stride;
1511 for (; y < p->yblen >> bottom; y++) {
1512 int wy = weight(y, p->yblen, p->yoffset);
1513 init_obmc_weight_row(p, obmc_weight, stride, left, right, wy);
1514 obmc_weight += stride;
1516 for (; y < p->yblen; y++) {
1517 init_obmc_weight_row(p, obmc_weight, stride, left, right, 8);
1518 obmc_weight += stride;
1522 static void init_obmc_weights(DiracContext *s, Plane *p, int by)
1525 int bottom = by == s->blheight-1;
1527 /* don't bother re-initing for rows 2 to blheight-2, the weights don't change */
1528 if (top || bottom || by == 1) {
1529 init_obmc_weight(p, s->obmc_weight[0], MAX_BLOCKSIZE, 1, 0, top, bottom);
1530 init_obmc_weight(p, s->obmc_weight[1], MAX_BLOCKSIZE, 0, 0, top, bottom);
1531 init_obmc_weight(p, s->obmc_weight[2], MAX_BLOCKSIZE, 0, 1, top, bottom);
1535 static const uint8_t epel_weights[4][4][4] = {
1555 * For block x,y, determine which of the hpel planes to do bilinear
1556 * interpolation from and set src[] to the location in each hpel plane
1559 * @return the index of the put_dirac_pixels_tab function to use
1560 * 0 for 1 plane (fpel,hpel), 1 for 2 planes (qpel), 2 for 4 planes (qpel), and 3 for epel
1562 static int mc_subpel(DiracContext *s, DiracBlock *block, const uint8_t *src[5],
1563 int x, int y, int ref, int plane)
1565 Plane *p = &s->plane[plane];
1566 uint8_t **ref_hpel = s->ref_pics[ref]->hpel[plane];
1567 int motion_x = block->u.mv[ref][0];
1568 int motion_y = block->u.mv[ref][1];
1569 int mx, my, i, epel, nplanes = 0;
1572 motion_x >>= s->chroma_x_shift;
1573 motion_y >>= s->chroma_y_shift;
1576 mx = motion_x & ~(-1U << s->mv_precision);
1577 my = motion_y & ~(-1U << s->mv_precision);
1578 motion_x >>= s->mv_precision;
1579 motion_y >>= s->mv_precision;
1580 /* normalize subpel coordinates to epel */
1581 /* TODO: template this function? */
1582 mx <<= 3 - s->mv_precision;
1583 my <<= 3 - s->mv_precision;
1592 src[0] = ref_hpel[(my>>1)+(mx>>2)] + y*p->stride + x;
1596 for (i = 0; i < 4; i++)
1597 src[i] = ref_hpel[i] + y*p->stride + x;
1599 /* if we're interpolating in the right/bottom halves, adjust the planes as needed
1600 we increment x/y because the edge changes for half of the pixels */
1607 src[0] += p->stride;
1608 src[1] += p->stride;
1616 /* check if we really only need 2 planes since either mx or my is
1617 a hpel position. (epel weights of 0 handle this there) */
1619 /* mx == 0: average [0] and [2]
1620 mx == 4: average [1] and [3] */
1621 src[!mx] = src[2 + !!mx];
1623 } else if (!(my&3)) {
1624 src[0] = src[(my>>1) ];
1625 src[1] = src[(my>>1)+1];
1629 /* adjust the ordering if needed so the weights work */
1631 FFSWAP(const uint8_t *, src[0], src[1]);
1632 FFSWAP(const uint8_t *, src[2], src[3]);
1635 FFSWAP(const uint8_t *, src[0], src[2]);
1636 FFSWAP(const uint8_t *, src[1], src[3]);
1638 src[4] = epel_weights[my&3][mx&3];
1642 /* fixme: v/h _edge_pos */
1643 if (x + p->xblen > p->width +EDGE_WIDTH/2 ||
1644 y + p->yblen > p->height+EDGE_WIDTH/2 ||
1646 for (i = 0; i < nplanes; i++) {
1647 s->vdsp.emulated_edge_mc(s->edge_emu_buffer[i], src[i],
1648 p->stride, p->stride,
1649 p->xblen, p->yblen, x, y,
1650 p->width+EDGE_WIDTH/2, p->height+EDGE_WIDTH/2);
1651 src[i] = s->edge_emu_buffer[i];
1654 return (nplanes>>1) + epel;
1657 static void add_dc(uint16_t *dst, int dc, int stride,
1658 uint8_t *obmc_weight, int xblen, int yblen)
1663 for (y = 0; y < yblen; y++) {
1664 for (x = 0; x < xblen; x += 2) {
1665 dst[x ] += dc * obmc_weight[x ];
1666 dst[x+1] += dc * obmc_weight[x+1];
1669 obmc_weight += MAX_BLOCKSIZE;
1673 static void block_mc(DiracContext *s, DiracBlock *block,
1674 uint16_t *mctmp, uint8_t *obmc_weight,
1675 int plane, int dstx, int dsty)
1677 Plane *p = &s->plane[plane];
1678 const uint8_t *src[5];
1681 switch (block->ref&3) {
1683 add_dc(mctmp, block->u.dc[plane], p->stride, obmc_weight, p->xblen, p->yblen);
1687 idx = mc_subpel(s, block, src, dstx, dsty, (block->ref&3)-1, plane);
1688 s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1690 s->weight_func(s->mcscratch, p->stride, s->weight_log2denom,
1691 s->weight[0] + s->weight[1], p->yblen);
1694 idx = mc_subpel(s, block, src, dstx, dsty, 0, plane);
1695 s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1696 idx = mc_subpel(s, block, src, dstx, dsty, 1, plane);
1697 if (s->biweight_func) {
1698 /* fixme: +32 is a quick hack */
1699 s->put_pixels_tab[idx](s->mcscratch + 32, src, p->stride, p->yblen);
1700 s->biweight_func(s->mcscratch, s->mcscratch+32, p->stride, s->weight_log2denom,
1701 s->weight[0], s->weight[1], p->yblen);
1703 s->avg_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1706 s->add_obmc(mctmp, s->mcscratch, p->stride, obmc_weight, p->yblen);
1709 static void mc_row(DiracContext *s, DiracBlock *block, uint16_t *mctmp, int plane, int dsty)
1711 Plane *p = &s->plane[plane];
1712 int x, dstx = p->xbsep - p->xoffset;
1714 block_mc(s, block, mctmp, s->obmc_weight[0], plane, -p->xoffset, dsty);
1717 for (x = 1; x < s->blwidth-1; x++) {
1718 block_mc(s, block+x, mctmp, s->obmc_weight[1], plane, dstx, dsty);
1722 block_mc(s, block+x, mctmp, s->obmc_weight[2], plane, dstx, dsty);
1725 static void select_dsp_funcs(DiracContext *s, int width, int height, int xblen, int yblen)
1733 memcpy(s->put_pixels_tab, s->diracdsp.put_dirac_pixels_tab[idx], sizeof(s->put_pixels_tab));
1734 memcpy(s->avg_pixels_tab, s->diracdsp.avg_dirac_pixels_tab[idx], sizeof(s->avg_pixels_tab));
1735 s->add_obmc = s->diracdsp.add_dirac_obmc[idx];
1736 if (s->weight_log2denom > 1 || s->weight[0] != 1 || s->weight[1] != 1) {
1737 s->weight_func = s->diracdsp.weight_dirac_pixels_tab[idx];
1738 s->biweight_func = s->diracdsp.biweight_dirac_pixels_tab[idx];
1740 s->weight_func = NULL;
1741 s->biweight_func = NULL;
1745 static int interpolate_refplane(DiracContext *s, DiracFrame *ref, int plane, int width, int height)
1747 /* chroma allocates an edge of 8 when subsampled
1748 which for 4:2:2 means an h edge of 16 and v edge of 8
1749 just use 8 for everything for the moment */
1750 int i, edge = EDGE_WIDTH/2;
1752 ref->hpel[plane][0] = ref->avframe->data[plane];
1753 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 */
1755 /* no need for hpel if we only have fpel vectors */
1756 if (!s->mv_precision)
1759 for (i = 1; i < 4; i++) {
1760 if (!ref->hpel_base[plane][i])
1761 ref->hpel_base[plane][i] = av_malloc((height+2*edge) * ref->avframe->linesize[plane] + 32);
1762 if (!ref->hpel_base[plane][i]) {
1763 return AVERROR(ENOMEM);
1765 /* we need to be 16-byte aligned even for chroma */
1766 ref->hpel[plane][i] = ref->hpel_base[plane][i] + edge*ref->avframe->linesize[plane] + 16;
1769 if (!ref->interpolated[plane]) {
1770 s->diracdsp.dirac_hpel_filter(ref->hpel[plane][1], ref->hpel[plane][2],
1771 ref->hpel[plane][3], ref->hpel[plane][0],
1772 ref->avframe->linesize[plane], width, height);
1773 s->mpvencdsp.draw_edges(ref->hpel[plane][1], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1774 s->mpvencdsp.draw_edges(ref->hpel[plane][2], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1775 s->mpvencdsp.draw_edges(ref->hpel[plane][3], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1777 ref->interpolated[plane] = 1;
1783 * Dirac Specification ->
1784 * 13.0 Transform data syntax. transform_data()
1786 static int dirac_decode_frame_internal(DiracContext *s)
1789 int y, i, comp, dsty;
1793 /* [DIRAC_STD] 13.5.1 low_delay_transform_data() */
1794 for (comp = 0; comp < 3; comp++) {
1795 Plane *p = &s->plane[comp];
1796 memset(p->idwt_buf, 0, p->idwt_stride * p->idwt_height);
1799 if ((ret = decode_lowdelay(s)) < 0)
1804 for (comp = 0; comp < 3; comp++) {
1805 Plane *p = &s->plane[comp];
1806 uint8_t *frame = s->current_picture->avframe->data[comp];
1808 /* FIXME: small resolutions */
1809 for (i = 0; i < 4; i++)
1810 s->edge_emu_buffer[i] = s->edge_emu_buffer_base + i*FFALIGN(p->width, 16);
1812 if (!s->zero_res && !s->low_delay)
1814 memset(p->idwt_buf, 0, p->idwt_stride * p->idwt_height);
1815 decode_component(s, comp); /* [DIRAC_STD] 13.4.1 core_transform_data() */
1817 ret = ff_spatial_idwt_init2(&d, p->idwt_buf, p->idwt_width, p->idwt_height, p->idwt_stride,
1818 s->wavelet_idx+2, s->wavelet_depth, p->idwt_tmp, s->bit_depth);
1822 if (!s->num_refs) { /* intra */
1823 for (y = 0; y < p->height; y += 16) {
1824 ff_spatial_idwt_slice2(&d, y+16); /* decode */
1825 s->diracdsp.put_signed_rect_clamped[s->pshift](frame + y*p->stride, p->stride,
1826 p->idwt_buf + y*p->idwt_stride, p->idwt_stride, p->width, 16);
1828 } else { /* inter */
1829 int rowheight = p->ybsep*p->stride;
1831 select_dsp_funcs(s, p->width, p->height, p->xblen, p->yblen);
1833 for (i = 0; i < s->num_refs; i++) {
1834 int ret = interpolate_refplane(s, s->ref_pics[i], comp, p->width, p->height);
1839 memset(s->mctmp, 0, 4*p->yoffset*p->stride);
1842 for (y = 0; y < s->blheight; y++) {
1844 start = FFMAX(dsty, 0);
1845 uint16_t *mctmp = s->mctmp + y*rowheight;
1846 DiracBlock *blocks = s->blmotion + y*s->blwidth;
1848 init_obmc_weights(s, p, y);
1850 if (y == s->blheight-1 || start+p->ybsep > p->height)
1851 h = p->height - start;
1853 h = p->ybsep - (start - dsty);
1857 memset(mctmp+2*p->yoffset*p->stride, 0, 2*rowheight);
1858 mc_row(s, blocks, mctmp, comp, dsty);
1860 mctmp += (start - dsty)*p->stride + p->xoffset;
1861 ff_spatial_idwt_slice2(&d, start + h); /* decode */
1862 /* NOTE: add_rect_clamped hasn't been templated hence the shifts.
1863 * idwt_stride is passed as pixels, not in bytes as in the rest of the decoder */
1864 s->diracdsp.add_rect_clamped(frame + start*p->stride, mctmp, p->stride,
1865 (int16_t*)(p->idwt_buf) + start*(p->idwt_stride >> 1), (p->idwt_stride >> 1), p->width, h);
1876 static int get_buffer_with_edge(AVCodecContext *avctx, AVFrame *f, int flags)
1879 int chroma_x_shift, chroma_y_shift;
1880 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_x_shift, &chroma_y_shift);
1882 f->width = avctx->width + 2 * EDGE_WIDTH;
1883 f->height = avctx->height + 2 * EDGE_WIDTH + 2;
1884 ret = ff_get_buffer(avctx, f, flags);
1888 for (i = 0; f->data[i]; i++) {
1889 int offset = (EDGE_WIDTH >> (i && i<3 ? chroma_y_shift : 0)) *
1890 f->linesize[i] + 32;
1891 f->data[i] += offset;
1893 f->width = avctx->width;
1894 f->height = avctx->height;
1900 * Dirac Specification ->
1901 * 11.1.1 Picture Header. picture_header()
1903 static int dirac_decode_picture_header(DiracContext *s)
1905 unsigned retire, picnum;
1907 int64_t refdist, refnum;
1908 GetBitContext *gb = &s->gb;
1910 /* [DIRAC_STD] 11.1.1 Picture Header. picture_header() PICTURE_NUM */
1911 picnum = s->current_picture->avframe->display_picture_number = get_bits_long(gb, 32);
1914 av_log(s->avctx,AV_LOG_DEBUG,"PICTURE_NUM: %d\n",picnum);
1916 /* if this is the first keyframe after a sequence header, start our
1917 reordering from here */
1918 if (s->frame_number < 0)
1919 s->frame_number = picnum;
1921 s->ref_pics[0] = s->ref_pics[1] = NULL;
1922 for (i = 0; i < s->num_refs; i++) {
1923 refnum = (picnum + dirac_get_se_golomb(gb)) & 0xFFFFFFFF;
1924 refdist = INT64_MAX;
1926 /* find the closest reference to the one we want */
1927 /* Jordi: this is needed if the referenced picture hasn't yet arrived */
1928 for (j = 0; j < MAX_REFERENCE_FRAMES && refdist; j++)
1929 if (s->ref_frames[j]
1930 && FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum) < refdist) {
1931 s->ref_pics[i] = s->ref_frames[j];
1932 refdist = FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum);
1935 if (!s->ref_pics[i] || refdist)
1936 av_log(s->avctx, AV_LOG_DEBUG, "Reference not found\n");
1938 /* if there were no references at all, allocate one */
1939 if (!s->ref_pics[i])
1940 for (j = 0; j < MAX_FRAMES; j++)
1941 if (!s->all_frames[j].avframe->data[0]) {
1942 s->ref_pics[i] = &s->all_frames[j];
1943 get_buffer_with_edge(s->avctx, s->ref_pics[i]->avframe, AV_GET_BUFFER_FLAG_REF);
1947 if (!s->ref_pics[i]) {
1948 av_log(s->avctx, AV_LOG_ERROR, "Reference could not be allocated\n");
1949 return AVERROR_INVALIDDATA;
1954 /* retire the reference frames that are not used anymore */
1955 if (s->current_picture->reference) {
1956 retire = (picnum + dirac_get_se_golomb(gb)) & 0xFFFFFFFF;
1957 if (retire != picnum) {
1958 DiracFrame *retire_pic = remove_frame(s->ref_frames, retire);
1961 retire_pic->reference &= DELAYED_PIC_REF;
1963 av_log(s->avctx, AV_LOG_DEBUG, "Frame to retire not found\n");
1966 /* if reference array is full, remove the oldest as per the spec */
1967 while (add_frame(s->ref_frames, MAX_REFERENCE_FRAMES, s->current_picture)) {
1968 av_log(s->avctx, AV_LOG_ERROR, "Reference frame overflow\n");
1969 remove_frame(s->ref_frames, s->ref_frames[0]->avframe->display_picture_number)->reference &= DELAYED_PIC_REF;
1974 ret = dirac_unpack_prediction_parameters(s); /* [DIRAC_STD] 11.2 Picture Prediction Data. picture_prediction() */
1977 ret = dirac_unpack_block_motion_data(s); /* [DIRAC_STD] 12. Block motion data syntax */
1981 ret = dirac_unpack_idwt_params(s); /* [DIRAC_STD] 11.3 Wavelet transform data */
1989 static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame)
1991 DiracFrame *out = s->delay_frames[0];
1995 /* find frame with lowest picture number */
1996 for (i = 1; s->delay_frames[i]; i++)
1997 if (s->delay_frames[i]->avframe->display_picture_number < out->avframe->display_picture_number) {
1998 out = s->delay_frames[i];
2002 for (i = out_idx; s->delay_frames[i]; i++)
2003 s->delay_frames[i] = s->delay_frames[i+1];
2006 out->reference ^= DELAYED_PIC_REF;
2008 if((ret = av_frame_ref(picture, out->avframe)) < 0)
2016 * Dirac Specification ->
2017 * 9.6 Parse Info Header Syntax. parse_info()
2018 * 4 byte start code + byte parse code + 4 byte size + 4 byte previous size
2020 #define DATA_UNIT_HEADER_SIZE 13
2022 /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3
2023 inside the function parse_sequence() */
2024 static int dirac_decode_data_unit(AVCodecContext *avctx, const uint8_t *buf, int size)
2026 DiracContext *s = avctx->priv_data;
2027 DiracFrame *pic = NULL;
2028 AVDiracSeqHeader *dsh;
2033 if (size < DATA_UNIT_HEADER_SIZE)
2034 return AVERROR_INVALIDDATA;
2036 parse_code = buf[4];
2038 init_get_bits(&s->gb, &buf[13], 8*(size - DATA_UNIT_HEADER_SIZE));
2040 if (parse_code == DIRAC_PCODE_SEQ_HEADER) {
2041 if (s->seen_sequence_header)
2044 /* [DIRAC_STD] 10. Sequence header */
2045 ret = av_dirac_parse_sequence_header(&dsh, buf + DATA_UNIT_HEADER_SIZE, size - DATA_UNIT_HEADER_SIZE, avctx);
2047 av_log(avctx, AV_LOG_ERROR, "error parsing sequence header");
2051 ret = ff_set_dimensions(avctx, dsh->width, dsh->height);
2057 ff_set_sar(avctx, dsh->sample_aspect_ratio);
2058 avctx->pix_fmt = dsh->pix_fmt;
2059 avctx->color_range = dsh->color_range;
2060 avctx->color_trc = dsh->color_trc;
2061 avctx->color_primaries = dsh->color_primaries;
2062 avctx->colorspace = dsh->colorspace;
2063 avctx->profile = dsh->profile;
2064 avctx->level = dsh->level;
2065 avctx->framerate = dsh->framerate;
2066 s->bit_depth = dsh->bit_depth;
2070 s->pshift = s->bit_depth > 8;
2072 avcodec_get_chroma_sub_sample(avctx->pix_fmt, &s->chroma_x_shift, &s->chroma_y_shift);
2074 ret = alloc_sequence_buffers(s);
2078 s->seen_sequence_header = 1;
2079 } else if (parse_code == DIRAC_PCODE_END_SEQ) { /* [DIRAC_STD] End of Sequence */
2080 free_sequence_buffers(s);
2081 s->seen_sequence_header = 0;
2082 } else if (parse_code == DIRAC_PCODE_AUX) {
2083 if (buf[13] == 1) { /* encoder implementation/version */
2085 /* versions older than 1.0.8 don't store quant delta for
2086 subbands with only one codeblock */
2087 if (sscanf(buf+14, "Schroedinger %d.%d.%d", ver, ver+1, ver+2) == 3)
2088 if (ver[0] == 1 && ver[1] == 0 && ver[2] <= 7)
2089 s->old_delta_quant = 1;
2091 } else if (parse_code & 0x8) { /* picture data unit */
2092 if (!s->seen_sequence_header) {
2093 av_log(avctx, AV_LOG_DEBUG, "Dropping frame without sequence header\n");
2094 return AVERROR_INVALIDDATA;
2097 /* find an unused frame */
2098 for (i = 0; i < MAX_FRAMES; i++)
2099 if (s->all_frames[i].avframe->data[0] == NULL)
2100 pic = &s->all_frames[i];
2102 av_log(avctx, AV_LOG_ERROR, "framelist full\n");
2103 return AVERROR_INVALIDDATA;
2106 av_frame_unref(pic->avframe);
2108 /* [DIRAC_STD] Defined in 9.6.1 ... */
2109 tmp = parse_code & 0x03; /* [DIRAC_STD] num_refs() */
2111 av_log(avctx, AV_LOG_ERROR, "num_refs of 3\n");
2112 return AVERROR_INVALIDDATA;
2115 s->is_arith = (parse_code & 0x48) == 0x08; /* [DIRAC_STD] using_ac() */
2116 s->low_delay = (parse_code & 0x88) == 0x88; /* [DIRAC_STD] is_low_delay() */
2117 s->core_syntax = (parse_code & 0x88) == 0x08; /* [DIRAC_STD] is_core_syntax() */
2118 s->ld_picture = (parse_code & 0xF8) == 0xC8; /* [DIRAC_STD] is_ld_picture() */
2119 s->hq_picture = (parse_code & 0xF8) == 0xE8; /* [DIRAC_STD] is_hq_picture() */
2120 s->dc_prediction = (parse_code & 0x28) == 0x08; /* [DIRAC_STD] using_dc_prediction() */
2121 pic->reference = (parse_code & 0x0C) == 0x0C; /* [DIRAC_STD] is_reference() */
2122 pic->avframe->key_frame = s->num_refs == 0; /* [DIRAC_STD] is_intra() */
2123 pic->avframe->pict_type = s->num_refs + 1; /* Definition of AVPictureType in avutil.h */
2125 if (s->version.minor == 2 && parse_code == 0x88)
2128 if (s->low_delay && !(s->ld_picture || s->hq_picture) ) {
2129 av_log(avctx, AV_LOG_ERROR, "Invalid low delay flag\n");
2130 return AVERROR_INVALIDDATA;
2133 if ((ret = get_buffer_with_edge(avctx, pic->avframe, (parse_code & 0x0C) == 0x0C ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
2135 s->current_picture = pic;
2136 s->plane[0].stride = pic->avframe->linesize[0];
2137 s->plane[1].stride = pic->avframe->linesize[1];
2138 s->plane[2].stride = pic->avframe->linesize[2];
2140 if (alloc_buffers(s, FFMAX3(FFABS(s->plane[0].stride), FFABS(s->plane[1].stride), FFABS(s->plane[2].stride))) < 0)
2141 return AVERROR(ENOMEM);
2143 /* [DIRAC_STD] 11.1 Picture parse. picture_parse() */
2144 ret = dirac_decode_picture_header(s);
2148 /* [DIRAC_STD] 13.0 Transform data syntax. transform_data() */
2149 ret = dirac_decode_frame_internal(s);
2156 static int dirac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *pkt)
2158 DiracContext *s = avctx->priv_data;
2159 AVFrame *picture = data;
2160 uint8_t *buf = pkt->data;
2161 int buf_size = pkt->size;
2164 unsigned data_unit_size;
2166 /* release unused frames */
2167 for (i = 0; i < MAX_FRAMES; i++)
2168 if (s->all_frames[i].avframe->data[0] && !s->all_frames[i].reference) {
2169 av_frame_unref(s->all_frames[i].avframe);
2170 memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
2173 s->current_picture = NULL;
2176 /* end of stream, so flush delayed pics */
2178 return get_delayed_pic(s, (AVFrame *)data, got_frame);
2181 /*[DIRAC_STD] Here starts the code from parse_info() defined in 9.6
2182 [DIRAC_STD] PARSE_INFO_PREFIX = "BBCD" as defined in ISO/IEC 646
2183 BBCD start code search */
2184 for (; buf_idx + DATA_UNIT_HEADER_SIZE < buf_size; buf_idx++) {
2185 if (buf[buf_idx ] == 'B' && buf[buf_idx+1] == 'B' &&
2186 buf[buf_idx+2] == 'C' && buf[buf_idx+3] == 'D')
2189 /* BBCD found or end of data */
2190 if (buf_idx + DATA_UNIT_HEADER_SIZE >= buf_size)
2193 data_unit_size = AV_RB32(buf+buf_idx+5);
2194 if (data_unit_size > buf_size - buf_idx || !data_unit_size) {
2195 if(data_unit_size > buf_size - buf_idx)
2196 av_log(s->avctx, AV_LOG_ERROR,
2197 "Data unit with size %d is larger than input buffer, discarding\n",
2202 /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3 inside the function parse_sequence() */
2203 ret = dirac_decode_data_unit(avctx, buf+buf_idx, data_unit_size);
2206 av_log(s->avctx, AV_LOG_ERROR,"Error in dirac_decode_data_unit\n");
2209 buf_idx += data_unit_size;
2212 if (!s->current_picture)
2215 if (s->current_picture->avframe->display_picture_number > s->frame_number) {
2216 DiracFrame *delayed_frame = remove_frame(s->delay_frames, s->frame_number);
2218 s->current_picture->reference |= DELAYED_PIC_REF;
2220 if (add_frame(s->delay_frames, MAX_DELAY, s->current_picture)) {
2221 int min_num = s->delay_frames[0]->avframe->display_picture_number;
2222 /* Too many delayed frames, so we display the frame with the lowest pts */
2223 av_log(avctx, AV_LOG_ERROR, "Delay frame overflow\n");
2225 for (i = 1; s->delay_frames[i]; i++)
2226 if (s->delay_frames[i]->avframe->display_picture_number < min_num)
2227 min_num = s->delay_frames[i]->avframe->display_picture_number;
2229 delayed_frame = remove_frame(s->delay_frames, min_num);
2230 add_frame(s->delay_frames, MAX_DELAY, s->current_picture);
2233 if (delayed_frame) {
2234 delayed_frame->reference ^= DELAYED_PIC_REF;
2235 if((ret=av_frame_ref(data, delayed_frame->avframe)) < 0)
2239 } else if (s->current_picture->avframe->display_picture_number == s->frame_number) {
2240 /* The right frame at the right time :-) */
2241 if((ret=av_frame_ref(data, s->current_picture->avframe)) < 0)
2247 s->frame_number = picture->display_picture_number + 1;
2252 AVCodec ff_dirac_decoder = {
2254 .long_name = NULL_IF_CONFIG_SMALL("BBC Dirac VC-2"),
2255 .type = AVMEDIA_TYPE_VIDEO,
2256 .id = AV_CODEC_ID_DIRAC,
2257 .priv_data_size = sizeof(DiracContext),
2258 .init = dirac_decode_init,
2259 .close = dirac_decode_end,
2260 .decode = dirac_decode_frame,
2261 .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_DR1,
2262 .flush = dirac_decode_flush,