This will allow parsers to export the duration of the current frame being output, if known, instead of using AVCodecContext.frame_size.tags/n0.11
| @@ -13,6 +13,9 @@ libavutil: 2011-04-18 | |||||
| API changes, most recent first: | 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 | 2012-02-xx - xxxxxxx - lavu 51.23.1 - mathematics.h | ||||
| Add av_rescale_q_rnd() | Add av_rescale_q_rnd() | ||||
| @@ -3994,6 +3994,13 @@ typedef struct AVCodecParserContext { | |||||
| * Previous frame byte position. | * Previous frame byte position. | ||||
| */ | */ | ||||
| int64_t last_pos; | 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; | } AVCodecParserContext; | ||||
| typedef struct AVCodecParser { | typedef struct AVCodecParser { | ||||
| @@ -1039,6 +1039,20 @@ static int read_frame_internal(AVFormatContext *s, AVPacket *pkt) | |||||
| if (pkt->size) { | if (pkt->size) { | ||||
| got_packet: | got_packet: | ||||
| pkt->duration = 0; | 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->stream_index = st->index; | ||||
| pkt->pts = st->parser->pts; | pkt->pts = st->parser->pts; | ||||
| pkt->dts = st->parser->dts; | pkt->dts = st->parser->dts; | ||||