From 476fd6ba3a7d74ed8be9af10cb9f4d4b3fdaf3e1 Mon Sep 17 00:00:00 2001 From: Aman Gupta <aman@tmm1.net> Date: Tue, 31 Jul 2018 14:33:08 -0700 Subject: [PATCH] avcodec/mediacodecdec: fix SEGV on modern nvidia decoders This code came originally from gstreamer, where it was added in [1] as a work-around for the Tegra 3. (The alignment was changed in [2] as a response to [3], from 32-bit to 16-bit). gstreamer only used this workaround in the case where the decoder didn't return a slice-height property, but when the code was copied into avcodec the conditional got lost. This commit restores the guard and prefers the slice-height from the decoder when it is available. This fixes segfaults decoding 1920x1080 h264 and mpeg2 videos on the NVidia SHIELD after upgrading to Android Oreo. [1] https://github.com/GStreamer/gst-plugins-bad/commit/a870e6a5c30dd85240fe75c7409cc1cf1b86541d [2] https://github.com/GStreamer/gst-plugins-bad/commit/21ff3ae0b0127bd82951d278ca24f2d54133b7cd [3] https://bugzilla.gnome.org/show_bug.cgi?id=748867 Signed-off-by: Aman Gupta <aman@tmm1.net> --- libavcodec/mediacodecdec_common.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c index 887865a281d..f235dae71bc 100644 --- a/libavcodec/mediacodecdec_common.c +++ b/libavcodec/mediacodecdec_common.c @@ -389,13 +389,14 @@ static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecConte s->stride = s->stride > 0 ? s->stride : s->width; AMEDIAFORMAT_GET_INT32(s->slice_height, "slice-height", 0); - s->slice_height = s->slice_height > 0 ? s->slice_height : s->height; - if (strstr(s->codec_name, "OMX.Nvidia.")) { + if (strstr(s->codec_name, "OMX.Nvidia.") && s->slice_height == 0) { s->slice_height = FFALIGN(s->height, 16); } else if (strstr(s->codec_name, "OMX.SEC.avc.dec")) { s->slice_height = avctx->height; s->stride = avctx->width; + } else if (s->slice_height == 0) { + s->slice_height = s->height; } AMEDIAFORMAT_GET_INT32(s->color_format, "color-format", 1); -- GitLab