Fix T38455: Blenderplayer is not working

Was a regression since avg_frame_rate changes.

Didn't find reliable way to get stream duration which will
work with both FFmpeg and Libav so added some freaking black
magic to distinguish one from another.
This commit is contained in:
Sergey Sharybin 2014-02-03 17:24:25 +06:00
parent 15f449c529
commit 9bec4f7779
4 changed files with 20 additions and 6 deletions

@ -419,4 +419,15 @@ void av_frame_free(AVFrame **frame)
}
#endif
FFMPEG_INLINE
AVRational av_get_r_frame_rate_compat(const AVStream *stream)
{
/* Stupid way to distinguish FFmpeg from Libav. */
#if LIBAVCODEC_VERSION_MICRO >= 100
return stream->r_frame_rate;
#else
return stream->avg_frame_rate;
#endif
}
#endif

@ -466,6 +466,7 @@ static int startffmpeg(struct anim *anim)
AVCodec *pCodec;
AVFormatContext *pFormatCtx = NULL;
AVCodecContext *pCodecCtx;
AVRational frame_rate;
int frs_num;
double frs_den;
int streamcount;
@ -527,12 +528,14 @@ static int startffmpeg(struct anim *anim)
return -1;
}
frame_rate = av_get_r_frame_rate_compat(pFormatCtx->streams[videoStream]);
anim->duration = ceil(pFormatCtx->duration *
av_q2d(pFormatCtx->streams[videoStream]->avg_frame_rate) /
av_q2d(frame_rate) /
AV_TIME_BASE);
printf("%d\n", anim->duration);
frs_num = pFormatCtx->streams[videoStream]->avg_frame_rate.num;
frs_den = pFormatCtx->streams[videoStream]->avg_frame_rate.den;
frs_num = frame_rate.num;
frs_den = frame_rate.den;
frs_den *= AV_TIME_BASE;
@ -970,7 +973,7 @@ static ImBuf *ffmpeg_fetchibuf(struct anim *anim, int position,
v_st = anim->pFormatCtx->streams[anim->videoStream];
frame_rate = av_q2d(v_st->avg_frame_rate);
frame_rate = av_q2d(av_get_r_frame_rate_compat(v_st));
st_time = anim->pFormatCtx->start_time;
pts_time_base = av_q2d(v_st->time_base);

@ -910,7 +910,7 @@ static int index_rebuild_ffmpeg(FFmpegIndexBuilderContext *context,
stream_size = avio_size(context->iFormatCtx->pb);
context->frame_rate = av_q2d(context->iStream->avg_frame_rate);
context->frame_rate = av_q2d(av_get_r_frame_rate_compat(context->iStream));
context->pts_time_base = av_q2d(context->iStream->time_base);
while (av_read_frame(context->iFormatCtx, &next_packet) >= 0) {

@ -220,7 +220,7 @@ int VideoFFmpeg::openStream(const char *filename, AVInputFormat *inputFormat, AV
codecCtx->frame_rate_base=1000;
m_baseFrameRate = (double)codecCtx->frame_rate / (double)codecCtx->frame_rate_base;
#else
m_baseFrameRate = av_q2d(formatCtx->streams[videoStream]->r_frame_rate);
m_baseFrameRate = av_q2d(av_get_r_frame_rate_compat(formatCtx->streams[videoStream]));
#endif
if (m_baseFrameRate <= 0.0)
m_baseFrameRate = defFrameRate;