Merge commit '453642f8afe9f979fcc813a246b1ec656ec36a93'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 20 Apr 2015 02:57:06 +0000 (04:57 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 20 Apr 2015 02:57:06 +0000 (04:57 +0200)
* commit '453642f8afe9f979fcc813a246b1ec656ec36a93':
  hqx: Store shareable data in main decoder context

Conflicts:
libavcodec/hqx.c
libavcodec/hqx.h

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

@@@ -154,8 -151,7 +151,8 @@@ static int decode_block(GetBitContext *
      return 0;
  }
  
- static int hqx_decode_422(HQXContext *ctx, HQXSliceData * slice_data, AVFrame *pic,
 -static int hqx_decode_422(HQXContext *ctx, GetBitContext *gb, int x, int y)
++static int hqx_decode_422(HQXContext *ctx, HQXSliceData * slice_data,
 +                          GetBitContext *gb, int x, int y)
  {
      const int *quants;
      int flag;
              return ret;
      }
  
-     put_blocks(ctx, pic, 0, x     , y, flag, slice_data->block[0], slice_data->block[2], hqx_quant_luma);
-     put_blocks(ctx, pic, 0, x + 8 , y, flag, slice_data->block[1], slice_data->block[3], hqx_quant_luma);
-     put_blocks(ctx, pic, 2, x >> 1, y, flag, slice_data->block[4], slice_data->block[5], hqx_quant_chroma);
-     put_blocks(ctx, pic, 1, x >> 1, y, flag, slice_data->block[6], slice_data->block[7], hqx_quant_chroma);
 -    put_blocks(ctx, 0, x,      y, flag, ctx->block[0], ctx->block[2], hqx_quant_luma);
 -    put_blocks(ctx, 0, x + 8,  y, flag, ctx->block[1], ctx->block[3], hqx_quant_luma);
 -    put_blocks(ctx, 2, x >> 1, y, flag, ctx->block[4], ctx->block[5], hqx_quant_chroma);
 -    put_blocks(ctx, 1, x >> 1, y, flag, ctx->block[6], ctx->block[7], hqx_quant_chroma);
++    put_blocks(ctx, 0, x     , y, flag, slice_data->block[0], slice_data->block[2], hqx_quant_luma);
++    put_blocks(ctx, 0, x + 8 , y, flag, slice_data->block[1], slice_data->block[3], hqx_quant_luma);
++    put_blocks(ctx, 2, x >> 1, y, flag, slice_data->block[4], slice_data->block[5], hqx_quant_chroma);
++    put_blocks(ctx, 1, x >> 1, y, flag, slice_data->block[6], slice_data->block[7], hqx_quant_chroma);
  
      return 0;
  }
  
- static int hqx_decode_422a(HQXContext *ctx, HQXSliceData * slice_data, AVFrame *pic,
 -static int hqx_decode_422a(HQXContext *ctx, GetBitContext *gb, int x, int y)
++static int hqx_decode_422a(HQXContext *ctx, HQXSliceData * slice_data,
 +                           GetBitContext *gb, int x, int y)
  {
      const int *quants;
      int flag = 0;
          }
      }
  
-     put_blocks(ctx, pic, 3, x,      y, flag, slice_data->block[ 0], slice_data->block[ 2], hqx_quant_luma);
-     put_blocks(ctx, pic, 3, x + 8,  y, flag, slice_data->block[ 1], slice_data->block[ 3], hqx_quant_luma);
-     put_blocks(ctx, pic, 0, x,      y, flag, slice_data->block[ 4], slice_data->block[ 6], hqx_quant_luma);
-     put_blocks(ctx, pic, 0, x + 8,  y, flag, slice_data->block[ 5], slice_data->block[ 7], hqx_quant_luma);
-     put_blocks(ctx, pic, 2, x >> 1, y, flag, slice_data->block[ 8], slice_data->block[ 9], hqx_quant_chroma);
-     put_blocks(ctx, pic, 1, x >> 1, y, flag, slice_data->block[10], slice_data->block[11], hqx_quant_chroma);
 -    put_blocks(ctx, 3, x,      y, flag, ctx->block[ 0], ctx->block[ 2], hqx_quant_luma);
 -    put_blocks(ctx, 3, x + 8,  y, flag, ctx->block[ 1], ctx->block[ 3], hqx_quant_luma);
 -    put_blocks(ctx, 0, x,      y, flag, ctx->block[ 4], ctx->block[ 6], hqx_quant_luma);
 -    put_blocks(ctx, 0, x + 8,  y, flag, ctx->block[ 5], ctx->block[ 7], hqx_quant_luma);
 -    put_blocks(ctx, 2, x >> 1, y, flag, ctx->block[ 8], ctx->block[ 9], hqx_quant_chroma);
 -    put_blocks(ctx, 1, x >> 1, y, flag, ctx->block[10], ctx->block[11], hqx_quant_chroma);
++    put_blocks(ctx, 3, x,      y, flag, slice_data->block[ 0], slice_data->block[ 2], hqx_quant_luma);
++    put_blocks(ctx, 3, x + 8,  y, flag, slice_data->block[ 1], slice_data->block[ 3], hqx_quant_luma);
++    put_blocks(ctx, 0, x,      y, flag, slice_data->block[ 4], slice_data->block[ 6], hqx_quant_luma);
++    put_blocks(ctx, 0, x + 8,  y, flag, slice_data->block[ 5], slice_data->block[ 7], hqx_quant_luma);
++    put_blocks(ctx, 2, x >> 1, y, flag, slice_data->block[ 8], slice_data->block[ 9], hqx_quant_chroma);
++    put_blocks(ctx, 1, x >> 1, y, flag, slice_data->block[10], slice_data->block[11], hqx_quant_chroma);
  
      return 0;
  }
  
