diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-01-12 20:03:17 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-02-20 15:08:40 -0500 |
commit | e9cda853511d7c5a8fa16da4f99cf8ead86bf658 (patch) | |
tree | 1bbd4917b41b24a84c3419aab35c511be508233c | |
parent | 0b42a9388c98c8669811d4e7e5da7240e6707a41 (diff) | |
download | ffmpeg-e9cda853511d7c5a8fa16da4f99cf8ead86bf658.tar.gz |
avcodec: add duration field to AVCodecParserContext
This will allow parsers to export the duration of the current frame being
output, if known, instead of using AVCodecContext.frame_size.
-rw-r--r-- | doc/APIchanges | 3 | ||||
-rw-r--r-- | libavcodec/avcodec.h | 7 | ||||
-rw-r--r-- | libavformat/utils.c | 14 |
3 files changed, 24 insertions, 0 deletions
diff --git a/doc/APIchanges b/doc/APIchanges index ca521d41a5..12fa80396a 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,9 @@ libavutil: 2011-04-18 API changes, most recent first: +2012-xx-xx - xxxxxxx - lavc 54.x.x + Add duration field to AVCodecParserContext + 2012-02-xx - xxxxxxx - lavu 51.23.1 - mathematics.h Add av_rescale_q_rnd() diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 51b956ba81..7128a83148 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -3994,6 +3994,13 @@ typedef struct AVCodecParserContext { * Previous frame byte position. */ int64_t last_pos; + + /** + * Duration of the current frame. + * For audio, this is in units of 1 / AVCodecContext.sample_rate. + * For all other types, this is in units of AVCodecContext.time_base. + */ + int duration; } AVCodecParserContext; typedef struct AVCodecParser { diff --git a/libavformat/utils.c b/libavformat/utils.c index 33775b9a2b..24175228ab 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -1039,6 +1039,20 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt) if (pkt->size) { got_packet: pkt->duration = 0; + if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { + if (st->codec->sample_rate > 0) { + pkt->duration = av_rescale_q_rnd(st->parser->duration, + (AVRational){ 1, st->codec->sample_rate }, + st->time_base, + AV_ROUND_DOWN); + } + } else if (st->codec->time_base.num != 0 && + st->codec->time_base.den != 0) { + pkt->duration = av_rescale_q_rnd(st->parser->duration, + st->codec->time_base, + st->time_base, + AV_ROUND_DOWN); + } pkt->stream_index = st->index; pkt->pts = st->parser->pts; pkt->dts = st->parser->dts; |