aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2015-11-01 17:02:26 +0100
committerAndreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>2016-01-28 02:09:52 +0100
commita2667c60ecc3f1f037d996dc2ce8422dbef2e57b (patch)
treed6ddf07e13f90fa034b9a9ba2dd333c09a66b417 /libavformat
parent2b2943e1ef804d120e8aa58424d0c13ac1515c8b (diff)
downloadffmpeg-a2667c60ecc3f1f037d996dc2ce8422dbef2e57b.tar.gz
avformat/ipmovie: put video decoding_map_size into packet and use it in decoder
The size of decoding map can differ from one calculated internally, producing artifacts while decoding video. Signed-off-by: Paul B Mahol <onemda@gmail.com> (cherry picked from commit c293ef258cbb2c058e23651a26edf46e3bc05050) Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun@googlemail.com>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/ipmovie.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/libavformat/ipmovie.c b/libavformat/ipmovie.c
index 01e70e858f..0112009d9b 100644
--- a/libavformat/ipmovie.c
+++ b/libavformat/ipmovie.c
@@ -156,7 +156,7 @@ static int load_ipmovie_packet(IPMVEContext *s, AVIOContext *pb,
/* send both the decode map and the video data together */
- if (av_new_packet(pkt, s->decode_map_chunk_size + s->video_chunk_size))
+ if (av_new_packet(pkt, 2 + s->decode_map_chunk_size + s->video_chunk_size))
return CHUNK_NOMEM;
if (s->has_palette) {
@@ -178,7 +178,8 @@ static int load_ipmovie_packet(IPMVEContext *s, AVIOContext *pb,
avio_seek(pb, s->decode_map_chunk_offset, SEEK_SET);
s->decode_map_chunk_offset = 0;
- if (avio_read(pb, pkt->data, s->decode_map_chunk_size) !=
+ AV_WL16(pkt->data, s->decode_map_chunk_size);
+ if (avio_read(pb, pkt->data + 2, s->decode_map_chunk_size) !=
s->decode_map_chunk_size) {
av_free_packet(pkt);
return CHUNK_EOF;
@@ -187,7 +188,7 @@ static int load_ipmovie_packet(IPMVEContext *s, AVIOContext *pb,
avio_seek(pb, s->video_chunk_offset, SEEK_SET);
s->video_chunk_offset = 0;
- if (avio_read(pb, pkt->data + s->decode_map_chunk_size,
+ if (avio_read(pb, pkt->data + 2 + s->decode_map_chunk_size,
s->video_chunk_size) != s->video_chunk_size) {
av_free_packet(pkt);
return CHUNK_EOF;