From patchwork Wed Apr 21 17:40:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 27207 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:5014:0:0:0:0:0 with SMTP id e20csp605553iob; Wed, 21 Apr 2021 10:47:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxopm4gECU+QfYAmSldcKG5N7oG/X3sEAvDKsGWOMcMgAnV4+trYSi/CwzuzSIkn3auzJJV X-Received: by 2002:a05:6402:781:: with SMTP id d1mr18007054edy.32.1619027243413; Wed, 21 Apr 2021 10:47:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619027243; cv=none; d=google.com; s=arc-20160816; b=laVE0W6FzGlgYVvbq5StlQDpxUViCo0DmEo+FNXz5p4PLzEA2VKVvYjKWk6NkD+Qvh 2dSvOOsfvaHoNWThq9Kvr9/09eAmoyd8QZxoS8XMS/xeye4JbZF+e/cSaep7PUVZZD0C XoBk7Qiw3FU15cXO8axXLPBnglj9XDKiS2oI4Mm6aUAWOS9REcxCzcPsuL//p7SwOhN4 kqUkOuPKEPJ62bIy5NW+FqLkXWw7KGbWuJeyRJ8E0YnxZJjsXVSCZ0jlAcnt+yz6mvQx mXHeRo0n1OvsUyPj4ObL5zMLp/mOPu1/wBj7NqPquoz2xDVqjgDZVZP3I7TBe1jOl5wz jiyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=35Bw/OcBZSQDxKbjbIRNnOkjxMkPNumjEwdInq2Saoc=; b=TwM3pXnluCAjc3qF8UhLS/YsZziUY4cKHLP/klrqRgPncl8Nr1p0+2txKKiRDy1Rgv gs0YYFXS3hrFHb/6bLRW7FD9nOyC3obFM36f8WUtOS8d+2K4TYACz41dl9IEY9w7Cn92 klAoRXGD76pkxTvzwWgbu45C8B0OffAbkZ74ygnAeYfCNFOSh/OqSTs0GiWKP3rxZRS7 URpwvp7wHO+CgOMcgOW9tX9SEO8EZYy7lTeSxn9KZ/JXAwyhvvmrgnu1h5CnkjtctUGq Ui/ye/3BTQVi18ekNWGSB/dbbBG0PpLEu2tVmhZbPqxHmZmxzZeKZuv2rBUqRNakYi8z u7hA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Pb9pJQVC; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id w2si2911572edi.249.2021.04.21.10.47.23; Wed, 21 Apr 2021 10:47:23 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Pb9pJQVC; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E4883689BBC; Wed, 21 Apr 2021 20:47:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f178.google.com (mail-qt1-f178.google.com [209.85.160.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A95D66899EC for ; Wed, 21 Apr 2021 20:47:13 +0300 (EEST) Received: by mail-qt1-f178.google.com with SMTP id m16so31210367qtx.9 for ; Wed, 21 Apr 2021 10:47:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=hY9pbuGvQniaz2TD8ZX6dd/gfYYSFyRCCECg3IaObBY=; b=Pb9pJQVCqF6xwiC577QOdODOD1tb7x6zCceX1L/UdEJA9hnG/uBbOZxYo9aocvV6OL ZBZhufB/lDIMfF0C3MZ5gCgZ10C9i+s+eI/FlUEPF2I9q6TaVIxqKkqbNWLqV3rXeStX /A5PByPQm6H0pT+p7pcssdLLfTtDFeSPgvfmfKJaYuedkx3wzQhfT9bsO+BO5JyNrJs1 CMomcdbikgs1MMC9Afc8u0bzjNtHV3cEJDm2kiymvQ3X6/BRbMyl0raImNpV+luOXSJ1 IsQsZRPHRAVhzIADjgYvJVYGCmxKBgX1V+C/HTfWY/4sxNOsj2hzVxbMXNg13VWTAd0r COjw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=hY9pbuGvQniaz2TD8ZX6dd/gfYYSFyRCCECg3IaObBY=; b=HzSN1yvtOoqhiIMBKTyn0/8zJopeAH5B1eQmzZnlHow8Ach7L/NusWXfEnNT04WSsC hN4Wk2Gkdyc9+WbWZEaKYSnPxagip4dFEJbtFcSI/YQ1IIprIZecBZtJ6ZHTjbDxuLbx kl3OLiJv1E4crWJ3XXHT7g8FV2++3R46mn8fIslv1ScX8gGoe+zkw96aFLOFdOHmveAV 4A1r+FkTbOoYW9bzHnt/JX+g0TUSlXqrdhuGiVjs5bO8YW6TU0eJKy5VKkDkewQ5z4Kg e6vxyOg3Mtil71Xynel9KxMjahpqEaqBsR0tR8ZBb1My5jRHVgyIVau38n51dSsB4gBr ujHQ== X-Gm-Message-State: AOAM5335SzZ4FPkKU2seh5OPT2B+6yenh2SLGmFSKM8B4ROiYWYK1awd 3e5Sa303w/HV14bjbYFyO5wQXp4sAqQ= X-Received: by 2002:ac8:7407:: with SMTP id p7mr15584284qtq.67.1619026891643; Wed, 21 Apr 2021 10:41:31 -0700 (PDT) Received: from localhost.localdomain ([191.83.218.38]) by smtp.gmail.com with ESMTPSA id f8sm5154qkh.83.2021.04.21.10.41.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 21 Apr 2021 10:41:31 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 21 Apr 2021 14:40:55 -0300 Message-Id: <20210421174055.65029-2-jamrial@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210421174055.65029-1-jamrial@gmail.com> References: <20210421174055.65029-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/mjpegdec: postpone calling ff_get_buffer() until the SOS marker X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: /PmH/JpIW20J With JPEG-LS PAL8 samples, the JPEG-LS extension parameters signaled with the LSE marker show up after SOF but before SOS. For those, the pixel format chosen by get_format() in SOF is GRAY8, and then replaced by PAL8 in LSE. This has not been an issue given both pixel formats allocate the second data plane for the palette, but after the upcoming soname bump, GRAY8 will no longer do that. This will result in segfauls when ff_jpegls_decode_lse() attempts to write the palette on a buffer originally allocated as a GRAY8 one. Work around this by calling ff_get_buffer() after the actual pixel format is known. Signed-off-by: James Almer --- With this, the removal of AV_PIX_FMT_FLAG_PSEUDOPAL will no longer generate segfauls. I can't test hwaccels like vaapi to ensure things still work as inteded, seeing i also had to move the call to start_frame(). Better solutions are very much welcome. libavcodec/jpeglsdec.c | 6 ++-- libavcodec/mjpegdec.c | 72 +++++++++++++++++++++++------------------- libavcodec/mjpegdec.h | 2 ++ 3 files changed, 43 insertions(+), 37 deletions(-) diff --git a/libavcodec/jpeglsdec.c b/libavcodec/jpeglsdec.c index d79bbe1ee3..e3ffec59bf 100644 --- a/libavcodec/jpeglsdec.c +++ b/libavcodec/jpeglsdec.c @@ -108,9 +108,8 @@ int ff_jpegls_decode_lse(MJpegDecodeContext *s) if (s->palette_index > maxtab) return AVERROR_INVALIDDATA; - if ((s->avctx->pix_fmt == AV_PIX_FMT_GRAY8 || s->avctx->pix_fmt == AV_PIX_FMT_PAL8) && - (s->picture_ptr->format == AV_PIX_FMT_GRAY8 || s->picture_ptr->format == AV_PIX_FMT_PAL8)) { - uint32_t *pal = (uint32_t *)s->picture_ptr->data[1]; + if (s->avctx->pix_fmt == AV_PIX_FMT_GRAY8 || s->avctx->pix_fmt == AV_PIX_FMT_PAL8) { + uint32_t *pal = (uint32_t *)s->palette; int shift = 0; if (s->avctx->bits_per_raw_sample > 0 && s->avctx->bits_per_raw_sample < 8) { @@ -118,7 +117,6 @@ int ff_jpegls_decode_lse(MJpegDecodeContext *s) shift = 8 - s->avctx->bits_per_raw_sample; } - s->picture_ptr->format = s->avctx->pix_fmt = AV_PIX_FMT_PAL8; for (i=s->palette_index; i<=maxtab; i++) { uint8_t k = i << shift; diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index 7c66ff8637..cf65955891 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -681,11 +681,13 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) } else if (s->nb_components != 1) { av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of components %d\n", s->nb_components); return AVERROR_PATCHWELCOME; - } else if (s->palette_index && s->bits <= 8) - s->avctx->pix_fmt = AV_PIX_FMT_PAL8; - else if (s->bits <= 8) - s->avctx->pix_fmt = AV_PIX_FMT_GRAY8; - else + } else if (s->bits <= 8) { + avpriv_set_systematic_pal2((uint32_t *)s->palette, s->avctx->pix_fmt); + if (s->palette_index) + s->avctx->pix_fmt = AV_PIX_FMT_PAL8; + else + s->avctx->pix_fmt = AV_PIX_FMT_GRAY8; + } else s->avctx->pix_fmt = AV_PIX_FMT_GRAY16; } @@ -716,27 +718,13 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) s->avctx->pix_fmt = s->hwaccel_pix_fmt; } + s->got_picture = 1; + if (s->avctx->skip_frame == AVDISCARD_ALL) { s->picture_ptr->pict_type = AV_PICTURE_TYPE_I; s->picture_ptr->key_frame = 1; - s->got_picture = 1; return 0; } - - av_frame_unref(s->picture_ptr); - if (ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF) < 0) - return -1; - s->picture_ptr->pict_type = AV_PICTURE_TYPE_I; - s->picture_ptr->key_frame = 1; - s->got_picture = 1; - - for (i = 0; i < 4; i++) - s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced; - - ff_dlog(s->avctx, "%d %d %d %d %d %d\n", - s->width, s->height, s->linesize[0], s->linesize[1], - s->interlaced, s->avctx->height); - } if ((s->rgb && !s->lossless && !s->ls) || @@ -764,18 +752,6 @@ int ff_mjpeg_decode_sof(MJpegDecodeContext *s) memset(s->coefs_finished, 0, sizeof(s->coefs_finished)); } - if (s->avctx->hwaccel) { - s->hwaccel_picture_private = - av_mallocz(s->avctx->hwaccel->frame_priv_data_size); - if (!s->hwaccel_picture_private) - return AVERROR(ENOMEM); - - ret = s->avctx->hwaccel->start_frame(s->avctx, s->raw_image_buffer, - s->raw_image_buffer_size); - if (ret < 0) - return ret; - } - return 0; } @@ -1636,6 +1612,36 @@ int ff_mjpeg_decode_sos(MJpegDecodeContext *s, const uint8_t *mb_bitmask, return -1; } + if (!s->interlaced || !(s->bottom_field == !s->interlace_polarity)) { + av_frame_unref(s->picture_ptr); + if (ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF) < 0) + return -1; + s->picture_ptr->pict_type = AV_PICTURE_TYPE_I; + s->picture_ptr->key_frame = 1; + + for (i = 0; i < 4; i++) + s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced; + + if (s->picture_ptr->format == AV_PIX_FMT_PAL8) + memcpy(s->picture_ptr->data[1], s->palette, sizeof(s->palette)); + + ff_dlog(s->avctx, "%d %d %d %d %d %d\n", + s->width, s->height, s->linesize[0], s->linesize[1], + s->interlaced, s->avctx->height); + } + + if (s->avctx->hwaccel && !s->hwaccel_picture_private) { + s->hwaccel_picture_private = + av_mallocz(s->avctx->hwaccel->frame_priv_data_size); + if (!s->hwaccel_picture_private) + return AVERROR(ENOMEM); + + ret = s->avctx->hwaccel->start_frame(s->avctx, s->raw_image_buffer, + s->raw_image_buffer_size); + if (ret < 0) + return ret; + } + if (reference) { if (reference->width != s->picture_ptr->width || reference->height != s->picture_ptr->height || diff --git a/libavcodec/mjpegdec.h b/libavcodec/mjpegdec.h index 2400a179f1..f66bdf0cd9 100644 --- a/libavcodec/mjpegdec.h +++ b/libavcodec/mjpegdec.h @@ -165,7 +165,9 @@ typedef struct MJpegDecodeContext { enum AVPixelFormat hwaccel_sw_pix_fmt; enum AVPixelFormat hwaccel_pix_fmt; void *hwaccel_picture_private; + struct JLSState *jls_state; + uint8_t palette[AVPALETTE_SIZE]; } MJpegDecodeContext; int ff_mjpeg_build_vlc(VLC *vlc, const uint8_t *bits_table,