diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-07-20 19:57:28 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-07-21 13:49:20 +0300 |
commit | 6778ef4dcc6e8d92e3b2ec9b9ecaf1e54e5bf7b5 (patch) | |
tree | 5de6625493950b5b84890ccb6f5d90260a74cb9a /source/blender/imbuf/intern | |
parent | 1c0fa3aff6844bba4bc0fca985d8138385933874 (diff) |
Fix T78867: Crash related to viewing video files
Any time FFmpeg was used to get a picture Blender would crash
when FFmpeg 4.3 is used. This affects thumbnails, VSE, Clip Editor.
Caused by a bug in FFmpeg which lead to crashes when unaligned
buffer was passed to sws_scale(). It got fixed later on in FFmpeg,
but for portability and compatibility reasons still nice to avoid
crash, especially since it's not so difficult to do.
FFmpeg ticked number is #8747
The FFmpeg Git hash with the fix: ba3e771a42c2
Differential Revision: https://developer.blender.org/D8355
Diffstat (limited to 'source/blender/imbuf/intern')
-rw-r--r-- | source/blender/imbuf/intern/anim_movie.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c index 8361c43afc1..9fab450cc76 100644 --- a/source/blender/imbuf/intern/anim_movie.c +++ b/source/blender/imbuf/intern/anim_movie.c @@ -1205,7 +1205,29 @@ static ImBuf *ffmpeg_fetchibuf(struct anim *anim, int position, IMB_Timecode_Typ } IMB_freeImBuf(anim->last_frame); - anim->last_frame = IMB_allocImBuf(anim->x, anim->y, 32, IB_rect); + + /* Certain versions of FFmpeg have a bug in libswscale which ends up in crash + * when destination buffer is not properly aligned. For example, this happens + * in FFmpeg 4.3.1. It got fixed later on, but for compatibility reasons is + * still best to avoid crash. + * + * This is achieved by using own allocation call rather than relying on + * IMB_allocImBuf() to do so since the IMB_allocImBuf() is not guaranteed + * to perform aligned allocation. + * + * In theory this could give better performance, since SIMD operations on + * aligned data are usually faster. + * + * Note that even though sometimes vertical flip is required it does not + * affect on alignment of data passed to sws_scale because if the X dimension + * is not 32 byte aligned special intermediate buffer is allocated. + * + * The issue was reported to FFmpeg under ticket #8747 in the FFmpeg tracker + * and is fixed in the newer versions than 4.3.1. */ + anim->last_frame = IMB_allocImBuf(anim->x, anim->y, 32, 0); + anim->last_frame->rect = MEM_mallocN_aligned((size_t)4 * anim->x * anim->y, 32, "ffmpeg ibuf"); + anim->last_frame->mall |= IB_rect; + anim->last_frame->rect_colorspace = colormanage_colorspace_get_named(anim->colorspace); ffmpeg_postprocess(anim); |