Browse Source

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.
tags/n0.11
Justin Ruggles 14 years ago
parent
commit
e9cda85351
3 changed files with 24 additions and 0 deletions
  1. +3
    -0
      doc/APIchanges
  2. +7
    -0
      libavcodec/avcodec.h
  3. +14
    -0
      libavformat/utils.c

+ 3
- 0
doc/APIchanges View File

@@ -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()




+ 7
- 0
libavcodec/avcodec.h View File

@@ -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 {


+ 14
- 0
libavformat/utils.c View File

@@ -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;


Loading…
Cancel
Save