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