aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2023-03-14 02:25:39 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2023-03-18 05:10:24 +0100
commit590d169bdb48e0fc30975ef4a93c4617273314a5 (patch)
treeef67f0813e49a8e953a8fdb5942a61413dde8339
parentf543f12817a2c11e942dc3f3eca78287417e13fa (diff)
downloadffmpeg-590d169bdb48e0fc30975ef4a93c4617273314a5.tar.gz
avcodec/decode: Reset MMX state for receive_frame decoders, too
FFmpeg's assembly code currently does not abide by the plattform-specific ABIs wrt its handling of the X86 MMX flag: Resetting the MMX state is deferred to avoid doing it multiple times instead of ensuring that the CPU is in floating point state upon return from any function. Furthermore, resetting said state is sometimes done generically, namely for all the decoders using the ordinary decode callback; yet this is not done for the decoders using the receive_frame API. This led to problems when MJPEG (and the MJPEG-based decoders) were switched to the receive_frame API in commit e9a2a8777317d91af658f774c68442ac4aa726ec, because ff_mjpeg_decode_sos() only resets the MMX state on success, not on failure. Such issues are probably still possible with SMVJPEG, which still uses the receive_frame API. See issue #10210. This commit therefore also resets the MMX state for the receive_frame API to avoid any more surprises of this sort. Reviewed-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
-rw-r--r--libavcodec/decode.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index d1ba7f167f..22a0f8eb25 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -547,6 +547,7 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
if (codec->cb_type == FF_CODEC_CB_TYPE_RECEIVE_FRAME) {
ret = codec->cb.receive_frame(avctx, frame);
+ emms_c();
} else
ret = decode_simple_receive_frame(avctx, frame);