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