Merge commit 'ae5a8dca675ee544178225256893e679b750cb63'
authorMichael Niedermayer <michael@niedermayer.cc>
Thu, 23 Jul 2015 10:35:10 +0000 (12:35 +0200)
committerMichael Niedermayer <michael@niedermayer.cc>
Thu, 23 Jul 2015 10:35:10 +0000 (12:35 +0200)
* commit 'ae5a8dca675ee544178225256893e679b750cb63':
  hap: Fix slice size computation

Conflicts:
libavcodec/hapdec.c

Merged-by: Michael Niedermayer <michael@niedermayer.cc>
1  2 
libavcodec/hap.h
libavcodec/hapdec.c

@@@ -72,12 -40,13 +72,12 @@@ typedef struct HapContext 
  
      int tex_rat;             /* Compression ratio */
      const uint8_t *tex_data; /* Compressed texture */
 -    uint8_t *tex_buf;        /* Uncompressed texture */
 +    uint8_t *tex_buf;        /* Buffer for compressed texture */
      size_t tex_size;         /* Size of the compressed texture */
  
 -    uint8_t *snappied;       /* Buffer interacting with snappy */
      size_t max_snappy;       /* Maximum compressed size for snappy buffer */
  
-     int slice_size;          /* Optimal slice size */
+     int slice_count;         /* Number of slices for threaded operations */
  
      /* Pointer to the selected compress or decompress function */
      int (*tex_fun)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block);
@@@ -297,11 -178,7 +306,7 @@@ static int hap_decode(AVCodecContext *a
  {
      HapContext *ctx = avctx->priv_data;
      ThreadFrame tframe;
 -    int ret, length;
 +    int ret, i;
-     int slices = FFMIN(avctx->thread_count,
-                        avctx->coded_height / TEXTURE_BLOCK_H);
-     ctx->slice_size = avctx->coded_height / slices;
  
      bytestream2_init(&ctx->gbc, avpkt->data, avpkt->size);
  
      ret = ff_thread_get_buffer(avctx, &tframe, 0);
      if (ret < 0)
          return ret;
 -    ff_thread_finish_setup(avctx);
 +    if (avctx->codec->update_thread_context)
 +        ff_thread_finish_setup(avctx);
 +
 +    /* Unpack the DXT texture */
 +    if (hap_can_use_tex_in_place(ctx)) {
 +        /* Only DXTC texture compression in a contiguous block */
 +        ctx->tex_data = ctx->gbc.buffer;
 +    } else {
 +        /* Perform the second-stage decompression */
 +        ret = av_reallocp(&ctx->tex_buf, ctx->tex_size);
 +        if (ret < 0)
 +            return ret;
 +
 +        avctx->execute2(avctx, decompress_chunks_thread, NULL,
 +                        ctx->chunk_results, ctx->chunk_count);
 +
 +        for (i = 0; i < ctx->chunk_count; i++) {
 +            if (ctx->chunk_results[i] < 0)
 +                return ctx->chunk_results[i];
 +        }
 +
 +        ctx->tex_data = ctx->tex_buf;
 +    }
  
      /* Use the decompress function on the texture, one block per thread */
-     avctx->execute2(avctx, decompress_texture_thread, tframe.f, NULL, slices);
+     avctx->execute2(avctx, decompress_texture_thread, tframe.f, NULL, ctx->slice_count);
  
      /* Frame is ready to be output */
      tframe.f->pict_type = AV_PICTURE_TYPE_I;
@@@ -371,28 -232,9 +376,31 @@@ static av_cold int hap_init(AVCodecCont
  
      ff_texturedsp_init(&ctx->dxtc);
  
 +    switch (avctx->codec_tag) {
 +    case MKTAG('H','a','p','1'):
 +        texture_name = "DXT1";
 +        ctx->tex_rat = 8;
 +        ctx->tex_fun = ctx->dxtc.dxt1_block;
 +        break;
 +    case MKTAG('H','a','p','5'):
 +        texture_name = "DXT5";
 +        ctx->tex_rat = 16;
 +        ctx->tex_fun = ctx->dxtc.dxt5_block;
 +        break;
 +    case MKTAG('H','a','p','Y'):
 +        texture_name = "DXT5-YCoCg-scaled";
 +        ctx->tex_rat = 16;
 +        ctx->tex_fun = ctx->dxtc.dxt5ys_block;
 +        break;
 +    default:
 +        return AVERROR_DECODER_NOT_FOUND;
 +    }
 +
 +    av_log(avctx, AV_LOG_DEBUG, "%s texture\n", texture_name);
 +
+     ctx->slice_count = av_clip(avctx->thread_count, 1,
+                                avctx->coded_height / TEXTURE_BLOCK_H);
      return 0;
  }