|
|
|
@ -334,47 +334,47 @@ static int hap_decode(AVCodecContext *avctx, void *data, |
|
|
|
|
for (t = 0; t < ctx->texture_count; t++) { |
|
|
|
|
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) |
|
|
|
|
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){ |
|
|
|
|
avctx->execute2(avctx, decompress_texture_thread, tframe.f, NULL, ctx->slice_count); |
|
|
|
|
avctx->execute2(avctx, decompress_texture_thread, tframe.f, NULL, ctx->slice_count); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|