diff options
Diffstat (limited to 'libavformat/ipmovie.c')
-rw-r--r-- | libavformat/ipmovie.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/libavformat/ipmovie.c b/libavformat/ipmovie.c index bd5ec30016..b91196b34c 100644 --- a/libavformat/ipmovie.c +++ b/libavformat/ipmovie.c @@ -89,6 +89,7 @@ typedef struct IPMVEContext { int64_t video_pts; uint32_t palette[256]; int has_palette; + int changed; unsigned int audio_bits; unsigned int audio_channels; @@ -168,6 +169,10 @@ static int load_ipmovie_packet(IPMVEContext *s, AVIOContext *pb, } } + if (s->changed) { + ff_add_param_change(pkt, 0, 0, 0, s->video_width, s->video_height); + s->changed = 0; + } pkt->pos= s->decode_map_chunk_offset; avio_seek(pb, s->decode_map_chunk_offset, SEEK_SET); s->decode_map_chunk_offset = 0; @@ -223,6 +228,7 @@ static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb, int first_color, last_color; int audio_flags; unsigned char r, g, b; + unsigned int width, height; /* see if there are any pending packets */ chunk_type = load_ipmovie_packet(s, pb, pkt); @@ -379,8 +385,16 @@ static int process_ipmovie_chunk(IPMVEContext *s, AVIOContext *pb, chunk_type = CHUNK_BAD; break; } - s->video_width = AV_RL16(&scratch[0]) * 8; - s->video_height = AV_RL16(&scratch[2]) * 8; + width = AV_RL16(&scratch[0]) * 8; + height = AV_RL16(&scratch[2]) * 8; + if (width != s->video_width) { + s->video_width = width; + s->changed++; + } + if (height != s->video_height) { + s->video_height = height; + s->changed++; + } if (opcode_version < 2 || !AV_RL16(&scratch[6])) { s->video_bpp = 8; } else { |