fraunhoferhhi / vvdec

VVdeC, the Fraunhofer Versatile Video Decoder
https://www.hhi.fraunhofer.de/en/departments/vca/technologies-and-solutions/h266-vvc.html
BSD 3-Clause Clear License
428 stars 85 forks source link

Does not work on processors without SSE4 #182

Closed v0lt closed 1 week ago

v0lt commented 3 weeks ago

The decoder crashes on processors without SSE4.

To see the cause of the error on a modern CPU, you need to force return SCALAR in the _get_x86_extensions function. When decoding the video, the PU::setAllAffineMv method will be called, which calls _mm_mullo_epi32 from SSE4.1. This shouldn't happen.

K-os commented 3 weeks ago

Yes, we always build with -msse4.1 enabled. This was a conscious design decision, because it is so old, basically all CPUs powerful enough to play VVC, should support it. Which CPU are you using, that does not support SSE4.1 ?

K-os commented 3 weeks ago

Oh, I just realized: if you really want to disable all SIMD code for such an old CPU, you can build with cmake -DVVDEC_ENABLE_X86_SIMD=0.

v0lt commented 3 weeks ago

Which CPU are you using, that does not support SSE4.1 ?

MPC-BE users have encountered the issue on the following processors: Intel Pentium E6300 Intel Core 2 Duo E4300 Athlon 64 X2 (I don't know the exact model)

Yes, we always build with -msse4.1 enabled. This was a conscious design decision, because it is so old, basically all CPUs powerful enough to play VVC, should support it.

I looked at your code and expected the decoder to work correctly when _get_x86_extensions returns SCALAR (not SSE41 or higher).

K-os commented 3 weeks ago

Ok, interesting that people try to decode VVC on CPUs that are 17 years old...

We'll look into that and make sure to warp the places, where we explicitly call SSE41 instructions, to fall back to scalar code.

v0lt commented 3 weeks ago

Fine. Whether it works out or not, I will ask you to write somewhere the minimum requirements for x86 processors. It may be SSE2, SSSE3 or even SSE4.1, but I think it was documented.