|
|
|
@ -321,6 +321,7 @@ static int dxv_decode(AVCodecContext *avctx, void *data, |
|
|
|
|
ThreadFrame tframe; |
|
|
|
|
GetByteContext *gbc = &ctx->gbc; |
|
|
|
|
int (*decompress_tex)(AVCodecContext *avctx); |
|
|
|
|
const char *msgcomp, *msgtext; |
|
|
|
|
uint32_t tag; |
|
|
|
|
int version_major, version_minor = 0; |
|
|
|
|
int size = 0, old_type = 0; |
|
|
|
@ -335,14 +336,16 @@ static int dxv_decode(AVCodecContext *avctx, void *data, |
|
|
|
|
ctx->tex_funct = ctx->texdsp.dxt1_block; |
|
|
|
|
ctx->tex_rat = 8; |
|
|
|
|
ctx->tex_step = 8; |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, "DXTR1 compression and DXT1 texture "); |
|
|
|
|
msgcomp = "DXTR1"; |
|
|
|
|
msgtext = "DXT1"; |
|
|
|
|
break; |
|
|
|
|
case MKBETAG('D', 'X', 'T', '5'): |
|
|
|
|
decompress_tex = dxv_decompress_dxt5; |
|
|
|
|
ctx->tex_funct = ctx->texdsp.dxt5_block; |
|
|
|
|
ctx->tex_rat = 4; |
|
|
|
|
ctx->tex_step = 16; |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, "DXTR5 compression and DXT5 texture "); |
|
|
|
|
msgcomp = "DXTR5"; |
|
|
|
|
msgtext = "DXT5"; |
|
|
|
|
break; |
|
|
|
|
case MKBETAG('Y', 'C', 'G', '6'): |
|
|
|
|
case MKBETAG('Y', 'G', '1', '0'): |
|
|
|
@ -353,13 +356,16 @@ static int dxv_decode(AVCodecContext *avctx, void *data, |
|
|
|
|
size = tag & 0x00FFFFFF; |
|
|
|
|
old_type = tag >> 24; |
|
|
|
|
version_major = (old_type & 0x0F) - 1; |
|
|
|
|
msgcomp = "LZF"; |
|
|
|
|
|
|
|
|
|
if (old_type & 0x40) { |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, "LZF compression and DXT5 texture "); |
|
|
|
|
msgtext = "DXT5"; |
|
|
|
|
|
|
|
|
|
ctx->tex_funct = ctx->texdsp.dxt5_block; |
|
|
|
|
ctx->tex_step = 16; |
|
|
|
|
} else if (old_type & 0x20 || version_major == 1) { |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, "LZF compression and DXT1 texture "); |
|
|
|
|
msgtext = "DXT1"; |
|
|
|
|
|
|
|
|
|
ctx->tex_funct = ctx->texdsp.dxt1_block; |
|
|
|
|
ctx->tex_step = 8; |
|
|
|
|
} else { |
|
|
|
@ -379,7 +385,9 @@ static int dxv_decode(AVCodecContext *avctx, void *data, |
|
|
|
|
bytestream2_skip(gbc, 2); // unknown
|
|
|
|
|
size = bytestream2_get_le32(gbc); |
|
|
|
|
} |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, "(version %d.%d)\n", version_major, version_minor); |
|
|
|
|
av_log(avctx, AV_LOG_DEBUG, |
|
|
|
|
"%s compression with %s texture (version %d.%d)\n", |
|
|
|
|
msgcomp, msgtext, version_major, version_minor); |
|
|
|
|
|
|
|
|
|
if (size != bytestream2_get_bytes_left(gbc)) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "Incomplete or invalid file (%u > %u)\n.", |
|
|
|
|