- static int hqx_decode_444(HQXContext *ctx, HQXSliceData * slice_data, AVFrame *pic,
 -static int hqx_decode_444(HQXContext *ctx, GetBitContext *gb, int x, int y)
++static int hqx_decode_444(HQXContext *ctx, HQXSliceData * slice_data,
 +                          GetBitContext *gb, int x, int y)
  {
      const int *quants;
      int flag;
              return ret;
      }
  
-     put_blocks(ctx, pic, 0, x,     y, flag, slice_data->block[0], slice_data->block[ 2], hqx_quant_luma);
-     put_blocks(ctx, pic, 0, x + 8, y, flag, slice_data->block[1], slice_data->block[ 3], hqx_quant_luma);
-     put_blocks(ctx, pic, 2, x,     y, flag, slice_data->block[4], slice_data->block[ 6], hqx_quant_chroma);
-     put_blocks(ctx, pic, 2, x + 8, y, flag, slice_data->block[5], slice_data->block[ 7], hqx_quant_chroma);
-     put_blocks(ctx, pic, 1, x,     y, flag, slice_data->block[8], slice_data->block[10], hqx_quant_chroma);
-     put_blocks(ctx, pic, 1, x + 8, y, flag, slice_data->block[9], slice_data->block[11], hqx_quant_chroma);
 -    put_blocks(ctx, 0, x,     y, flag, ctx->block[0], ctx->block[ 2], hqx_quant_luma);
 -    put_blocks(ctx, 0, x + 8, y, flag, ctx->block[1], ctx->block[ 3], hqx_quant_luma);
 -    put_blocks(ctx, 2, x,     y, flag, ctx->block[4], ctx->block[ 6], hqx_quant_chroma);
 -    put_blocks(ctx, 2, x + 8, y, flag, ctx->block[5], ctx->block[ 7], hqx_quant_chroma);
 -    put_blocks(ctx, 1, x,     y, flag, ctx->block[8], ctx->block[10], hqx_quant_chroma);
 -    put_blocks(ctx, 1, x + 8, y, flag, ctx->block[9], ctx->block[11], hqx_quant_chroma);
++    put_blocks(ctx, 0, x,     y, flag, slice_data->block[0], slice_data->block[ 2], hqx_quant_luma);
++    put_blocks(ctx, 0, x + 8, y, flag, slice_data->block[1], slice_data->block[ 3], hqx_quant_luma);
++    put_blocks(ctx, 2, x,     y, flag, slice_data->block[4], slice_data->block[ 6], hqx_quant_chroma);
++    put_blocks(ctx, 2, x + 8, y, flag, slice_data->block[5], slice_data->block[ 7], hqx_quant_chroma);
++    put_blocks(ctx, 1, x,     y, flag, slice_data->block[8], slice_data->block[10], hqx_quant_chroma);
++    put_blocks(ctx, 1, x + 8, y, flag, slice_data->block[9], slice_data->block[11], hqx_quant_chroma);
  
      return 0;
  }
  
- static int hqx_decode_444a(HQXContext *ctx, HQXSliceData * slice_data, AVFrame *pic,
 -static int hqx_decode_444a(HQXContext *ctx, GetBitContext *gb, int x, int y)
++
++static int hqx_decode_444a(HQXContext *ctx, HQXSliceData * slice_data,
 +                           GetBitContext *gb, int x, int y)
  {
      const int *quants;
      int flag = 0;
          }
      }
  
