Merge commit '62256010e9bc8879e2bf7f3b94af8ff85e239082'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 5 Jul 2013 10:02:53 +0000 (12:02 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 5 Jul 2013 10:02:53 +0000 (12:02 +0200)
* commit '62256010e9bc8879e2bf7f3b94af8ff85e239082':
  indeo: Refactor ff_ivi_init_tiles and ivi_decode_blocks

Conflicts:
libavcodec/ivi_common.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/ivi_common.c

@@@ -288,11 -286,46 +288,50 @@@ av_cold int ff_ivi_init_planes(IVIPlane
      return 0;
  }
  
- av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes, int tile_width, int tile_height)
+ static int ivi_init_tiles(IVIBandDesc *band, IVITile *ref_tile,
+                           int p, int b, int t_height, int t_width)
  {
-     int         p, b, x, y, x_tiles, y_tiles, t_width, t_height;
+     int x, y;
+     IVITile *tile = band->tiles;
+     for (y = 0; y < band->height; y += t_height) {
+         for (x = 0; x < band->width; x += t_width) {
+             tile->xpos     = x;
+             tile->ypos     = y;
+             tile->mb_size  = band->mb_size;
+             tile->width    = FFMIN(band->width - x,  t_width);
+             tile->height   = FFMIN(band->height - y, t_height);
+             tile->is_empty = tile->data_size = 0;
+             /* calculate number of macroblocks */
+             tile->num_MBs  = IVI_MBs_PER_TILE(tile->width, tile->height,
+                                               band->mb_size);
+             av_freep(&tile->mbs);
+             tile->mbs = av_malloc(tile->num_MBs * sizeof(IVIMbInfo));
+             if (!tile->mbs)
+                 return AVERROR(ENOMEM);
+             tile->ref_mbs = 0;
+             if (p || b) {
 -                tile->ref_mbs = ref_tile->mbs;
++                if (tile->num_MBs <= ref_tile->num_MBs) {
++                    tile->ref_mbs = ref_tile->mbs;
++                }else
++                    av_log(NULL, AV_LOG_DEBUG, "Cannot use ref_tile, too few mbs\n");
++
+                 ref_tile++;
+             }
+             tile++;
+         }
+     }
+     return 0;
+ }
+ av_cold int ff_ivi_init_tiles(IVIPlaneDesc *planes,
+                               int tile_width, int tile_height)
+ {
+     int p, b, x_tiles, y_tiles, t_width, t_height, ret;
      IVIBandDesc *band;
-     IVITile     *tile, *ref_tile;
  
      for (p = 0; p < 3; p++) {
          t_width  = !p ? tile_width  : (tile_width  + 3) >> 2;
@@@ -385,6 -386,94 +394,99 @@@ static int ivi_dec_tile_data_size(GetBi
      return len;
  }
  
 -        if (scan_pos >= num_coeffs)
+ static int ivi_decode_coded_blocks(GetBitContext *gb, IVIBandDesc *band,
+                                    ivi_mc_func mc, int mv_x, int mv_y,
+                                    int *prev_dc, int is_intra, int mc_type,
+                                    uint32_t quant, int offs,
+                                    AVCodecContext *avctx)
+ {
+     const uint16_t *base_tab  = is_intra ? band->intra_base : band->inter_base;
+     RVMapDesc *rvmap = band->rv_map;
+     uint8_t col_flags[8];
+     int32_t trvec[64];
+     uint32_t sym = 0, lo, hi, q;
+     int pos, run, val;
+     int blk_size   = band->blk_size;
+     int num_coeffs = blk_size * blk_size;
+     int col_mask   = blk_size - 1;
+     int scan_pos   = -1;
+     if (!band->scan) {
+         av_log(avctx, AV_LOG_ERROR, "Scan pattern is not set.\n");
+         return AVERROR_INVALIDDATA;
+     }
+     /* zero transform vector */
+     memset(trvec, 0, num_coeffs * sizeof(trvec[0]));
+     /* zero column flags */
+     memset(col_flags, 0, sizeof(col_flags));
+     while (scan_pos <= num_coeffs) {
+         sym = get_vlc2(gb, band->blk_vlc.tab->table,
+                        IVI_VLC_BITS, 1);
+         if (sym == rvmap->eob_sym)
+             break; /* End of block */
+         /* Escape - run/val explicitly coded using 3 vlc codes */
+         if (sym == rvmap->esc_sym) {
+             run = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1) + 1;
+             lo  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
+             hi  = get_vlc2(gb, band->blk_vlc.tab->table, IVI_VLC_BITS, 1);
+             /* merge them and convert into signed val */
+             val = IVI_TOSIGNED((hi << 6) | lo);
+         } else {
+             if (sym >= 256U) {
+                 av_log(avctx, AV_LOG_ERROR, "Invalid sym encountered: %d.\n", sym);
+                 return AVERROR_INVALIDDATA;
+             }
+             run = rvmap->runtab[sym];
+             val = rvmap->valtab[sym];
+         }
+         /* de-zigzag and dequantize */
+         scan_pos += run;
++        if (scan_pos >= (unsigned)num_coeffs)
+             break;
+         pos = band->scan[scan_pos];
+         if (!val)
+             av_dlog(avctx, "Val = 0 encountered!\n");
+         q = (base_tab[pos] * quant) >> 9;
+         if (q > 1)
+             val = val * q + FFSIGN(val) * (((q ^ 1) - 1) >> 1);
+         trvec[pos] = val;
+         /* track columns containing non-zero coeffs */
+         col_flags[pos & col_mask] |= !!val;
+     }
+     if (scan_pos >= num_coeffs && sym != rvmap->eob_sym)
+         return AVERROR_INVALIDDATA; /* corrupt block data */
+     /* undoing DC coeff prediction for intra-blocks */
+     if (is_intra && band->is_2d_trans) {
+         *prev_dc     += trvec[0];
+         trvec[0]      = *prev_dc;
+         col_flags[0] |= !!*prev_dc;
+     }
++    if(band->transform_size > band->blk_size){
++        av_log(NULL, AV_LOG_ERROR, "Too large transform\n");
++        return AVERROR_INVALIDDATA;
++    }
++
+     /* apply inverse transform */
+     band->inv_transform(trvec, band->buf + offs,
+                         band->pitch, col_flags);
+     /* apply motion compensation */
+     if (!is_intra)
+         mc(band->buf + offs,
+            band->ref_buf + offs + mv_y * band->pitch + mv_x,
+            band->pitch, mc_type);
+     return 0;
+ }
  /*
   *  Decode block data:
   *  extract huffman-coded transform coefficients from the bitstream,