[FFmpeg-cvslog] avcodec/mediacodecdec: fix SEGV on modern nvidia decoders
Aman Gupta
git at videolan.org
Fri Aug 3 21:08:00 EEST 2018
ffmpeg | branch: release/4.0 | Aman Gupta <aman at tmm1.net> | Tue Jul 31 14:33:08 2018 -0700| [fab3418cb9e4661405e669b07498fdfdded39ce3] | committer: Aman Gupta
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 at tmm1.net>
(cherry picked from commit 476fd6ba3a7d74ed8be9af10cb9f4d4b3fdaf3e1)
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=fab3418cb9e4661405e669b07498fdfdded39ce3
---
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 887865a281..f235dae71b 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);
More information about the ffmpeg-cvslog
mailing list