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+1LL)) / cb_height;
616  left = 0;
617  for (cb_x = 0; cb_x < cb_width; cb_x++) {
618  right = (b->width * (cb_x+1LL)) / 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  if (!slices)
785  return AVERROR(ENOMEM);
786 
787  align_get_bits(&s->gb);
788  /*[DIRAC_STD] 13.5.2 Slices. slice(sx,sy) */
789  buf = s->gb.buffer + get_bits_count(&s->gb)/8;
790  bufsize = get_bits_left(&s->gb);
791 
792  for (slice_y = 0; bufsize > 0 && slice_y < s->lowdelay.num_y; slice_y++)
793  for (slice_x = 0; bufsize > 0 && slice_x < s->lowdelay.num_x; slice_x++) {
794  bytes = (slice_num+1) * s->lowdelay.bytes.num / s->lowdelay.bytes.den
795  - slice_num * s->lowdelay.bytes.num / s->lowdelay.bytes.den;
796 
797  slices[slice_num].bytes = bytes;
798  slices[slice_num].slice_x = slice_x;
799  slices[slice_num].slice_y = slice_y;
800  init_get_bits(&slices[slice_num].gb, buf, bufsize);
801  slice_num++;
802 
803  buf += bytes;
804  bufsize -= bytes*8;
805  }
806 
807  avctx->execute(avctx, decode_lowdelay_slice, slices, NULL, slice_num,
808  sizeof(struct lowdelay_slice)); /* [DIRAC_STD] 13.5.2 Slices */
809  intra_dc_prediction(&s->plane[0].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
810  intra_dc_prediction(&s->plane[1].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
811  intra_dc_prediction(&s->plane[2].band[0][0]); /* [DIRAC_STD] 13.3 intra_dc_prediction() */
812  av_free(slices);
813  return 0;
814 }
815 
817 {
818  int i, w, h, level, orientation;
819 
820  for (i = 0; i < 3; i++) {
821  Plane *p = &s->plane[i];
822 
823  p->width = s->source.width >> (i ? s->chroma_x_shift : 0);
824  p->height = s->source.height >> (i ? s->chroma_y_shift : 0);
825  p->idwt_width = w = CALC_PADDING(p->width , s->wavelet_depth);
826  p->idwt_height = h = CALC_PADDING(p->height, s->wavelet_depth);
827  p->idwt_stride = FFALIGN(p->idwt_width, 8);
828 
829  for (level = s->wavelet_depth-1; level >= 0; level--) {
830  w = w>>1;
831  h = h>>1;
832  for (orientation = !!level; orientation < 4; orientation++) {
833  SubBand *b = &p->band[level][orientation];
834 
835  b->ibuf = p->idwt_buf;
836  b->level = level;
837  b->stride = p->idwt_stride << (s->wavelet_depth - level);
838  b->width = w;
839  b->height = h;
840  b->orientation = orientation;
841 
842  if (orientation & 1)
843  b->ibuf += w;
844  if (orientation > 1)
845  b->ibuf += b->stride>>1;
846 
847  if (level)
848  b->parent = &p->band[level-1][orientation];
849  }
850  }
851 
852  if (i > 0) {
853  p->xblen = s->plane[0].xblen >> s->chroma_x_shift;
854  p->yblen = s->plane[0].yblen >> s->chroma_y_shift;
855  p->xbsep = s->plane[0].xbsep >> s->chroma_x_shift;
856  p->ybsep = s->plane[0].ybsep >> s->chroma_y_shift;
857  }
858 
859  p->xoffset = (p->xblen - p->xbsep)/2;
860  p->yoffset = (p->yblen - p->ybsep)/2;
861  }
862 }
863 
864 /**
865  * Unpack the motion compensation parameters
866  * Dirac Specification ->
867  * 11.2 Picture prediction data. picture_prediction()
868  */
870 {
871  static const uint8_t default_blen[] = { 4, 12, 16, 24 };
872  static const uint8_t default_bsep[] = { 4, 8, 12, 16 };
873 
874  GetBitContext *gb = &s->gb;
875  unsigned idx, ref;
876 
877  align_get_bits(gb);
878  /* [DIRAC_STD] 11.2.2 Block parameters. block_parameters() */
879  /* Luma and Chroma are equal. 11.2.3 */
880  idx = svq3_get_ue_golomb(gb); /* [DIRAC_STD] index */
881 
882  if (idx > 4) {
883  av_log(s->avctx, AV_LOG_ERROR, "Block prediction index too high\n");
884  return -1;
885  }
886 
887  if (idx == 0) {
888  s->plane[0].xblen = svq3_get_ue_golomb(gb);
889  s->plane[0].yblen = svq3_get_ue_golomb(gb);
890  s->plane[0].xbsep = svq3_get_ue_golomb(gb);
891  s->plane[0].ybsep = svq3_get_ue_golomb(gb);
892  } else {
893  /*[DIRAC_STD] preset_block_params(index). Table 11.1 */
894  s->plane[0].xblen = default_blen[idx-1];
895  s->plane[0].yblen = default_blen[idx-1];
896  s->plane[0].xbsep = default_bsep[idx-1];
897  s->plane[0].ybsep = default_bsep[idx-1];
898  }
899  /*[DIRAC_STD] 11.2.4 motion_data_dimensions()
900  Calculated in function dirac_unpack_block_motion_data */
901 
902  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) {
903  av_log(s->avctx, AV_LOG_ERROR, "Block separation too small\n");
904  return -1;
905  }
906  if (s->plane[0].xbsep > s->plane[0].xblen || s->plane[0].ybsep > s->plane[0].yblen) {
907  av_log(s->avctx, AV_LOG_ERROR, "Block separation greater than size\n");
908  return -1;
909  }
910  if (FFMAX(s->plane[0].xblen, s->plane[0].yblen) > MAX_BLOCKSIZE) {
911  av_log(s->avctx, AV_LOG_ERROR, "Unsupported large block size\n");
912  return -1;
913  }
914 
915  /*[DIRAC_STD] 11.2.5 Motion vector precision. motion_vector_precision()
916  Read motion vector precision */
918  if (s->mv_precision > 3) {
919  av_log(s->avctx, AV_LOG_ERROR, "MV precision finer than eighth-pel\n");
920  return -1;
921  }
922 
923  /*[DIRAC_STD] 11.2.6 Global motion. global_motion()
924  Read the global motion compensation parameters */
925  s->globalmc_flag = get_bits1(gb);
926  if (s->globalmc_flag) {
927  memset(s->globalmc, 0, sizeof(s->globalmc));
928  /* [DIRAC_STD] pan_tilt(gparams) */
929  for (ref = 0; ref < s->num_refs; ref++) {
930  if (get_bits1(gb)) {
931  s->globalmc[ref].pan_tilt[0] = dirac_get_se_golomb(gb);
932  s->globalmc[ref].pan_tilt[1] = dirac_get_se_golomb(gb);
933  }
934  /* [DIRAC_STD] zoom_rotate_shear(gparams)
935  zoom/rotation/shear parameters */
936  if (get_bits1(gb)) {
937  s->globalmc[ref].zrs_exp = svq3_get_ue_golomb(gb);
938  s->globalmc[ref].zrs[0][0] = dirac_get_se_golomb(gb);
939  s->globalmc[ref].zrs[0][1] = dirac_get_se_golomb(gb);
940  s->globalmc[ref].zrs[1][0] = dirac_get_se_golomb(gb);
941  s->globalmc[ref].zrs[1][1] = dirac_get_se_golomb(gb);
942  } else {
943  s->globalmc[ref].zrs[0][0] = 1;
944  s->globalmc[ref].zrs[1][1] = 1;
945  }
946  /* [DIRAC_STD] perspective(gparams) */
947  if (get_bits1(gb)) {
949  s->globalmc[ref].perspective[0] = dirac_get_se_golomb(gb);
950  s->globalmc[ref].perspective[1] = dirac_get_se_golomb(gb);
951  }
952  }
953  }
954 
955  /*[DIRAC_STD] 11.2.7 Picture prediction mode. prediction_mode()
956  Picture prediction mode, not currently used. */
957  if (svq3_get_ue_golomb(gb)) {
958  av_log(s->avctx, AV_LOG_ERROR, "Unknown picture prediction mode\n");
959  return -1;
960  }
961 
962  /* [DIRAC_STD] 11.2.8 Reference picture weight. reference_picture_weights()
963  just data read, weight calculation will be done later on. */
964  s->weight_log2denom = 1;
965  s->weight[0] = 1;
966  s->weight[1] = 1;
967 
968  if (get_bits1(gb)) {
970  s->weight[0] = dirac_get_se_golomb(gb);
971  if (s->num_refs == 2)
972  s->weight[1] = dirac_get_se_golomb(gb);
973  }
974  return 0;
975 }
976 
977 /**
978  * Dirac Specification ->
979  * 11.3 Wavelet transform data. wavelet_transform()
980  */
982 {
983  GetBitContext *gb = &s->gb;
984  int i, level;
985  unsigned tmp;
986 
987 #define CHECKEDREAD(dst, cond, errmsg) \
988  tmp = svq3_get_ue_golomb(gb); \
989  if (cond) { \
990  av_log(s->avctx, AV_LOG_ERROR, errmsg); \
991  return -1; \
992  }\
993  dst = tmp;
994 
995  align_get_bits(gb);
996 
997  s->zero_res = s->num_refs ? get_bits1(gb) : 0;
998  if (s->zero_res)
999  return 0;
1000 
1001  /*[DIRAC_STD] 11.3.1 Transform parameters. transform_parameters() */
1002  CHECKEDREAD(s->wavelet_idx, tmp > 6, "wavelet_idx is too big\n")
1003 
1004  CHECKEDREAD(s->wavelet_depth, tmp > MAX_DWT_LEVELS || tmp < 1, "invalid number of DWT decompositions\n")
1005 
1006  if (!s->low_delay) {
1007  /* Codeblock parameters (core syntax only) */
1008  if (get_bits1(gb)) {
1009  for (i = 0; i <= s->wavelet_depth; i++) {
1010  CHECKEDREAD(s->codeblock[i].width , tmp < 1 || tmp > (s->avctx->width >>s->wavelet_depth-i), "codeblock width invalid\n")
1011  CHECKEDREAD(s->codeblock[i].height, tmp < 1 || tmp > (s->avctx->height>>s->wavelet_depth-i), "codeblock height invalid\n")
1012  }
1013 
1014  CHECKEDREAD(s->codeblock_mode, tmp > 1, "unknown codeblock mode\n")
1015  } else
1016  for (i = 0; i <= s->wavelet_depth; i++)
1017  s->codeblock[i].width = s->codeblock[i].height = 1;
1018  } else {
1019  /* Slice parameters + quantization matrix*/
1020  /*[DIRAC_STD] 11.3.4 Slice coding Parameters (low delay syntax only). slice_parameters() */
1025 
1026  if (s->lowdelay.bytes.den <= 0) {
1027  av_log(s->avctx,AV_LOG_ERROR,"Invalid lowdelay.bytes.den\n");
1028  return AVERROR_INVALIDDATA;
1029  }
1030 
1031  /* [DIRAC_STD] 11.3.5 Quantisation matrices (low-delay syntax). quant_matrix() */
1032  if (get_bits1(gb)) {
1033  av_log(s->avctx,AV_LOG_DEBUG,"Low Delay: Has Custom Quantization Matrix!\n");
1034  /* custom quantization matrix */
1035  s->lowdelay.quant[0][0] = svq3_get_ue_golomb(gb);
1036  for (level = 0; level < s->wavelet_depth; level++) {
1037  s->lowdelay.quant[level][1] = svq3_get_ue_golomb(gb);
1038  s->lowdelay.quant[level][2] = svq3_get_ue_golomb(gb);
1039  s->lowdelay.quant[level][3] = svq3_get_ue_golomb(gb);
1040  }
1041  } else {
1042  if (s->wavelet_depth > 4) {
1043  av_log(s->avctx,AV_LOG_ERROR,"Mandatory custom low delay matrix missing for depth %d\n", s->wavelet_depth);
1044  return AVERROR_INVALIDDATA;
1045  }
1046  /* default quantization matrix */
1047  for (level = 0; level < s->wavelet_depth; level++)
1048  for (i = 0; i < 4; i++) {
1049  s->lowdelay.quant[level][i] = default_qmat[s->wavelet_idx][level][i];
1050  /* haar with no shift differs for different depths */
1051  if (s->wavelet_idx == 3)
1052  s->lowdelay.quant[level][i] += 4*(s->wavelet_depth-1 - level);
1053  }
1054  }
1055  }
1056  return 0;
1057 }
1058 
1059 static inline int pred_sbsplit(uint8_t *sbsplit, int stride, int x, int y)
1060 {
1061  static const uint8_t avgsplit[7] = { 0, 0, 1, 1, 1, 2, 2 };
1062 
1063  if (!(x|y))
1064  return 0;
1065  else if (!y)
1066  return sbsplit[-1];
1067  else if (!x)
1068  return sbsplit[-stride];
1069 
1070  return avgsplit[sbsplit[-1] + sbsplit[-stride] + sbsplit[-stride-1]];
1071 }
1072 
1073 static inline int pred_block_mode(DiracBlock *block, int stride, int x, int y, int refmask)
1074 {
1075  int pred;
1076 
1077  if (!(x|y))
1078  return 0;
1079  else if (!y)
1080  return block[-1].ref & refmask;
1081  else if (!x)
1082  return block[-stride].ref & refmask;
1083 
1084  /* return the majority */
1085  pred = (block[-1].ref & refmask) + (block[-stride].ref & refmask) + (block[-stride-1].ref & refmask);
1086  return (pred >> 1) & refmask;
1087 }
1088 
1089 static inline void pred_block_dc(DiracBlock *block, int stride, int x, int y)
1090 {
1091  int i, n = 0;
1092 
1093  memset(block->u.dc, 0, sizeof(block->u.dc));
1094 
1095  if (x && !(block[-1].ref & 3)) {
1096  for (i = 0; i < 3; i++)
1097  block->u.dc[i] += block[-1].u.dc[i];
1098  n++;
1099  }
1100 
1101  if (y && !(block[-stride].ref & 3)) {
1102  for (i = 0; i < 3; i++)
1103  block->u.dc[i] += block[-stride].u.dc[i];
1104  n++;
1105  }
1106 
1107  if (x && y && !(block[-1-stride].ref & 3)) {
1108  for (i = 0; i < 3; i++)
1109  block->u.dc[i] += block[-1-stride].u.dc[i];
1110  n++;
1111  }
1112 
1113  if (n == 2) {
1114  for (i = 0; i < 3; i++)
1115  block->u.dc[i] = (block->u.dc[i]+1)>>1;
1116  } else if (n == 3) {
1117  for (i = 0; i < 3; i++)
1118  block->u.dc[i] = divide3(block->u.dc[i]);
1119  }
1120 }
1121 
1122 static inline void pred_mv(DiracBlock *block, int stride, int x, int y, int ref)
1123 {
1124  int16_t *pred[3];
1125  int refmask = ref+1;
1126  int mask = refmask | DIRAC_REF_MASK_GLOBAL; /* exclude gmc blocks */
1127  int n = 0;
1128 
1129  if (x && (block[-1].ref & mask) == refmask)
1130  pred[n++] = block[-1].u.mv[ref];
1131 
1132  if (y && (block[-stride].ref & mask) == refmask)
1133  pred[n++] = block[-stride].u.mv[ref];
1134 
1135  if (x && y && (block[-stride-1].ref & mask) == refmask)
1136  pred[n++] = block[-stride-1].u.mv[ref];
1137 
1138  switch (n) {
1139  case 0:
1140  block->u.mv[ref][0] = 0;
1141  block->u.mv[ref][1] = 0;
1142  break;
1143  case 1:
1144  block->u.mv[ref][0] = pred[0][0];
1145  block->u.mv[ref][1] = pred[0][1];
1146  break;
1147  case 2:
1148  block->u.mv[ref][0] = (pred[0][0] + pred[1][0] + 1) >> 1;
1149  block->u.mv[ref][1] = (pred[0][1] + pred[1][1] + 1) >> 1;
1150  break;
1151  case 3:
1152  block->u.mv[ref][0] = mid_pred(pred[0][0], pred[1][0], pred[2][0]);
1153  block->u.mv[ref][1] = mid_pred(pred[0][1], pred[1][1], pred[2][1]);
1154  break;
1155  }
1156 }
1157 
1158 static void global_mv(DiracContext *s, DiracBlock *block, int x, int y, int ref)
1159 {
1160  int ez = s->globalmc[ref].zrs_exp;
1161  int ep = s->globalmc[ref].perspective_exp;
1162  int (*A)[2] = s->globalmc[ref].zrs;
1163  int *b = s->globalmc[ref].pan_tilt;
1164  int *c = s->globalmc[ref].perspective;
1165 
1166  int m = (1<<ep) - (c[0]*x + c[1]*y);
1167  int mx = m * ((A[0][0] * x + A[0][1]*y) + (1<<ez) * b[0]);
1168  int my = m * ((A[1][0] * x + A[1][1]*y) + (1<<ez) * b[1]);
1169 
1170  block->u.mv[ref][0] = (mx + (1<<(ez+ep))) >> (ez+ep);
1171  block->u.mv[ref][1] = (my + (1<<(ez+ep))) >> (ez+ep);
1172 }
1173 
1175  int stride, int x, int y)
1176 {
1177  int i;
1178 
1179  block->ref = pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF1);
1180  block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF1);
1181 
1182  if (s->num_refs == 2) {
1183  block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_REF2);
1184  block->ref ^= dirac_get_arith_bit(arith, CTX_PMODE_REF2) << 1;
1185  }
1186 
1187  if (!block->ref) {
1188  pred_block_dc(block, stride, x, y);
1189  for (i = 0; i < 3; i++)
1190  block->u.dc[i] += dirac_get_arith_int(arith+1+i, CTX_DC_F1, CTX_DC_DATA);
1191  return;
1192  }
1193 
1194  if (s->globalmc_flag) {
1195  block->ref |= pred_block_mode(block, stride, x, y, DIRAC_REF_MASK_GLOBAL);
1196  block->ref ^= dirac_get_arith_bit(arith, CTX_GLOBAL_BLOCK) << 2;
1197  }
1198 
1199  for (i = 0; i < s->num_refs; i++)
1200  if (block->ref & (i+1)) {
1201  if (block->ref & DIRAC_REF_MASK_GLOBAL) {
1202  global_mv(s, block, x, y, i);
1203  } else {
1204  pred_mv(block, stride, x, y, i);
1205  block->u.mv[i][0] += dirac_get_arith_int(arith + 4 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
1206  block->u.mv[i][1] += dirac_get_arith_int(arith + 5 + 2 * i, CTX_MV_F1, CTX_MV_DATA);
1207  }
1208  }
1209 }
1210 
1211 /**
1212  * Copies the current block to the other blocks covered by the current superblock split mode
1213  */
1215 {
1216  int x, y;
1217  DiracBlock *dst = block;
1218 
1219  for (x = 1; x < size; x++)
1220  dst[x] = *block;
1221 
1222  for (y = 1; y < size; y++) {
1223  dst += stride;
1224  for (x = 0; x < size; x++)
1225  dst[x] = *block;
1226  }
1227 }
1228 
1229 /**
1230  * Dirac Specification ->
1231  * 12. Block motion data syntax
1232  */
1234 {
1235  GetBitContext *gb = &s->gb;
1236  uint8_t *sbsplit = s->sbsplit;
1237  int i, x, y, q, p;
1238  DiracArith arith[8];
1239 
1240  align_get_bits(gb);
1241 
1242  /* [DIRAC_STD] 11.2.4 and 12.2.1 Number of blocks and superblocks */
1243  s->sbwidth = DIVRNDUP(s->source.width, 4*s->plane[0].xbsep);
1244  s->sbheight = DIVRNDUP(s->source.height, 4*s->plane[0].ybsep);
1245  s->blwidth = 4 * s->sbwidth;
1246  s->blheight = 4 * s->sbheight;
1247 
1248  /* [DIRAC_STD] 12.3.1 Superblock splitting modes. superblock_split_modes()
1249  decode superblock split modes */
1250  ff_dirac_init_arith_decoder(arith, gb, svq3_get_ue_golomb(gb)); /* svq3_get_ue_golomb(gb) is the length */
1251  for (y = 0; y < s->sbheight; y++) {
1252  for (x = 0; x < s->sbwidth; x++) {
1253  unsigned int split = dirac_get_arith_uint(arith, CTX_SB_F1, CTX_SB_DATA);
1254  if (split > 2)
1255  return -1;
1256  sbsplit[x] = (split + pred_sbsplit(sbsplit+x, s->sbwidth, x, y)) % 3;
1257  }
1258  sbsplit += s->sbwidth;
1259  }
1260 
1261  /* setup arith decoding */
1263  for (i = 0; i < s->num_refs; i++) {
1264  ff_dirac_init_arith_decoder(arith + 4 + 2 * i, gb, svq3_get_ue_golomb(gb));
1265  ff_dirac_init_arith_decoder(arith + 5 + 2 * i, gb, svq3_get_ue_golomb(gb));
1266  }
1267  for (i = 0; i < 3; i++)
1268  ff_dirac_init_arith_decoder(arith+1+i, gb, svq3_get_ue_golomb(gb));
1269 
1270  for (y = 0; y < s->sbheight; y++)
1271  for (x = 0; x < s->sbwidth; x++) {
1272  int blkcnt = 1 << s->sbsplit[y * s->sbwidth + x];
1273  int step = 4 >> s->sbsplit[y * s->sbwidth + x];
1274 
1275  for (q = 0; q < blkcnt; q++)
1276  for (p = 0; p < blkcnt; p++) {
1277  int bx = 4 * x + p*step;
1278  int by = 4 * y + q*step;
1279  DiracBlock *block = &s->blmotion[by*s->blwidth + bx];
1280  decode_block_params(s, arith, block, s->blwidth, bx, by);
1281  propagate_block_data(block, s->blwidth, step);
1282  }
1283  }
1284 
1285  return 0;
1286 }
1287 
1288 static int weight(int i, int blen, int offset)
1289 {
1290 #define ROLLOFF(i) offset == 1 ? ((i) ? 5 : 3) : \
1291  (1 + (6*(i) + offset - 1) / (2*offset - 1))
1292 
1293  if (i < 2*offset)
1294  return ROLLOFF(i);
1295  else if (i > blen-1 - 2*offset)
1296  return ROLLOFF(blen-1 - i);
1297  return 8;
1298 }
1299 
1300 static void init_obmc_weight_row(Plane *p, uint8_t *obmc_weight, int stride,
1301  int left, int right, int wy)
1302 {
1303  int x;
1304  for (x = 0; left && x < p->xblen >> 1; x++)
1305  obmc_weight[x] = wy*8;
1306  for (; x < p->xblen >> right; x++)
1307  obmc_weight[x] = wy*weight(x, p->xblen, p->xoffset);
1308  for (; x < p->xblen; x++)
1309  obmc_weight[x] = wy*8;
1310  for (; x < stride; x++)
1311  obmc_weight[x] = 0;
1312 }
1313 
1314 static void init_obmc_weight(Plane *p, uint8_t *obmc_weight, int stride,
1315  int left, int right, int top, int bottom)
1316 {
1317  int y;
1318  for (y = 0; top && y < p->yblen >> 1; y++) {
1319  init_obmc_weight_row(p, obmc_weight, stride, left, right, 8);
1320  obmc_weight += stride;
1321  }
1322  for (; y < p->yblen >> bottom; y++) {
1323  int wy = weight(y, p->yblen, p->yoffset);
1324  init_obmc_weight_row(p, obmc_weight, stride, left, right, wy);
1325  obmc_weight += stride;
1326  }
1327  for (; y < p->yblen; y++) {
1328  init_obmc_weight_row(p, obmc_weight, stride, left, right, 8);
1329  obmc_weight += stride;
1330  }
1331 }
1332 
1333 static void init_obmc_weights(DiracContext *s, Plane *p, int by)
1334 {
1335  int top = !by;
1336  int bottom = by == s->blheight-1;
1337 
1338  /* don't bother re-initing for rows 2 to blheight-2, the weights don't change */
1339  if (top || bottom || by == 1) {
1340  init_obmc_weight(p, s->obmc_weight[0], MAX_BLOCKSIZE, 1, 0, top, bottom);
1341  init_obmc_weight(p, s->obmc_weight[1], MAX_BLOCKSIZE, 0, 0, top, bottom);
1342  init_obmc_weight(p, s->obmc_weight[2], MAX_BLOCKSIZE, 0, 1, top, bottom);
1343  }
1344 }
1345 
1346 static const uint8_t epel_weights[4][4][4] = {
1347  {{ 16, 0, 0, 0 },
1348  { 12, 4, 0, 0 },
1349  { 8, 8, 0, 0 },
1350  { 4, 12, 0, 0 }},
1351  {{ 12, 0, 4, 0 },
1352  { 9, 3, 3, 1 },
1353  { 6, 6, 2, 2 },
1354  { 3, 9, 1, 3 }},
1355  {{ 8, 0, 8, 0 },
1356  { 6, 2, 6, 2 },
1357  { 4, 4, 4, 4 },
1358  { 2, 6, 2, 6 }},
1359  {{ 4, 0, 12, 0 },
1360  { 3, 1, 9, 3 },
1361  { 2, 2, 6, 6 },
1362  { 1, 3, 3, 9 }}
1363 };
1364 
1365 /**
1366  * For block x,y, determine which of the hpel planes to do bilinear
1367  * interpolation from and set src[] to the location in each hpel plane
1368  * to MC from.
1369  *
1370  * @return the index of the put_dirac_pixels_tab function to use
1371  * 0 for 1 plane (fpel,hpel), 1 for 2 planes (qpel), 2 for 4 planes (qpel), and 3 for epel
1372  */
1374  int x, int y, int ref, int plane)
1375 {
1376  Plane *p = &s->plane[plane];
1377  uint8_t **ref_hpel = s->ref_pics[ref]->hpel[plane];
1378  int motion_x = block->u.mv[ref][0];
1379  int motion_y = block->u.mv[ref][1];
1380  int mx, my, i, epel, nplanes = 0;
1381 
1382  if (plane) {
1383  motion_x >>= s->chroma_x_shift;
1384  motion_y >>= s->chroma_y_shift;
1385  }
1386 
1387  mx = motion_x & ~(-1U << s->mv_precision);
1388  my = motion_y & ~(-1U << s->mv_precision);
1389  motion_x >>= s->mv_precision;
1390  motion_y >>= s->mv_precision;
1391  /* normalize subpel coordinates to epel */
1392  /* TODO: template this function? */
1393  mx <<= 3 - s->mv_precision;
1394  my <<= 3 - s->mv_precision;
1395 
1396  x += motion_x;
1397  y += motion_y;
1398  epel = (mx|my)&1;
1399 
1400  /* hpel position */
1401  if (!((mx|my)&3)) {
1402  nplanes = 1;
1403  src[0] = ref_hpel[(my>>1)+(mx>>2)] + y*p->stride + x;
1404  } else {
1405  /* qpel or epel */
1406  nplanes = 4;
1407  for (i = 0; i < 4; i++)
1408  src[i] = ref_hpel[i] + y*p->stride + x;
1409 
1410  /* if we're interpolating in the right/bottom halves, adjust the planes as needed
1411  we increment x/y because the edge changes for half of the pixels */
1412  if (mx > 4) {
1413  src[0] += 1;
1414  src[2] += 1;
1415  x++;
1416  }
1417  if (my > 4) {
1418  src[0] += p->stride;
1419  src[1] += p->stride;
1420  y++;
1421  }
1422 
1423  /* hpel planes are:
1424  [0]: F [1]: H
1425  [2]: V [3]: C */
1426  if (!epel) {
1427  /* check if we really only need 2 planes since either mx or my is
1428  a hpel position. (epel weights of 0 handle this there) */
1429  if (!(mx&3)) {
1430  /* mx == 0: average [0] and [2]
1431  mx == 4: average [1] and [3] */
1432  src[!mx] = src[2 + !!mx];
1433  nplanes = 2;
1434  } else if (!(my&3)) {
1435  src[0] = src[(my>>1) ];
1436  src[1] = src[(my>>1)+1];
1437  nplanes = 2;
1438  }
1439  } else {
1440  /* adjust the ordering if needed so the weights work */
1441  if (mx > 4) {
1442  FFSWAP(const uint8_t *, src[0], src[1]);
1443  FFSWAP(const uint8_t *, src[2], src[3]);
1444  }
1445  if (my > 4) {
1446  FFSWAP(const uint8_t *, src[0], src[2]);
1447  FFSWAP(const uint8_t *, src[1], src[3]);
1448  }
1449  src[4] = epel_weights[my&3][mx&3];
1450  }
1451  }
1452 
1453  /* fixme: v/h _edge_pos */
1454  if (x + p->xblen > p->width +EDGE_WIDTH/2 ||
1455  y + p->yblen > p->height+EDGE_WIDTH/2 ||
1456  x < 0 || y < 0) {
1457  for (i = 0; i < nplanes; i++) {
1458  s->vdsp.emulated_edge_mc(s->edge_emu_buffer[i], src[i],
1459  p->stride, p->stride,
1460  p->xblen, p->yblen, x, y,
1461  p->width+EDGE_WIDTH/2, p->height+EDGE_WIDTH/2);
1462  src[i] = s->edge_emu_buffer[i];
1463  }
1464  }
1465  return (nplanes>>1) + epel;
1466 }
1467 
1468 static void add_dc(uint16_t *dst, int dc, int stride,
1469  uint8_t *obmc_weight, int xblen, int yblen)
1470 {
1471  int x, y;
1472  dc += 128;
1473 
1474  for (y = 0; y < yblen; y++) {
1475  for (x = 0; x < xblen; x += 2) {
1476  dst[x ] += dc * obmc_weight[x ];
1477  dst[x+1] += dc * obmc_weight[x+1];
1478  }
1479  dst += stride;
1480  obmc_weight += MAX_BLOCKSIZE;
1481  }
1482 }
1483 
1485  uint16_t *mctmp, uint8_t *obmc_weight,
1486  int plane, int dstx, int dsty)
1487 {
1488  Plane *p = &s->plane[plane];
1489  const uint8_t *src[5];
1490  int idx;
1491 
1492  switch (block->ref&3) {
1493  case 0: /* DC */
1494  add_dc(mctmp, block->u.dc[plane], p->stride, obmc_weight, p->xblen, p->yblen);
1495  return;
1496  case 1:
1497  case 2:
1498  idx = mc_subpel(s, block, src, dstx, dsty, (block->ref&3)-1, plane);
1499  s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1500  if (s->weight_func)
1502  s->weight[0] + s->weight[1], p->yblen);
1503  break;
1504  case 3:
1505  idx = mc_subpel(s, block, src, dstx, dsty, 0, plane);
1506  s->put_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1507  idx = mc_subpel(s, block, src, dstx, dsty, 1, plane);
1508  if (s->biweight_func) {
1509  /* fixme: +32 is a quick hack */
1510  s->put_pixels_tab[idx](s->mcscratch + 32, src, p->stride, p->yblen);
1512  s->weight[0], s->weight[1], p->yblen);
1513  } else
1514  s->avg_pixels_tab[idx](s->mcscratch, src, p->stride, p->yblen);
1515  break;
1516  }
1517  s->add_obmc(mctmp, s->mcscratch, p->stride, obmc_weight, p->yblen);
1518 }
1519 
1520 static void mc_row(DiracContext *s, DiracBlock *block, uint16_t *mctmp, int plane, int dsty)
1521 {
1522  Plane *p = &s->plane[plane];
1523  int x, dstx = p->xbsep - p->xoffset;
1524 
1525  block_mc(s, block, mctmp, s->obmc_weight[0], plane, -p->xoffset, dsty);
1526  mctmp += p->xbsep;
1527 
1528  for (x = 1; x < s->blwidth-1; x++) {
1529  block_mc(s, block+x, mctmp, s->obmc_weight[1], plane, dstx, dsty);
1530  dstx += p->xbsep;
1531  mctmp += p->xbsep;
1532  }
1533  block_mc(s, block+x, mctmp, s->obmc_weight[2], plane, dstx, dsty);
1534 }
1535 
1536 static void select_dsp_funcs(DiracContext *s, int width, int height, int xblen, int yblen)
1537 {
1538  int idx = 0;
1539  if (xblen > 8)
1540  idx = 1;
1541  if (xblen > 16)
1542  idx = 2;
1543 
1544  memcpy(s->put_pixels_tab, s->diracdsp.put_dirac_pixels_tab[idx], sizeof(s->put_pixels_tab));
1545  memcpy(s->avg_pixels_tab, s->diracdsp.avg_dirac_pixels_tab[idx], sizeof(s->avg_pixels_tab));
1546  s->add_obmc = s->diracdsp.add_dirac_obmc[idx];
1547  if (s->weight_log2denom > 1 || s->weight[0] != 1 || s->weight[1] != 1) {
1550  } else {
1551  s->weight_func = NULL;
1552  s->biweight_func = NULL;
1553  }
1554 }
1555 
1556 static void interpolate_refplane(DiracContext *s, DiracFrame *ref, int plane, int width, int height)
1557 {
1558  /* chroma allocates an edge of 8 when subsampled
1559  which for 4:2:2 means an h edge of 16 and v edge of 8
1560  just use 8 for everything for the moment */
1561  int i, edge = EDGE_WIDTH/2;
1562 
1563  ref->hpel[plane][0] = ref->avframe->data[plane];
1564  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 */
1565 
1566  /* no need for hpel if we only have fpel vectors */
1567  if (!s->mv_precision)
1568  return;
1569 
1570  for (i = 1; i < 4; i++) {
1571  if (!ref->hpel_base[plane][i])
1572  ref->hpel_base[plane][i] = av_malloc((height+2*edge) * ref->avframe->linesize[plane] + 32);
1573  /* we need to be 16-byte aligned even for chroma */
1574  ref->hpel[plane][i] = ref->hpel_base[plane][i] + edge*ref->avframe->linesize[plane] + 16;
1575  }
1576 
1577  if (!ref->interpolated[plane]) {
1578  s->diracdsp.dirac_hpel_filter(ref->hpel[plane][1], ref->hpel[plane][2],
1579  ref->hpel[plane][3], ref->hpel[plane][0],
1580  ref->avframe->linesize[plane], width, height);
1581  s->mpvencdsp.draw_edges(ref->hpel[plane][1], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1582  s->mpvencdsp.draw_edges(ref->hpel[plane][2], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1583  s->mpvencdsp.draw_edges(ref->hpel[plane][3], ref->avframe->linesize[plane], width, height, edge, edge, EDGE_TOP | EDGE_BOTTOM);
1584  }
1585  ref->interpolated[plane] = 1;
1586 }
1587 
1588 /**
1589  * Dirac Specification ->
1590  * 13.0 Transform data syntax. transform_data()
1591  */
1593 {
1594  DWTContext d;
1595  int y, i, comp, dsty;
1596  int ret;
1597 
1598  if (s->low_delay) {
1599  /* [DIRAC_STD] 13.5.1 low_delay_transform_data() */
1600  for (comp = 0; comp < 3; comp++) {
1601  Plane *p = &s->plane[comp];
1602  memset(p->idwt_buf, 0, p->idwt_stride * p->idwt_height * sizeof(IDWTELEM));
1603  }
1604  if (!s->zero_res) {
1605  if ((ret = decode_lowdelay(s)) < 0)
1606  return ret;
1607  }
1608  }
1609 
1610  for (comp = 0; comp < 3; comp++) {
1611  Plane *p = &s->plane[comp];
1613 
1614  /* FIXME: small resolutions */
1615  for (i = 0; i < 4; i++)
1616  s->edge_emu_buffer[i] = s->edge_emu_buffer_base + i*FFALIGN(p->width, 16);
1617 
1618  if (!s->zero_res && !s->low_delay)
1619  {
1620  memset(p->idwt_buf, 0, p->idwt_stride * p->idwt_height * sizeof(IDWTELEM));
1621  decode_component(s, comp); /* [DIRAC_STD] 13.4.1 core_transform_data() */
1622  }
1624  s->wavelet_idx+2, s->wavelet_depth, p->idwt_tmp))
1625  return -1;
1626 
1627  if (!s->num_refs) { /* intra */
1628  for (y = 0; y < p->height; y += 16) {
1629  ff_spatial_idwt_slice2(&d, y+16); /* decode */
1630  s->diracdsp.put_signed_rect_clamped(frame + y*p->stride, p->stride,
1631  p->idwt_buf + y*p->idwt_stride, p->idwt_stride, p->width, 16);
1632  }
1633  } else { /* inter */
1634  int rowheight = p->ybsep*p->stride;
1635 
1636  select_dsp_funcs(s, p->width, p->height, p->xblen, p->yblen);
1637 
1638  for (i = 0; i < s->num_refs; i++)
1639  interpolate_refplane(s, s->ref_pics[i], comp, p->width, p->height);
1640 
1641  memset(s->mctmp, 0, 4*p->yoffset*p->stride);
1642 
1643  dsty = -p->yoffset;
1644  for (y = 0; y < s->blheight; y++) {
1645  int h = 0,
1646  start = FFMAX(dsty, 0);
1647  uint16_t *mctmp = s->mctmp + y*rowheight;
1648  DiracBlock *blocks = s->blmotion + y*s->blwidth;
1649 
1650  init_obmc_weights(s, p, y);
1651 
1652  if (y == s->blheight-1 || start+p->ybsep > p->height)
1653  h = p->height - start;
1654  else
1655  h = p->ybsep - (start - dsty);
1656  if (h < 0)
1657  break;
1658 
1659  memset(mctmp+2*p->yoffset*p->stride, 0, 2*rowheight);
1660  mc_row(s, blocks, mctmp, comp, dsty);
1661 
1662  mctmp += (start - dsty)*p->stride + p->xoffset;
1663  ff_spatial_idwt_slice2(&d, start + h); /* decode */
1664  s->diracdsp.add_rect_clamped(frame + start*p->stride, mctmp, p->stride,
1665  p->idwt_buf + start*p->idwt_stride, p->idwt_stride, p->width, h);
1666 
1667  dsty += p->ybsep;
1668  }
1669  }
1670  }
1671 
1672 
1673  return 0;
1674 }
1675 
1677 {
1678  int ret, i;
1679  int chroma_x_shift, chroma_y_shift;
1680  avcodec_get_chroma_sub_sample(avctx->pix_fmt, &chroma_x_shift, &chroma_y_shift);
1681 
1682  f->width = avctx->width + 2 * EDGE_WIDTH;
1683  f->height = avctx->height + 2 * EDGE_WIDTH + 2;
1684  ret = ff_get_buffer(avctx, f, flags);
1685  if (ret < 0)
1686  return ret;
1687 
1688  for (i = 0; f->data[i]; i++) {
1689  int offset = (EDGE_WIDTH >> (i && i<3 ? chroma_y_shift : 0)) *
1690  f->linesize[i] + 32;
1691  f->data[i] += offset;
1692  }
1693  f->width = avctx->width;
1694  f->height = avctx->height;
1695 
1696  return 0;
1697 }
1698 
1699 /**
1700  * Dirac Specification ->
1701  * 11.1.1 Picture Header. picture_header()
1702  */
1704 {
1705  int retire, picnum;
1706  int i, j, refnum, refdist;
1707  GetBitContext *gb = &s->gb;
1708 
1709  /* [DIRAC_STD] 11.1.1 Picture Header. picture_header() PICTURE_NUM */
1711 
1712 
1713  av_log(s->avctx,AV_LOG_DEBUG,"PICTURE_NUM: %d\n",picnum);
1714 
1715  /* if this is the first keyframe after a sequence header, start our
1716  reordering from here */
1717  if (s->frame_number < 0)
1718  s->frame_number = picnum;
1719 
1720  s->ref_pics[0] = s->ref_pics[1] = NULL;
1721  for (i = 0; i < s->num_refs; i++) {
1722  refnum = picnum + dirac_get_se_golomb(gb);
1723  refdist = INT_MAX;
1724 
1725  /* find the closest reference to the one we want */
1726  /* Jordi: this is needed if the referenced picture hasn't yet arrived */
1727  for (j = 0; j < MAX_REFERENCE_FRAMES && refdist; j++)
1728  if (s->ref_frames[j]
1729  && FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum) < refdist) {
1730  s->ref_pics[i] = s->ref_frames[j];
1731  refdist = FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum);
1732  }
1733 
1734  if (!s->ref_pics[i] || refdist)
1735  av_log(s->avctx, AV_LOG_DEBUG, "Reference not found\n");
1736 
1737  /* if there were no references at all, allocate one */
1738  if (!s->ref_pics[i])
1739  for (j = 0; j < MAX_FRAMES; j++)
1740  if (!s->all_frames[j].avframe->data[0]) {
1741  s->ref_pics[i] = &s->all_frames[j];
1743  break;
1744  }
1745  }
1746 
1747  /* retire the reference frames that are not used anymore */
1748  if (s->current_picture->avframe->reference) {
1749  retire = picnum + dirac_get_se_golomb(gb);
1750  if (retire != picnum) {
1751  DiracFrame *retire_pic = remove_frame(s->ref_frames, retire);
1752 
1753  if (retire_pic)
1754  retire_pic->avframe->reference &= DELAYED_PIC_REF;
1755  else
1756  av_log(s->avctx, AV_LOG_DEBUG, "Frame to retire not found\n");
1757  }
1758 
1759  /* if reference array is full, remove the oldest as per the spec */
1761  av_log(s->avctx, AV_LOG_ERROR, "Reference frame overflow\n");
1763  }
1764  }
1765 
1766  if (s->num_refs) {
1767  if (dirac_unpack_prediction_parameters(s)) /* [DIRAC_STD] 11.2 Picture Prediction Data. picture_prediction() */
1768  return -1;
1769  if (dirac_unpack_block_motion_data(s)) /* [DIRAC_STD] 12. Block motion data syntax */
1770  return -1;
1771  }
1772  if (dirac_unpack_idwt_params(s)) /* [DIRAC_STD] 11.3 Wavelet transform data */
1773  return -1;
1774 
1775  init_planes(s);
1776  return 0;
1777 }
1778 
1779 static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame)
1780 {
1781  DiracFrame *out = s->delay_frames[0];
1782  int i, out_idx = 0;
1783  int ret;
1784 
1785  /* find frame with lowest picture number */
1786  for (i = 1; s->delay_frames[i]; i++)
1788  out = s->delay_frames[i];
1789  out_idx = i;
1790  }
1791 
1792  for (i = out_idx; s->delay_frames[i]; i++)
1793  s->delay_frames[i] = s->delay_frames[i+1];
1794 
1795  if (out) {
1797  *got_frame = 1;
1798  if((ret = av_frame_ref(picture, out->avframe)) < 0)
1799  return ret;
1800  }
1801 
1802  return 0;
1803 }
1804 
1805 /**
1806  * Dirac Specification ->
1807  * 9.6 Parse Info Header Syntax. parse_info()
1808  * 4 byte start code + byte parse code + 4 byte size + 4 byte previous size
1809  */
1810 #define DATA_UNIT_HEADER_SIZE 13
1811 
1812 /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3
1813  inside the function parse_sequence() */
1814 static int dirac_decode_data_unit(AVCodecContext *avctx, const uint8_t *buf, int size)
1815 {
1816  DiracContext *s = avctx->priv_data;
1817  DiracFrame *pic = NULL;
1818  int ret, i, parse_code = buf[4];
1819  unsigned tmp;
1820 
1821  if (size < DATA_UNIT_HEADER_SIZE)
1822  return -1;
1823 
1824  init_get_bits(&s->gb, &buf[13], 8*(size - DATA_UNIT_HEADER_SIZE));
1825 
1826  if (parse_code == pc_seq_header) {
1827  if (s->seen_sequence_header)
1828  return 0;
1829 
1830  /* [DIRAC_STD] 10. Sequence header */
1831  if (avpriv_dirac_parse_sequence_header(avctx, &s->gb, &s->source))
1832  return -1;
1833 
1835 
1836  if (alloc_sequence_buffers(s))
1837  return -1;
1838 
1839  s->seen_sequence_header = 1;
1840  } else if (parse_code == pc_eos) { /* [DIRAC_STD] End of Sequence */
1842  s->seen_sequence_header = 0;
1843  } else if (parse_code == pc_aux_data) {
1844  if (buf[13] == 1) { /* encoder implementation/version */
1845  int ver[3];
1846  /* versions older than 1.0.8 don't store quant delta for
1847  subbands with only one codeblock */
1848  if (sscanf(buf+14, "Schroedinger %d.%d.%d", ver, ver+1, ver+2) == 3)
1849  if (ver[0] == 1 && ver[1] == 0 && ver[2] <= 7)
1850  s->old_delta_quant = 1;
1851  }
1852  } else if (parse_code & 0x8) { /* picture data unit */
1853  if (!s->seen_sequence_header) {
1854  av_log(avctx, AV_LOG_DEBUG, "Dropping frame without sequence header\n");
1855  return -1;
1856  }
1857 
1858  /* find an unused frame */
1859  for (i = 0; i < MAX_FRAMES; i++)
1860  if (s->all_frames[i].avframe->data[0] == NULL)
1861  pic = &s->all_frames[i];
1862  if (!pic) {
1863  av_log(avctx, AV_LOG_ERROR, "framelist full\n");
1864  return -1;
1865  }
1866 
1867  av_frame_unref(pic->avframe);
1868 
1869  /* [DIRAC_STD] Defined in 9.6.1 ... */
1870  tmp = parse_code & 0x03; /* [DIRAC_STD] num_refs() */
1871  if (tmp > 2) {
1872  av_log(avctx, AV_LOG_ERROR, "num_refs of 3\n");
1873  return -1;
1874  }
1875  s->num_refs = tmp;
1876  s->is_arith = (parse_code & 0x48) == 0x08; /* [DIRAC_STD] using_ac() */
1877  s->low_delay = (parse_code & 0x88) == 0x88; /* [DIRAC_STD] is_low_delay() */
1878  pic->avframe->reference = (parse_code & 0x0C) == 0x0C; /* [DIRAC_STD] is_reference() */
1879  pic->avframe->key_frame = s->num_refs == 0; /* [DIRAC_STD] is_intra() */
1880  pic->avframe->pict_type = s->num_refs + 1; /* Definition of AVPictureType in avutil.h */
1881 
1882  if ((ret = get_buffer_with_edge(avctx, pic->avframe, (parse_code & 0x0C) == 0x0C ? AV_GET_BUFFER_FLAG_REF : 0)) < 0)
1883  return ret;
1884  s->current_picture = pic;
1885  s->plane[0].stride = pic->avframe->linesize[0];
1886  s->plane[1].stride = pic->avframe->linesize[1];
1887  s->plane[2].stride = pic->avframe->linesize[2];
1888 
1889  if (alloc_buffers(s, FFMAX3(FFABS(s->plane[0].stride), FFABS(s->plane[1].stride), FFABS(s->plane[2].stride))) < 0)
1890  return AVERROR(ENOMEM);
1891 
1892  /* [DIRAC_STD] 11.1 Picture parse. picture_parse() */
1894  return -1;
1895 
1896  /* [DIRAC_STD] 13.0 Transform data syntax. transform_data() */
1898  return -1;
1899  }
1900  return 0;
1901 }
1902 
1903 static int dirac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *pkt)
1904 {
1905  DiracContext *s = avctx->priv_data;
1906  AVFrame *picture = data;
1907  uint8_t *buf = pkt->data;
1908  int buf_size = pkt->size;
1909  int i, data_unit_size, buf_idx = 0;
1910  int ret;
1911 
1912  /* release unused frames */
1913  for (i = 0; i < MAX_FRAMES; i++)
1914  if (s->all_frames[i].avframe->data[0] && !s->all_frames[i].avframe->reference) {
1916  memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
1917  }
1918 
1919  s->current_picture = NULL;
1920  *got_frame = 0;
1921 
1922  /* end of stream, so flush delayed pics */
1923  if (buf_size == 0)
1924  return get_delayed_pic(s, (AVFrame *)data, got_frame);
1925 
1926  for (;;) {
1927  /*[DIRAC_STD] Here starts the code from parse_info() defined in 9.6
1928  [DIRAC_STD] PARSE_INFO_PREFIX = "BBCD" as defined in ISO/IEC 646
1929  BBCD start code search */
1930  for (; buf_idx + DATA_UNIT_HEADER_SIZE < buf_size; buf_idx++) {
1931  if (buf[buf_idx ] == 'B' && buf[buf_idx+1] == 'B' &&
1932  buf[buf_idx+2] == 'C' && buf[buf_idx+3] == 'D')
1933  break;
1934  }
1935  /* BBCD found or end of data */
1936  if (buf_idx + DATA_UNIT_HEADER_SIZE >= buf_size)
1937  break;
1938 
1939  data_unit_size = AV_RB32(buf+buf_idx+5);
1940  if (buf_idx + data_unit_size > buf_size || !data_unit_size) {
1941  if(buf_idx + data_unit_size > buf_size)
1943  "Data unit with size %d is larger than input buffer, discarding\n",
1944  data_unit_size);
1945  buf_idx += 4;
1946  continue;
1947  }
1948  /* [DIRAC_STD] dirac_decode_data_unit makes reference to the while defined in 9.3 inside the function parse_sequence() */
1949  if (dirac_decode_data_unit(avctx, buf+buf_idx, data_unit_size))
1950  {
1951  av_log(s->avctx, AV_LOG_ERROR,"Error in dirac_decode_data_unit\n");
1952  return -1;
1953  }
1954  buf_idx += data_unit_size;
1955  }
1956 
1957  if (!s->current_picture)
1958  return buf_size;
1959 
1961  DiracFrame *delayed_frame = remove_frame(s->delay_frames, s->frame_number);
1962 
1964 
1966  int min_num = s->delay_frames[0]->avframe->display_picture_number;
1967  /* Too many delayed frames, so we display the frame with the lowest pts */
1968  av_log(avctx, AV_LOG_ERROR, "Delay frame overflow\n");
1969 
1970  for (i = 1; s->delay_frames[i]; i++)
1971  if (s->delay_frames[i]->avframe->display_picture_number < min_num)
1972  min_num = s->delay_frames[i]->avframe->display_picture_number;
1973 
1974  delayed_frame = remove_frame(s->delay_frames, min_num);
1976  }
1977 
1978  if (delayed_frame) {
1979  delayed_frame->avframe->reference ^= DELAYED_PIC_REF;
1980  if((ret=av_frame_ref(data, delayed_frame->avframe)) < 0)
1981  return ret;
1982  *got_frame = 1;
1983  }
1985  /* The right frame at the right time :-) */
1986  if((ret=av_frame_ref(data, s->current_picture->avframe)) < 0)
1987  return ret;
1988  *got_frame = 1;
1989  }
1990 
1991  if (*got_frame)
1992  s->frame_number = picture->display_picture_number + 1;
1993 
1994  return buf_idx;
1995 }
1996 
1998  .name = "dirac",
1999  .long_name = NULL_IF_CONFIG_SMALL("BBC Dirac VC-2"),
2000  .type = AVMEDIA_TYPE_VIDEO,
2001  .id = AV_CODEC_ID_DIRAC,
2002  .priv_data_size = sizeof(DiracContext),
2004  .close = dirac_decode_end,
2006  .capabilities = CODEC_CAP_DELAY,
2008 };