-     put_blocks(ctx, pic, 3, x,     y, flag, slice_data->block[ 0], slice_data->block[ 2], hqx_quant_luma);
-     put_blocks(ctx, pic, 3, x + 8, y, flag, slice_data->block[ 1], slice_data->block[ 3], hqx_quant_luma);
-     put_blocks(ctx, pic, 0, x,     y, flag, slice_data->block[ 4], slice_data->block[ 6], hqx_quant_luma);
-     put_blocks(ctx, pic, 0, x + 8, y, flag, slice_data->block[ 5], slice_data->block[ 7], hqx_quant_luma);
-     put_blocks(ctx, pic, 2, x,     y, flag, slice_data->block[ 8], slice_data->block[10], hqx_quant_chroma);
-     put_blocks(ctx, pic, 2, x + 8, y, flag, slice_data->block[ 9], slice_data->block[11], hqx_quant_chroma);
-     put_blocks(ctx, pic, 1, x,     y, flag, slice_data->block[12], slice_data->block[14], hqx_quant_chroma);
-     put_blocks(ctx, pic, 1, x + 8, y, flag, slice_data->block[13], slice_data->block[15], hqx_quant_chroma);
 -    put_blocks(ctx, 3, x,     y, flag, ctx->block[ 0], ctx->block[ 2], hqx_quant_luma);
 -    put_blocks(ctx, 3, x + 8, y, flag, ctx->block[ 1], ctx->block[ 3], hqx_quant_luma);
 -    put_blocks(ctx, 0, x,     y, flag, ctx->block[ 4], ctx->block[ 6], hqx_quant_luma);
 -    put_blocks(ctx, 0, x + 8, y, flag, ctx->block[ 5], ctx->block[ 7], hqx_quant_luma);
 -    put_blocks(ctx, 2, x,     y, flag, ctx->block[ 8], ctx->block[10], hqx_quant_chroma);
 -    put_blocks(ctx, 2, x + 8, y, flag, ctx->block[ 9], ctx->block[11], hqx_quant_chroma);
 -    put_blocks(ctx, 1, x,     y, flag, ctx->block[12], ctx->block[14], hqx_quant_chroma);
 -    put_blocks(ctx, 1, x + 8, y, flag, ctx->block[13], ctx->block[15], hqx_quant_chroma);
++    put_blocks(ctx, 3, x,     y, flag, slice_data->block[ 0], slice_data->block[ 2], hqx_quant_luma);
++    put_blocks(ctx, 3, x + 8, y, flag, slice_data->block[ 1], slice_data->block[ 3], hqx_quant_luma);
++    put_blocks(ctx, 0, x,     y, flag, slice_data->block[ 4], slice_data->block[ 6], hqx_quant_luma);
++    put_blocks(ctx, 0, x + 8, y, flag, slice_data->block[ 5], slice_data->block[ 7], hqx_quant_luma);
++    put_blocks(ctx, 2, x,     y, flag, slice_data->block[ 8], slice_data->block[10], hqx_quant_chroma);
++    put_blocks(ctx, 2, x + 8, y, flag, slice_data->block[ 9], slice_data->block[11], hqx_quant_chroma);
++    put_blocks(ctx, 1, x,     y, flag, slice_data->block[12], slice_data->block[14], hqx_quant_chroma);
++    put_blocks(ctx, 1, x + 8, y, flag, slice_data->block[13], slice_data->block[15], hqx_quant_chroma);
  
      return 0;
  }
@@@ -370,48 -362,13 +367,38 @@@ static int decode_slice(HQXContext *ctx
                  mb_x +=            pos % grp_w;
                  mb_y  = loc_row + (pos / grp_w);
              }
-             decode_func(ctx, &ctx->slice[slice_no], pic, gb, mb_x * 16, mb_y * 16);
 -            ctx->decode_func(ctx, gb, mb_x * 16, mb_y * 16);
++            ctx->decode_func(ctx, &ctx->slice[slice_no], gb, mb_x * 16, mb_y * 16);
          }
      }
  
      return 0;
  }
  
