diff options
Diffstat (limited to 'source/blender/imbuf')
-rw-r--r-- | source/blender/imbuf/intern/anim_movie.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c index 8df0d69bcfa..421ef08dc25 100644 --- a/source/blender/imbuf/intern/anim_movie.c +++ b/source/blender/imbuf/intern/anim_movie.c @@ -839,7 +839,15 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { } } +/* disable seek_by_bytes for now, since bitrates are guessed wrong! + also: MPEG2TS-seeking was fixed in later versions of ffmpeg, so problem + is somewhat fixed by now (until we add correct timecode management code...) +*/ +#if 0 seek_by_bytes = !!(anim->pFormatCtx->iformat->flags & AVFMT_TS_DISCONT); +#else + seek_by_bytes = FALSE; +#endif if (position != anim->curposition + 1) { #ifdef FFMPEG_OLD_FRAME_RATE @@ -851,12 +859,9 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { av_q2d(anim->pFormatCtx->streams[anim->videoStream] ->r_frame_rate); #endif - double time_base = - av_q2d(anim->pFormatCtx->streams[anim->videoStream] - ->time_base); + double pts_time_base = av_q2d(anim->pFormatCtx->streams[anim->videoStream]->time_base); long long pos; - long long st_time = anim->pFormatCtx - ->streams[anim->videoStream]->start_time; + long long st_time = anim->pFormatCtx->start_time; int ret; if (seek_by_bytes) { @@ -876,7 +881,7 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { } if (st_time != AV_NOPTS_VALUE) { - pos += st_time * AV_TIME_BASE * time_base; + pos += st_time; } } @@ -891,9 +896,9 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) { } pts_to_search = (long long) - (((double) position) / time_base / frame_rate); + (((double) position) / pts_time_base / frame_rate); if (st_time != AV_NOPTS_VALUE) { - pts_to_search += st_time; + pts_to_search += st_time / pts_time_base/ AV_TIME_BASE; } pos_found = 0; |