1
mirror of https://github.com/mpv-player/mpv synced 2024-10-30 04:46:41 +01:00
mpv/video
wm4 e1157cb6e8 video: generally try to align image data on 64 bytes
Generally, using x86 SIMD efficiently (or crash-free) requires aligning
all data on boundaries of 16, 32, or 64 (depending on instruction set
used). 64 bytes is needed or AVX-512, 32 for old AVX, 16 for SSE. Both
FFmpeg and zimg usually require aligned data for this reason.

FFmpeg is very unclear about alignment. Yes, it requires you to align
data pointers and strides. No, it doesn't tell you how much, except
sometimes (libavcodec has a legacy-looking avcodec_align_dimensions2()
API function, that requires a heavy-weight AVCodecContext as argument).

Sometimes, FFmpeg will take a shit on YOUR and ITS OWN alignment. For
example, vf_crop will randomly reduce alignment of data pointers,
depending on the crop parameters. On the other hand, some libavfilter
filters or libavcodec encoders may randomly crash if they get the wrong
alignment. I have no idea how this thing works at all.

FFmpeg usually doesn't seem to signal alignment internal anywhere, and
usually leaves it to av_malloc() etc. to allocate with proper alignment.
libavutil/mem.c currently has a ALIGN define, which is set to 64 if
FFmpeg is built with AVX-512 support, or as low as 16 if built without
any AVX support. The really funny thing is that a normal FFmpeg build
will e.g. align tiny string allocations to 64 bytes, even if the machine
does not support AVX at all.

For zimg use (in a later commit), we also want guaranteed alignment.
Modern x86 should actually not be much slower at unaligned accesses, but
that doesn't help. zimg's dumb intrinsic code apparently randomly
chooses between aligned or unaligned accesses (depending on compiler, I
guess), and on some CPUs these can even cause crashes. So just treat the
requirement to align as a fact of life.

All this means that we should probably make sure our own allocations are
64 bit aligned. This still doesn't guarantee alignment in all cases, but
it's slightly better than before.

This also makes me wonder whether we should always override libavcodec's
buffer pool, just so we have a guaranteed alignment. Currently, we only
do that if --vd-lavc-dr is used (and if that actually works). On the
other hand, it always uses DR on my machine, so who cares.
2019-09-19 20:37:05 +02:00
..
decode video: generally try to align image data on 64 bytes 2019-09-19 20:37:05 +02:00
filter vf_vapourynth: remove Lua backend 2019-09-19 20:37:05 +02:00
out vo: fix missed option updates under rare circumstances 2019-09-19 20:37:05 +02:00
csputils.c csputils: Add support for Display P3 primaries 2017-12-14 23:31:09 +02:00
csputils.h csputils: Add support for Display P3 primaries 2017-12-14 23:31:09 +02:00
d3d.c video: rewrite filtering glue code 2018-01-30 03:10:27 -08:00
d3d.h video: move d3d.c out of decode sub directory 2017-12-01 17:58:56 +01:00
fmt-conversion.c vo/gpu: hwdec_vdpau: Support direct mode for 4:4:4 content 2019-07-08 01:11:27 +02:00
fmt-conversion.h video/fmt-conversion, img_format: change license to LGPL 2017-06-18 15:15:07 +02:00
hwdec.c video: rewrite filtering glue code 2018-01-30 03:10:27 -08:00
hwdec.h video: rewrite filtering glue code 2018-01-30 03:10:27 -08:00
image_loader.c image_writer: move convert_image() to player/screenshot.c 2019-09-14 23:02:39 +02:00
image_loader.h x11: load icon differently 2017-07-01 15:56:12 +02:00
image_writer.c image_writer: add webp-compression option 2019-09-14 23:02:39 +02:00
image_writer.h image_writer: add webp-compression option 2019-09-14 23:02:39 +02:00
img_format.c video: generally try to align image data on 64 bytes 2019-09-19 20:37:05 +02:00
img_format.h vo/gpu: hwdec_vdpau: Support direct mode for 4:4:4 content 2019-07-08 01:11:27 +02:00
mp_image_pool.c mp_image_pool: add helper functions for FFmpeg hw frames pools 2018-01-18 00:59:07 -08:00
mp_image_pool.h mp_image_pool: add helper functions for FFmpeg hw frames pools 2018-01-18 00:59:07 -08:00
mp_image.c video: generally try to align image data on 64 bytes 2019-09-19 20:37:05 +02:00
mp_image.h video: generally try to align image data on 64 bytes 2019-09-19 20:37:05 +02:00
sws_utils.c sws_utils: don't force callers to provide option struct 2018-01-18 00:59:07 -08:00
sws_utils.h video: generally try to align image data on 64 bytes 2019-09-19 20:37:05 +02:00
vaapi.c vaapi: add option to select a non-default device path 2018-03-30 14:16:07 -07:00
vaapi.h vo_gpu: hwdec_vaapi: Suppress format errors when probing 2019-07-08 01:57:02 +02:00
vdpau_functions.inc vo_vdpau: directly get surface size from surface for screenshots 2015-06-05 22:34:16 +02:00
vdpau_mixer.c video: redo video equalizer option handling 2017-08-22 17:01:35 +02:00
vdpau_mixer.h video: redo video equalizer option handling 2017-08-22 17:01:35 +02:00
vdpau.c hwdec: remove unused fields 2017-12-21 19:31:36 +01:00
vdpau.h vd_lavc, vdpau, vaapi: restore emulated API avoidance 2017-12-02 04:53:51 +01:00