From patchwork Wed Oct 26 02:23:33 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wangyaqiang <1035567130@qq.com> X-Patchwork-Id: 39012 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:85a8:b0:a2:d5a7:ad9d with SMTP id s40csp156489pzd; Tue, 25 Oct 2022 19:24:21 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6P929x3Jr6rMwBwcnj98PPgYnhxTeO8hzy9waJOo+fuHuBK5qnjhoTIa/zmcIx43Ll3TIb X-Received: by 2002:a17:906:5dcc:b0:78d:fb98:6f85 with SMTP id p12-20020a1709065dcc00b0078dfb986f85mr36056375ejv.123.1666751061349; Tue, 25 Oct 2022 19:24:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666751061; cv=none; d=google.com; s=arc-20160816; b=jMWAi2ulff5DWGiJSx/1+gzU5eIFV1dLM2CsnpuATA5ejRT4uyBh9VDo9zYT9RES4U ML5jDk8AYikhLQnTIKALUu9Pg1GQpZ12U73ByqRuBFTkL99OTTorOsM250S0We6GtQQw WXX7Lp94EG1TIpa0Bs6EsRu4fXhYKWUafVW4a2AQiPZnC51cV5IC6Ij8Hg/Y5SLjxGRh YSHW0V9lRC8CR2h/n+86ELSE7Eg0FyhEF7ln1r9NmGzytExeD8ioTzogwiT30kWnBed5 ZaAix8eBU3Nley+rgwaj1r+W8sBOIxWtmgrucePn2o9syXIjg17CYZ609184qg78rQh/ xlVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to:date :to:from:message-id:dkim-signature:delivered-to; bh=cCC0ndAZjDUvP3A06Hlh5lDIE10Str3in2sYKPUKA8Y=; b=Iv3ibs2U9EM38gmcZyVtvYpAwbU4MNHIrriSzH8fij2iNtpGSroDscrGr97V8bGJnS /8vNFA16a1Wt2/9eSiINYI54k2b/0sS27GqAniSS1RczXoS1kXEq00I2+21nQJWGyjSw pGTOthXLymr+uc94JTbbpHfW17UGtA276fzsqtCdsbokfFhW0EegXoIyhtg3uPtn7hbk E4c+LxOp11yNBVok1eOvSrn9npCDHPjCFwpQOrw+KQel0HBp28MTqmURmOfbNEuxjTKx lxd3HS0ZruY3o11bgt4lPhb2CaATsoFIH/UeJNi7GOKOh3Y7ESZ3stilaIPrcSrffb62 4/Bg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@qq.com header.s=s201512 header.b=PJlcycyL; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=qq.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id z11-20020a05640240cb00b00458e43471d5si5180947edb.614.2022.10.25.19.23.57; Tue, 25 Oct 2022 19:24:21 -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=@qq.com header.s=s201512 header.b=PJlcycyL; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=qq.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 25FE368BC2E; Wed, 26 Oct 2022 05:23:54 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-64.mail.qq.com (out162-62-57-64.mail.qq.com [162.62.57.64]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AB62F68BBFC for ; Wed, 26 Oct 2022 05:23:46 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512; t=1666751016; bh=hC+sOD6P+YutrvQ2yDwx/N7p1JkLwFxYujGxfI+ZV/g=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=PJlcycyLxlD+bWazCnm6dbb0kI0mBKfKZDFM2QU/xJ2uGpky4rxvrFcsZY1BsLGKY +sQXHeatKY6n27xep0IbZy69k/5skAng48TNdV8fAtcM5C8AAlOL1qhaCpxPrKBSg7 VSA7DavOLmhllLkY2ioDqLwgtwjNYhT731lj+vyU= Received: from localhost.localdomain ([103.107.216.225]) by newxmesmtplogicsvrszc2-1.qq.com (NewEsmtp) with SMTP id 5E288AB3; Wed, 26 Oct 2022 10:23:34 +0800 X-QQ-mid: xmsmtpt1666751014tu0an5509 Message-ID: X-QQ-XMAILINFO: NMXiAFG25ild8lRawEFvTjx3zkQfjhefqIyz7KgeqxEUWvaV2V8cUt4JqSIclp IcWSG/wY18jllH8vEOzvG42jMh3Hp5B5/EFzXlMlB5XjYI63hj5jcbkOHmUGwWcsYhP7uQ+QOEBT PkT8Tw0lnrlZgxsTu4XizVvkM71RDxOOGlGvmU0G1D1AAw5w4CWoGJl82fed+CP53mIb+DXYSy/3 SM1yc6v10/+SYV0zlDhmUMSgBEKvj4fFnLjrz41eUI6VvneHqhQjfSN0DdSD5BFKkozeAPjS+YAj zj3gZ6iMXRIqi8vtGGUoyoHlb3QbRdZu7SlGVP+OPBr3xv9ml3/BQDNE4MPgSflIhqJ078DVHJXO CLeWwBrgJ17SE+D03ObNBs3VCscZW7snPLeckk4kb1Rv8cs318R8+B1d3u+1cR5jZ72qT8Ct8hKw dYYjwGDsYGnUGGrx5UQgIwdvJcfoeRNx/lnnw4Fgk8joPESnrvzqpEwjLIr4MNyW+hQ6Rfgbcdtk PFhLL9dugL4NYrwOVize7Vtf9hfOxtRCUM6fTRn9u7RUrRr3f7+SUW8LHTOh/BAAokSprlhxpNo8 W1iA9/D7IXw1olK+5/ZH9gUKLvLeiMOEkXxA95iX1ZC/IlxMXkS/MegR8KV82jk5J8+2ED7Rj9Vg kZq+jx6wf1pndvuexK+MKJQKnNcaiqwT67arsUIxEu7+z8DYH4qg1X2F57VUHvYNtxm2BvEv4X/4 52IsUWrPNLSYCJ3Dvlqux2TR/dPNyS1l5hGjZecNEpdM7h0VjXNF6h/9Kh8zbEs8eqpF2F4Apt/j T5dTJt4/5s7xfaMa1dUUzOI0mrQ9gBOUGAt93R+0YA8Qy6BYNhRXFM4yA7zC4vvIZqzDvRafLVco J8mohlIjbTt88dOzDpbHojxwol2pYsL8htwnhEbK0t5ABbnSrnRdRTvwxDZkZWRs0E2R0mdp7wo5 F2avysEeLtj1Z2L1V34XfMyjlusaW/ From: 1035567130@qq.com To: ffmpeg-devel@ffmpeg.org Date: Wed, 26 Oct 2022 10:23:33 +0800 X-OQ-MSGID: <20221026022333.37893-1-1035567130@qq.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3] lavc/hevc_ps: fix process failed when SPS before VPS in hvcC 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 Cc: Wang Yaqiang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: iWeDK3VviueS From: Wang Yaqiang In some videos, SPS will be stored before VPS in hvcC box, parse SPS does not depend on VPS, so the video is expected to be processed normally. Added "parsed_vps" parameter to indicate whether VPS have been parsed. Only VPS have been parsed can be verified during SPS parsing. Signed-off-by: Wang Yaqiang --- libavcodec/hevc_parser.c | 8 ++++++++ libavcodec/hevc_ps.c | 3 +-- libavcodec/hevcdec.c | 9 ++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index 59f9a0ff3e..be4aa55e51 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -85,8 +85,16 @@ static int hevc_parse_slice_header(AVCodecParserContext *s, H2645NAL *nal, } if (ps->sps != (HEVCSPS*)ps->sps_list[ps->pps->sps_id]->data) { ps->sps = (HEVCSPS*)ps->sps_list[ps->pps->sps_id]->data; + if (ps->sps->vps_id >= HEVC_MAX_VPS_COUNT || !ps->vps_list[ps->sps->vps_id]) { + av_log(avctx, AV_LOG_ERROR, "VPS id out of range: %d\n", ps->sps->vps_id); + return AVERROR_INVALIDDATA; + } ps->vps = (HEVCVPS*)ps->vps_list[ps->sps->vps_id]->data; } + if (!ps->vps) { + av_log(avctx, AV_LOG_ERROR, "VPS %d does not exist\n", ps->sps->vps_id); + return AVERROR_INVALIDDATA; + } ow = &ps->sps->output_window; s->coded_width = ps->sps->width; diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c index f665d8053c..9abee8bd90 100644 --- a/libavcodec/hevc_ps.c +++ b/libavcodec/hevc_ps.c @@ -916,9 +916,8 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, sps->vps_id = get_bits(gb, 4); if (vps_list && !vps_list[sps->vps_id]) { - av_log(avctx, AV_LOG_ERROR, "VPS %d does not exist\n", + av_log(avctx, AV_LOG_WARNING, "VPS %d does not exist\n", sps->vps_id); - return AVERROR_INVALIDDATA; } sps->max_sub_layers = get_bits(gb, 3) + 1; diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index fb44d8d3f2..03942a150d 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -327,6 +327,10 @@ static void export_stream_params(HEVCContext *s, const HEVCSPS *sps) { AVCodecContext *avctx = s->avctx; const HEVCParamSets *ps = &s->ps; + if (!s->ps.vps_list[sps->vps_id]) { + av_log(avctx, AV_LOG_ERROR, "VPS id out of range: %d\n", sps->vps_id); + return; + } const HEVCVPS *vps = (const HEVCVPS*)ps->vps_list[sps->vps_id]->data; const HEVCWindow *ow = &sps->output_window; unsigned int num = 0, den = 0; @@ -520,7 +524,10 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps, ret = pic_arrays_init(s, sps); if (ret < 0) goto fail; - + if (!s->ps.vps_list[sps->vps_id]) { + ret = AVERROR_INVALIDDATA; + goto fail; + } export_stream_params(s, sps); s->avctx->pix_fmt = pix_fmt;