From 56c1b9257698719bca9e87df843e7933434d6efa Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Mon, 8 Apr 2013 20:06:42 +0200 Subject: dfa: implement missing TDLT coding method --- libavcodec/dfa.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'libavcodec/dfa.c') diff --git a/libavcodec/dfa.c b/libavcodec/dfa.c index 6619b98301..2828af6e56 100644 --- a/libavcodec/dfa.c +++ b/libavcodec/dfa.c @@ -284,9 +284,26 @@ static int decode_wdlt(GetByteContext *gb, uint8_t *frame, int width, int height return 0; } -static int decode_unk6(GetByteContext *gb, uint8_t *frame, int width, int height) +static int decode_tdlt(GetByteContext *gb, uint8_t *frame, int width, int height) { - return AVERROR_PATCHWELCOME; + const uint8_t *frame_end = frame + width * height; + int segments = bytestream2_get_le32(gb); + int skip, copy; + + while (segments--) { + if (bytestream2_get_bytes_left(gb) < 2) + return AVERROR_INVALIDDATA; + copy = bytestream2_get_byteu(gb) * 2; + skip = bytestream2_get_byteu(gb) * 2; + if (frame_end - frame < copy + skip || + bytestream2_get_bytes_left(gb) < copy) + return AVERROR_INVALIDDATA; + frame += skip; + bytestream2_get_buffer(gb, frame, copy); + frame += copy; + } + + return 0; } static int decode_blck(GetByteContext *gb, uint8_t *frame, int width, int height) @@ -300,11 +317,11 @@ typedef int (*chunk_decoder)(GetByteContext *gb, uint8_t *frame, int width, int static const chunk_decoder decoder[8] = { decode_copy, decode_tsw1, decode_bdlt, decode_wdlt, - decode_unk6, decode_dsw1, decode_blck, decode_dds1, + decode_tdlt, decode_dsw1, decode_blck, decode_dds1, }; static const char* chunk_name[8] = { - "COPY", "TSW1", "BDLT", "WDLT", "????", "DSW1", "BLCK", "DDS1" + "COPY", "TSW1", "BDLT", "WDLT", "TDLT", "DSW1", "BLCK", "DDS1" }; static int dfa_decode_frame(AVCodecContext *avctx, -- cgit v1.2.3