From patchwork Fri Feb 10 23:29:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marton Balint X-Patchwork-Id: 40360 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:5494:b0:bf:7b3a:fd32 with SMTP id i20csp1772614pzk; Fri, 10 Feb 2023 15:30:20 -0800 (PST) X-Google-Smtp-Source: AK7set+xq2Qr4kA3jbcw3yt3H8fuMTE0O4HhbP1i6XVl/6loUnC6Ij8FKFYbfjRv3FynMmMSg4Jd X-Received: by 2002:a50:d681:0:b0:4ab:4938:f52b with SMTP id r1-20020a50d681000000b004ab4938f52bmr3535154edi.40.1676071820280; Fri, 10 Feb 2023 15:30:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1676071820; cv=none; d=google.com; s=arc-20160816; b=XpVOwwlmS+xgbwL6STDwDYdr3xNt0C2zpvmWs6UatCdwpMRnGfaqBCGSHRZaUFYHek UYuPE34Nq3AXiAtzVNAsL2iUGIpAB2rDs49WOXbrpiaVO2r2qSo2w1BV+u5vEQip6cIe QeDSiVlFXLOyNaSvJCyfm6BpbTJqWzrUTJuRydXAemPMnnoOefVl9dYt2fm4MK8ghkoC /EuvmRagzjojfCezYnM2ICa2gIt9Z5UXeEWejB/oXniqYUYswSF6Ng6RGERXKUQWB0/A 3qQVchJlB8uiraSAQ7p9FB3D5+gtltrTkUQ270VC4zF52L8jXQ5eS9cdmqww7iNsujuR WB4Q== 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 :message-id:date:to:from:delivered-to; bh=93HzN+oSLsGgnF33ciW6YlgFgadkK+FuToZdtrPMgNk=; b=fZKTBKTCXY3PBufp9+6lN+RdyCY+nMZTLGblzCZB09sgpjYRfhkhMBX8M6BXpA56rY 0syff2LFIG+glbBvHkqQXuONfs1Itj5rCRcxZwbVpua76loYI3IT+ISzNdmrjNAOXlrs 00GdLjMnwDdpSLatk1qytcSZl9RBmHZM2TdNvFNlPc/bnaMT07kTjO6pcdwdnEpvesGT NyZt71vLozuIueVtvyiXn05ziZrHq4lN44JASoHlSCgqytV3h/rST/2twX6PBfsT7Sqi mewfuRjBIo7MUdXSYctDyrjmxwBF/KsdWyu+2Op4kDJQ8ZtRSpm9v5TDj5tqMqGOWu+z sQTw== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id g6-20020aa7c586000000b004a1ae25417asi6621483edq.415.2023.02.10.15.30.12; Fri, 10 Feb 2023 15:30:20 -0800 (PST) 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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 262FC68BCEC; Sat, 11 Feb 2023 01:30:09 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from iq.passwd.hu (iq.passwd.hu [217.27.212.140]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 85403680A8D for ; Sat, 11 Feb 2023 01:30:02 +0200 (EET) Received: from localhost (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 0AB4CE7432; Sat, 11 Feb 2023 00:30:00 +0100 (CET) X-Virus-Scanned: amavisd-new at passwd.hu Received: from iq.passwd.hu ([127.0.0.1]) by localhost (iq.passwd.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DDB7n0KifhIc; Sat, 11 Feb 2023 00:29:56 +0100 (CET) Received: from bluegene.passwd.hu (localhost [127.0.0.1]) by iq.passwd.hu (Postfix) with ESMTP id 23EA6E879C; Sat, 11 Feb 2023 00:29:56 +0100 (CET) From: Marton Balint To: ffmpeg-devel@ffmpeg.org Date: Sat, 11 Feb 2023 00:29:11 +0100 Message-Id: <20230210232913.8763-2-cus@passwd.hu> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20230210232913.8763-1-cus@passwd.hu> References: <20230128181523.9837-1-cus@passwd.hu> <20230210232913.8763-1-cus@passwd.hu> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 2/4] avcodec/diracdec: do not use AVFrame.display_picture_number for decoding 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: Marton Balint Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 7nVBkIQ8HpNw Signed-off-by: Marton Balint --- libavcodec/diracdec.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c index a5cad29597..22a2925188 100644 --- a/libavcodec/diracdec.c +++ b/libavcodec/diracdec.c @@ -77,6 +77,7 @@ typedef struct { uint8_t *hpel[3][4]; uint8_t *hpel_base[3][4]; int reference; + unsigned picture_number; } DiracFrame; typedef struct { @@ -252,13 +253,13 @@ static inline int divide3(int x) return (int)((x+1U)*21845 + 10922) >> 16; } -static DiracFrame *remove_frame(DiracFrame *framelist[], int picnum) +static DiracFrame *remove_frame(DiracFrame *framelist[], unsigned picnum) { DiracFrame *remove_pic = NULL; int i, remove_idx = -1; for (i = 0; framelist[i]; i++) - if (framelist[i]->avframe->display_picture_number == picnum) { + if (framelist[i]->picture_number == picnum) { remove_pic = framelist[i]; remove_idx = i; } @@ -2002,7 +2003,7 @@ static int dirac_decode_picture_header(DiracContext *s) GetBitContext *gb = &s->gb; /* [DIRAC_STD] 11.1.1 Picture Header. picture_header() PICTURE_NUM */ - picnum = s->current_picture->avframe->display_picture_number = get_bits_long(gb, 32); + picnum = s->current_picture->picture_number = get_bits_long(gb, 32); av_log(s->avctx,AV_LOG_DEBUG,"PICTURE_NUM: %d\n",picnum); @@ -2021,9 +2022,9 @@ static int dirac_decode_picture_header(DiracContext *s) /* Jordi: this is needed if the referenced picture hasn't yet arrived */ for (j = 0; j < MAX_REFERENCE_FRAMES && refdist; j++) if (s->ref_frames[j] - && FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum) < refdist) { + && FFABS(s->ref_frames[j]->picture_number - refnum) < refdist) { s->ref_pics[i] = s->ref_frames[j]; - refdist = FFABS(s->ref_frames[j]->avframe->display_picture_number - refnum); + refdist = FFABS(s->ref_frames[j]->picture_number - refnum); } if (!s->ref_pics[i] || refdist) @@ -2062,7 +2063,7 @@ static int dirac_decode_picture_header(DiracContext *s) /* if reference array is full, remove the oldest as per the spec */ while (add_frame(s->ref_frames, MAX_REFERENCE_FRAMES, s->current_picture)) { av_log(s->avctx, AV_LOG_ERROR, "Reference frame overflow\n"); - remove_frame(s->ref_frames, s->ref_frames[0]->avframe->display_picture_number)->reference &= DELAYED_PIC_REF; + remove_frame(s->ref_frames, s->ref_frames[0]->picture_number)->reference &= DELAYED_PIC_REF; } } @@ -2090,7 +2091,7 @@ static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame) /* find frame with lowest picture number */ for (i = 1; s->delay_frames[i]; i++) - if (s->delay_frames[i]->avframe->display_picture_number < out->avframe->display_picture_number) { + if (s->delay_frames[i]->picture_number < out->picture_number) { out = s->delay_frames[i]; out_idx = i; } @@ -2102,6 +2103,7 @@ static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame) out->reference ^= DELAYED_PIC_REF; if((ret = av_frame_ref(picture, out->avframe)) < 0) return ret; + picture->display_picture_number = out->picture_number; *got_frame = 1; } @@ -2318,19 +2320,19 @@ static int dirac_decode_frame(AVCodecContext *avctx, AVFrame *picture, if (!s->current_picture) return buf_size; - if (s->current_picture->avframe->display_picture_number > s->frame_number) { + if (s->current_picture->picture_number > s->frame_number) { DiracFrame *delayed_frame = remove_frame(s->delay_frames, s->frame_number); s->current_picture->reference |= DELAYED_PIC_REF; if (add_frame(s->delay_frames, MAX_DELAY, s->current_picture)) { - int min_num = s->delay_frames[0]->avframe->display_picture_number; + unsigned min_num = s->delay_frames[0]->picture_number; /* Too many delayed frames, so we display the frame with the lowest pts */ av_log(avctx, AV_LOG_ERROR, "Delay frame overflow\n"); for (i = 1; s->delay_frames[i]; i++) - if (s->delay_frames[i]->avframe->display_picture_number < min_num) - min_num = s->delay_frames[i]->avframe->display_picture_number; + if (s->delay_frames[i]->picture_number < min_num) + min_num = s->delay_frames[i]->picture_number; delayed_frame = remove_frame(s->delay_frames, min_num); add_frame(s->delay_frames, MAX_DELAY, s->current_picture); @@ -2340,18 +2342,19 @@ static int dirac_decode_frame(AVCodecContext *avctx, AVFrame *picture, delayed_frame->reference ^= DELAYED_PIC_REF; if((ret = av_frame_ref(picture, delayed_frame->avframe)) < 0) return ret; + s->frame_number = delayed_frame->picture_number + 1LL; + picture->display_picture_number = delayed_frame->picture_number; *got_frame = 1; } - } else if (s->current_picture->avframe->display_picture_number == s->frame_number) { + } else if (s->current_picture->picture_number == s->frame_number) { /* The right frame at the right time :-) */ if((ret = av_frame_ref(picture, s->current_picture->avframe)) < 0) return ret; + s->frame_number = s->current_picture->picture_number + 1LL; + picture->display_picture_number = s->current_picture->picture_number; *got_frame = 1; } - if (*got_frame) - s->frame_number = picture->display_picture_number + 1LL; - return buf_idx; }