diff options
author | Benoit Fouet <benoit.fouet@free.fr> | 2014-11-26 11:22:45 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-11-26 12:41:56 +0100 |
commit | 8b8cb30d11885b406ce0dd896b42992386d98594 (patch) | |
tree | 3566d86694feab8fa211cdbb4f643a24448daffb | |
parent | 0df95fa327c8526271b7e50aa944b66149bd48e8 (diff) | |
download | ffmpeg-8b8cb30d11885b406ce0dd896b42992386d98594.tar.gz |
avformat/apngdec: use packet pts and duration instead of altering stream framerate.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/apngdec.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/libavformat/apngdec.c b/libavformat/apngdec.c index dac71f10ee..8aa70a0333 100644 --- a/libavformat/apngdec.c +++ b/libavformat/apngdec.c @@ -44,6 +44,9 @@ typedef struct APNGDemuxContext { int max_fps; int default_fps; + int64_t pkt_pts; + int pkt_duration; + int is_key_frame; /* @@ -163,6 +166,9 @@ static int apng_read_header(AVFormatContext *s) if (!st) return AVERROR(ENOMEM); + /* set the timebase to something large enough (1/100,000 of second) + * to hopefully cope with all sane frame durations */ + avpriv_set_pts_info(st, 64, 1, 100000); st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_id = AV_CODEC_ID_APNG; st->codec->width = avio_rb32(pb); @@ -266,9 +272,9 @@ static int decode_fctl_chunk(AVFormatContext *s, APNGDemuxContext *ctx, AVPacket delay_num = 1; delay_den = ctx->default_fps; } - s->streams[0]->r_frame_rate.num = delay_den; - s->streams[0]->r_frame_rate.den = delay_num; - pkt->duration = 1; + ctx->pkt_duration = av_rescale_q(delay_num, + (AVRational){ 1, delay_den }, + s->streams[0]->time_base); av_log(s, AV_LOG_DEBUG, "%s: " "sequence_number: %"PRId32", " @@ -379,6 +385,9 @@ static int apng_read_packet(AVFormatContext *s, AVPacket *pkt) if (ctx->is_key_frame) pkt->flags |= AV_PKT_FLAG_KEY; + pkt->pts = ctx->pkt_pts; + pkt->duration = ctx->pkt_duration; + ctx->pkt_pts += ctx->pkt_duration; return ret; case MKTAG('I', 'E', 'N', 'D'): ctx->cur_loop++; |