diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2013-04-08 20:06:42 +0200 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2013-04-09 18:32:00 +0200 |
commit | 56c1b9257698719bca9e87df843e7933434d6efa (patch) | |
tree | 45c074aa1a302d4d79f047a7f99255a0958e18ed | |
parent | fc792308c5ae03d245e8bb7d3bf7fca08d6528e3 (diff) | |
download | ffmpeg-56c1b9257698719bca9e87df843e7933434d6efa.tar.gz |
dfa: implement missing TDLT coding method
-rw-r--r-- | libavcodec/dfa.c | 25 |
1 files changed, 21 insertions, 4 deletions
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, |