lavf: switch to AVCodecContext.framerate for demuxing

This commit is contained in:
Anton Khirnov 2014-10-08 19:23:14 +00:00
parent 7ea1b3472a
commit 2d6e58497e
3 changed files with 10 additions and 8 deletions

View File

@ -323,7 +323,7 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
/** /**
* Return the frame duration in seconds. Return 0 if not available. * Return the frame duration in seconds. Return 0 if not available.
*/ */
void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st, void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
AVCodecParserContext *pc, AVPacket *pkt); AVCodecParserContext *pc, AVPacket *pkt);
unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id); unsigned int ff_codec_get_tag(const AVCodecTag *tags, enum AVCodecID id);

View File

@ -265,7 +265,7 @@ static int compute_pkt_fields2(AVFormatContext *s, AVStream *st, AVPacket *pkt)
/* duration field */ /* duration field */
if (pkt->duration == 0) { if (pkt->duration == 0) {
ff_compute_frame_duration(&num, &den, st, NULL, pkt); ff_compute_frame_duration(s, &num, &den, st, NULL, pkt);
if (den && num) { if (den && num) {
pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num); pkt->duration = av_rescale(1, num * (int64_t)st->time_base.den * st->codec->ticks_per_frame, den * (int64_t)st->time_base.num);
} }

View File

@ -456,9 +456,11 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt)
/** /**
* Return the frame duration in seconds. Return 0 if not available. * Return the frame duration in seconds. Return 0 if not available.
*/ */
void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st, void ff_compute_frame_duration(AVFormatContext *s, int *pnum, int *pden, AVStream *st,
AVCodecParserContext *pc, AVPacket *pkt) AVCodecParserContext *pc, AVPacket *pkt)
{ {
AVRational codec_framerate = s->iformat ? st->codec->framerate :
av_inv_q(st->codec->time_base);
int frame_size; int frame_size;
*pnum = 0; *pnum = 0;
@ -471,9 +473,9 @@ void ff_compute_frame_duration(int *pnum, int *pden, AVStream *st,
} else if (st->time_base.num * 1000LL > st->time_base.den) { } else if (st->time_base.num * 1000LL > st->time_base.den) {
*pnum = st->time_base.num; *pnum = st->time_base.num;
*pden = st->time_base.den; *pden = st->time_base.den;
} else if (st->codec->time_base.num * 1000LL > st->codec->time_base.den) { } else if (codec_framerate.den * 1000LL > codec_framerate.num) {
*pnum = st->codec->time_base.num; *pnum = codec_framerate.den;
*pden = st->codec->time_base.den; *pden = codec_framerate.num;
if (pc && pc->repeat_pict) { if (pc && pc->repeat_pict) {
if (*pnum > INT_MAX / (1 + pc->repeat_pict)) if (*pnum > INT_MAX / (1 + pc->repeat_pict))
*pden /= 1 + pc->repeat_pict; *pden /= 1 + pc->repeat_pict;
@ -620,7 +622,7 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
} }
if (pkt->duration == 0 && st->codec->codec_type != AVMEDIA_TYPE_AUDIO) { if (pkt->duration == 0 && st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
ff_compute_frame_duration(&num, &den, st, pc, pkt); ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
if (den && num) { if (den && num) {
pkt->duration = av_rescale_rnd(1, num * (int64_t) st->time_base.den, pkt->duration = av_rescale_rnd(1, num * (int64_t) st->time_base.den,
den * (int64_t) st->time_base.num, den * (int64_t) st->time_base.num,
@ -683,7 +685,7 @@ static void compute_pkt_fields(AVFormatContext *s, AVStream *st,
st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
int duration = pkt->duration; int duration = pkt->duration;
if (!duration && st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { if (!duration && st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
ff_compute_frame_duration(&num, &den, st, pc, pkt); ff_compute_frame_duration(s, &num, &den, st, pc, pkt);
if (den && num) { if (den && num) {
duration = av_rescale_rnd(1, duration = av_rescale_rnd(1,
num * (int64_t) st->time_base.den, num * (int64_t) st->time_base.den,