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:
parent
15f449c529
commit
9bec4f7779
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user