| @@ -334,47 +334,47 @@ static int hap_decode(AVCodecContext *avctx, void *data, | |||||
| for (t = 0; t < ctx->texture_count; t++) { | for (t = 0; t < ctx->texture_count; t++) { | ||||
| bytestream2_seek(&ctx->gbc, start_texture_section, SEEK_SET); | bytestream2_seek(&ctx->gbc, start_texture_section, SEEK_SET); | ||||
| /* Check for section header */ | |||||
| ret = hap_parse_frame_header(avctx); | |||||
| if (ret < 0) | |||||
| return ret; | |||||
| 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; | |||||
| tex_size = bytestream2_get_bytes_left(&ctx->gbc); | |||||
| } else { | |||||
| /* Perform the second-stage decompression */ | |||||
| ret = av_reallocp(&ctx->tex_buf, ctx->tex_size); | |||||
| /* Check for section header */ | |||||
| ret = hap_parse_frame_header(avctx); | |||||
| if (ret < 0) | if (ret < 0) | ||||
| return ret; | return ret; | ||||
| avctx->execute2(avctx, decompress_chunks_thread, NULL, | |||||
| ctx->chunk_results, ctx->chunk_count); | |||||
| if (avctx->codec->update_thread_context) | |||||
| ff_thread_finish_setup(avctx); | |||||
| for (i = 0; i < ctx->chunk_count; i++) { | |||||
| if (ctx->chunk_results[i] < 0) | |||||
| return ctx->chunk_results[i]; | |||||
| } | |||||
| /* 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; | |||||
| tex_size = bytestream2_get_bytes_left(&ctx->gbc); | |||||
| } else { | |||||
| /* Perform the second-stage decompression */ | |||||
| ret = av_reallocp(&ctx->tex_buf, ctx->tex_size); | |||||
| if (ret < 0) | |||||
| return ret; | |||||
| ctx->tex_data = ctx->tex_buf; | |||||
| tex_size = ctx->tex_size; | |||||
| } | |||||
| avctx->execute2(avctx, decompress_chunks_thread, NULL, | |||||
| ctx->chunk_results, ctx->chunk_count); | |||||
| if (tex_size < (avctx->coded_width / TEXTURE_BLOCK_W) | |||||
| *(avctx->coded_height / TEXTURE_BLOCK_H) | |||||
| *ctx->tex_rat) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Insufficient data\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| 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; | |||||
| tex_size = ctx->tex_size; | |||||
| } | |||||
| if (tex_size < (avctx->coded_width / TEXTURE_BLOCK_W) | |||||
| *(avctx->coded_height / TEXTURE_BLOCK_H) | |||||
| *ctx->tex_rat) { | |||||
| av_log(avctx, AV_LOG_ERROR, "Insufficient data\n"); | |||||
| return AVERROR_INVALIDDATA; | |||||
| } | |||||
| /* Use the decompress function on the texture, one block per thread */ | |||||
| /* Use the decompress function on the texture, one block per thread */ | |||||
| if (t == 0){ | if (t == 0){ | ||||
| avctx->execute2(avctx, decompress_texture_thread, tframe.f, NULL, ctx->slice_count); | |||||
| avctx->execute2(avctx, decompress_texture_thread, tframe.f, NULL, ctx->slice_count); | |||||
| } | } | ||||
| } | } | ||||