- typedef struct {
-     AVFrame *pic;
-     uint8_t *src;
-     GetBitContext gb[17];
-     unsigned data_size;
-     mb_decode_func decode_func;
-     uint32_t slice_off[17];
- } Data;
 +static int decode_slice_thread(AVCodecContext *avctx, void *arg, int slice, int threadnr)
 +{
-     Data * data = (Data*) arg;
-     uint32_t * slice_off = data->slice_off;
-     unsigned data_size = data->data_size;
 +    HQXContext *ctx = avctx->priv_data;
++    uint32_t * slice_off = ctx->slice_off;
++    unsigned data_size = ctx->data_size;
 +    int ret;
 +
 +    if (slice_off[slice] < HQX_HEADER_SIZE ||
 +        slice_off[slice] >= slice_off[slice + 1] ||
 +        slice_off[slice + 1] > data_size) {
 +        av_log(avctx, AV_LOG_ERROR, "Invalid slice size.\n");
 +        return AVERROR_INVALIDDATA;
 +    }
 +
-     ret = init_get_bits8(&data->gb[slice], data->src + slice_off[slice], slice_off[slice + 1] - slice_off[slice]);
++    ret = init_get_bits8(&ctx->slice[slice].gb, ctx->src + slice_off[slice], slice_off[slice + 1] - slice_off[slice]);
 +    if (ret < 0)
 +        return ret;
 +
-     ret = decode_slice(ctx, data->pic, &data->gb[slice], slice, data->decode_func);
++    ret = decode_slice(ctx, &ctx->slice[slice].gb, slice);
 +    if (ret < 0) {
 +        av_log(avctx, AV_LOG_ERROR, "Error decoding slice %d.\n", slice);
 +    }
 +    return ret;
 +}
 +
  static int hqx_decode_frame(AVCodecContext *avctx, void *data,
                              int *got_picture_ptr, AVPacket *avpkt)
  {
      uint8_t *src = avpkt->data;
      uint32_t info_tag, info_offset;
      int data_start;
 -    GetBitContext gb;
      int i, ret;
-     Data arg_data;
-     arg_data.decode_func = 0;
 -    int slice;
  
      if (avpkt->size < 8)
          return AVERROR_INVALIDDATA;
          return AVERROR_INVALIDDATA;
      }
  
-     ret = ff_get_buffer(avctx, pic, 0);
+     ret = ff_get_buffer(avctx, ctx->pic, 0);
 -    if (ret < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer.\n");
 +    if (ret < 0)
          return ret;
 -    }
  
 -    for (slice = 0; slice < 16; slice++) {
 -        if (ctx->slice_off[slice] < HQX_HEADER_SIZE ||
 -            ctx->slice_off[slice] >= ctx->slice_off[slice + 1] ||
 -            ctx->slice_off[slice + 1] > ctx->data_size) {
 -            av_log(avctx, AV_LOG_ERROR, "Invalid slice size.\n");
 -            break;
 -        }
 -        ret = init_get_bits(&gb, src + ctx->slice_off[slice],
 -                            (ctx->slice_off[slice + 1] - ctx->slice_off[slice]) * 8);
 -        if (ret < 0)
 -            return ret;
 -        ret = decode_slice(ctx, &gb, slice);
 -        if (ret < 0) {
 -            av_log(avctx, AV_LOG_ERROR, "Error decoding slice %d.\n", slice);
 -        }
 -    }
++    avctx->execute2(avctx, decode_slice_thread, NULL, NULL, 16);
  
-     avctx->execute2(avctx, decode_slice_thread, &arg_data, NULL, 16);
-     pic->key_frame = 1;
-     pic->pict_type = AV_PICTURE_TYPE_I;
+     ctx->pic->key_frame = 1;
+     ctx->pic->pict_type = AV_PICTURE_TYPE_I;
  
      *got_picture_ptr = 1;
  
@@@ -47,13 -49,10 +49,19 @@@ typedef struct HQXAC 
      const HQXLUT *lut;
  } HQXAC;
  
 -typedef int (*mb_decode_func)(struct HQXContext *ctx, GetBitContext *gb, int x, int y);
 +
 +typedef struct HQXSliceData
 +{
 +    DECLARE_ALIGNED(16, int16_t, block)[16][64];
++    GetBitContext gb;
 +
 +} HQXSliceData;
 +
+ struct HQXContext;
++typedef int (*mb_decode_func)(struct HQXContext *ctx, HQXSliceData * slice_data,
++                              GetBitContext *gb, int x, int y);
  typedef struct HQXContext {
      HQXDSPContext hqxdsp;
  
      int format, dcb, width, height;
      int interlaced;
  
 -    DECLARE_ALIGNED(16, int16_t, block)[16][64];
 -
 +    HQXSliceData slice[17];
 +
+     uint8_t *src;
+     unsigned int data_size;
+     uint32_t slice_off[17];
      VLC cbp_vlc;
      VLC dc_vlc[3];
  } HQXContext;