From patchwork Thu Aug 12 01:24:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 29443 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:8e8b:0:0:0:0:0 with SMTP id q133csp296530iod; Wed, 11 Aug 2021 18:25:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzPk47MUn/0ZwftkkWvAmFqfXLBsiTrLyjoUg/StUbnsQq/5pP4JugP6hYcQL24RogJjZSC X-Received: by 2002:a17:906:3948:: with SMTP id g8mr1272341eje.282.1628731528822; Wed, 11 Aug 2021 18:25:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628731528; cv=none; d=google.com; s=arc-20160816; b=BxFDxevtWzC1JJ1pdh/xp1e2aDg1GRyFeCrPYL5cAeBXfqOxYD7Ilw96ds/ibuNdzI Qi13Q5G+zRduOBxRwFpnPxD7Q/PdzJGybEMglfCvba8gCbDkm6ou57vQDPDjncRcPBJE gN9lDN0E4QKJqyRvip+5GAqjykKoRiH4dTXGruPaiuPr6z0dzq0yaaFHjsf/jCN508X7 uo4f4QtGNFV7iU8caQn6Fl5YQUz3zOywxQS5GFReks7HwKEJMqjdQdGi/HWXwtWu7JiP eErMwmSWzsDHml9TCURUrPRdrn2bQKrK0EcbzZUJA/oOO6UWNvrzt9ttX9CqGJVsCCa8 7h9g== 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:message-id:date:to:from :dkim-signature:delivered-to; bh=aMWWvZ28NO9jCJhKg0c16PdqeaycegZPq7gWi+2wctw=; b=vzW+dtnk9B37cMYtS0JH4p2uQ5mdtDXS/yqfZmzgBu1vqRslCzmstUOBCQz1DSYXPP WRloV6TXQdogs7R6It1q3YU+adF4V6/w+2+S4VWHJpyqj/ucUE4YBwIKfNcA5MgzkXYs DXpcvncrrRi0sWI0YE5V01qpCHu6yNBvFjxO1W56LsIjLY3vc2c9E61iMGAZP7r+M2b3 mm6+WAEmF6uSwtg619oPPcRsfqELJx4jovvAxg1hejCY56Dmji/TzOM9nEBIC6aP12ED cssyIrSutvoqJGHhf0E/ShWNUhpF0ncFCULA9lwJ3KORfG6UDvp9a7/sUtfPqTb5z6jm wuCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=U3PujJ+s; 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 h14si1081922edr.501.2021.08.11.18.25.27; Wed, 11 Aug 2021 18:25:28 -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=U3PujJ+s; 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 42D7D68A318; Thu, 12 Aug 2021 04:25:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 88B1468041C for ; Thu, 12 Aug 2021 04:25:18 +0300 (EEST) Received: by mail-pl1-f175.google.com with SMTP id a5so5109400plh.5 for ; Wed, 11 Aug 2021 18:25:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=Fk/CHM/jax66XEgn8luLF6WOZLbsftCeLLi/V0N5WHE=; b=U3PujJ+sQBSgLOmcTRZ0KBznCWCzKvfGhr99S+AuBS4D+Ow9RzJ0ZyW8Aa0Nd78QVi Mp/eMiInSlWVhSwOV3/a+BTZYoA7goild7+bHW0IPlY/HvMjK2rVbFGfZXwagwemhwHu TRaAAl/4kAAnVJwHvehKlT889ngDo78Lwr/6bqhgMRySqA9bEP1MQVoiSfiwQjGvA7lN hlIeZcTH62F1L/Fql6wNmwu5w8/pilZFHCpO/JISwMj1AenzAknZLyn/DEWkrqgRQI4J Xs36NQ31jDb0RqeCVJe4h0AAhGHgpnd8r937PR7UqbPLtgo/uER1FXkEfKaf+Md9v4qo Bh4A== 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:mime-version :content-transfer-encoding; bh=Fk/CHM/jax66XEgn8luLF6WOZLbsftCeLLi/V0N5WHE=; b=jDCaB9g4v3CWhDizYM5iYDhSRufmJu7GNb0ztQ9mv0ml48vsMpVre8DNFgBb4CALVZ VxuczwfM9wYb7wrneVe4YWKgnIDC2WrnIdUR2/PScz7ITp1sgxyG0cf5tOyfsBkjdBDA PIzTwblMLwOGn82h62D8Rt9ze5iol6FWTWqSsDPMX2EVkD6801lstwQ0syrrJ2Z9tzI9 LNAFoMDv4EzlXgfWnqTF8xnp0FByEGLpJbCvSSjD/UP9JAjo5MlKv5GKrBeyT9JKWQvO qfNuIMG65Us5hTteIQxcRqpFHJlqF3tcOlaXMnV4Lq2v86U0zMWrOaNKTEkDnAjmqeOa UF5g== X-Gm-Message-State: AOAM531geu9H2/R9iDztHqrc1bhdPmZAJpU5iunejUoVRLmUQqt2wTiB aH7EUcEArntgbxOP7ZfUD3gj9BByv3I= X-Received: by 2002:a65:6704:: with SMTP id u4mr1502467pgf.40.1628731516469; Wed, 11 Aug 2021 18:25:16 -0700 (PDT) Received: from localhost.localdomain ([191.84.236.172]) by smtp.gmail.com with ESMTPSA id q18sm880407pfj.178.2021.08.11.18.25.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Aug 2021 18:25:16 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 11 Aug 2021 22:24:54 -0300 Message-Id: <20210812012454.10595-1-jamrial@gmail.com> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/h264_parse: add some missing checks to ff_h264_init_poc() 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: 7IWzWDo9Paqx poc.delta_poc_bottom and poc.delta_poc[1] are only coded in the bitstream if pps->pic_order_present is true, so ensure they are not used otherwise, to prevent the potential use of stale values. Signed-off-by: James Almer --- This complements ce4a31cd1ff0348d279af74d49556d0315171e94, and is a more thorough fix for the issue described in it, affecting all users of ff_h264_init_poc(), like the parser, and not just the decoder. libavcodec/h264_parse.c | 7 ++++--- libavcodec/h264_parse.h | 2 +- libavcodec/h264_parser.c | 2 +- libavcodec/h264_slice.c | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libavcodec/h264_parse.c b/libavcodec/h264_parse.c index 1c1d1c04b0..5d642c7201 100644 --- a/libavcodec/h264_parse.c +++ b/libavcodec/h264_parse.c @@ -275,9 +275,10 @@ fail: } int ff_h264_init_poc(int pic_field_poc[2], int *pic_poc, - const SPS *sps, H264POCContext *pc, + const PPS *pps, H264POCContext *pc, int picture_structure, int nal_ref_idc) { + const SPS *sps = pps->sps; const int max_frame_num = 1 << sps->log2_max_frame_num; int64_t field_poc[2]; @@ -300,7 +301,7 @@ int ff_h264_init_poc(int pic_field_poc[2], int *pic_poc, pc->poc_msb = pc->prev_poc_msb; field_poc[0] = field_poc[1] = pc->poc_msb + pc->poc_lsb; - if (picture_structure == PICT_FRAME) + if (pps->pic_order_present && picture_structure == PICT_FRAME) field_poc[1] += pc->delta_poc_bottom; } else if (sps->poc_type == 1) { int abs_frame_num; @@ -336,7 +337,7 @@ int ff_h264_init_poc(int pic_field_poc[2], int *pic_poc, field_poc[0] = expectedpoc + pc->delta_poc[0]; field_poc[1] = field_poc[0] + sps->offset_for_top_to_bottom_field; - if (picture_structure == PICT_FRAME) + if (pps->pic_order_present && picture_structure == PICT_FRAME) field_poc[1] += pc->delta_poc[1]; } else { int poc = 2 * (pc->frame_num_offset + pc->frame_num); diff --git a/libavcodec/h264_parse.h b/libavcodec/h264_parse.h index 4d01620125..35c4810f34 100644 --- a/libavcodec/h264_parse.h +++ b/libavcodec/h264_parse.h @@ -78,7 +78,7 @@ int ff_h264_parse_ref_count(int *plist_count, int ref_count[2], int slice_type_nos, int picture_structure, void *logctx); int ff_h264_init_poc(int pic_field_poc[2], int *pic_poc, - const SPS *sps, H264POCContext *poc, + const PPS *pps, H264POCContext *poc, int picture_structure, int nal_ref_idc); int ff_h264_decode_extradata(const uint8_t *data, int size, H264ParamSets *ps, diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c index d3c56cc188..6e2e7cde67 100644 --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@ -440,7 +440,7 @@ static inline int parse_nal_units(AVCodecParserContext *s, /* Decode POC of this picture. * The prev_ values needed for decoding POC of the next picture are not set here. */ field_poc[0] = field_poc[1] = INT_MAX; - ret = ff_h264_init_poc(field_poc, &s->output_picture_number, sps, + ret = ff_h264_init_poc(field_poc, &s->output_picture_number, p->ps.pps, &p->poc, p->picture_structure, nal.ref_idc); if (ret < 0) goto fail; diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c index 0d7107d455..223cf21267 100644 --- a/libavcodec/h264_slice.c +++ b/libavcodec/h264_slice.c @@ -1742,7 +1742,7 @@ static int h264_field_start(H264Context *h, const H264SliceContext *sl, } ret = ff_h264_init_poc(h->cur_pic_ptr->field_poc, &h->cur_pic_ptr->poc, - h->ps.sps, &h->poc, h->picture_structure, nal->ref_idc); + h->ps.pps, &h->poc, h->picture_structure, nal->ref_idc); if (ret < 0) return ret;