Fix T38455: Blenderplayer is not working
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 3 Feb 2014 11:24:25 +0000 (17:24 +0600)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 3 Feb 2014 11:25:47 +0000 (17:25 +0600)
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.

intern/ffmpeg/ffmpeg_compat.h
source/blender/imbuf/intern/anim_movie.c
source/blender/imbuf/intern/indexer.c
source/gameengine/VideoTexture/VideoFFmpeg.cpp

index 6cae957471d954d37e1d02ef6c1c3f91feb745cf..801ab6e659d8f6131a52df512f4f3d64c3eeea7c 100644 (file)
@@ -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
index b7bea0d96b5bf0fe7b03cb2c379478ce3313a071..9a3042d149e7c99fa867355fc5dc3eebd95096ac 100644 (file)
@@ -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);
index a3cb4048779186f2de131d1ef5a62ba2a22a4987..e45222706d7a52657d0ad271965745a0e49bc372 100644 (file)
@@ -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) {
index 139988f64ea32ef26fb089dac9a41aa77431813a..3bad7c92efe4f184f53cd006d707fc1f8bab154d 100644 (file)
@@ -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;