From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id CE5D942112 for ; Sat, 18 Jan 2025 16:35:32 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D0DAE68B3AF; Sat, 18 Jan 2025 18:35:28 +0200 (EET) Received: from xmbghk7.mail.qq.com (xmbghk7.mail.qq.com [43.163.128.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AAEAA68AF22 for ; Sat, 18 Jan 2025 18:35:19 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1737218108; bh=KVyn469MAlVrxVMGcXvq73EyYaL/2bd/6FXxVLFCfWU=; h=From:To:Cc:Subject:Date; b=HKWbdssyImyAY+lk+a1HVMPT3iSGuR3sn02cMlQwonsfwK3i9nZIJEF/Qe8ubLqLr 32FaizvrXHfxr2YoraRWjIB+EaW7WDcE9cgxhxZT52Ao3UuMck09pDBvjyT+DNakLJ r4zNj/ov31dcPwA609xQDw0qyXWLLpWmdGO/cOUk= Received: from ZHILIZHAO-MB1.tencent.com ([240e:3b7:3277:36f0:70d0:8bff:3038:8636]) by newxmesmtplogicsvrszgpua8-1.qq.com (NewEsmtp) with SMTP id 8C794812; Sun, 19 Jan 2025 00:35:07 +0800 X-QQ-mid: xmsmtpt1737218107tp2uq2x0u Message-ID: X-QQ-XMAILINFO: MmF2k1iKcbKmPkUSFhYYRNG4sEuxnJBojUIDvU17aYZzWFpSIJEWyGt3FAkVHQ Z5u4kWIA316TZlBa+Br8S9A1CU9UbqwWMbzLIUh1dIpQKrejciZrjX2sa3/8wYaAHewdXSC/1p97 j37zJCbHGyA8x5tWpZe0QlR8+42k6njqkc/lfM1K49nqEykLGj7S4KgCct0rz8FkHHn3R9JyMwHO srQtrbQ7UFNhumaBv358swyWEUcdjK+mq5Ncn6uvKQ9LkkO8/Af/mI00ldVwPi8juEDV7KysQcfe t7sbchA6E+nIIC5KQSQVtN4S1D1pBfMTMdAzn0R/TvZC71zw0rna7cohSz4lUcdw3I6qS/bMiB+Y sM9FyOe2huiV6/b3ykQYiRcR5egOYRn0gMPON8MoZCjvGwSbFx6oKulre0qhyKKGsc6MhmsbmcoD 5M7sNwtBdt52P1j1R0/YLGVaNBbbuJQxU143daIF/ot5IZaYCyezGDx0g3V/NCNs2PSlWatYioKj Fj7UdntVTOI1aWIvhTRGXQJaoJGkljXqCk+lY8zUUQYz3nwUJ8J6LJmoOJTVlgp/46VojsT8tNdk 5k66ROOQ0e3HS+AFiW+zGiMFadx7s4WDJH2B4pNW7vXbhhfii/fpnF1RewYFCcb9Mw26v/3UJTTf Hpff0MxGp8SAs/MbQsJ1zhMYXpzCmpd6gJ5nG9zdxSICP+n5oCYTyZ1xrKOqDoMT/Vn3NixnTs59 78mnwz5Ac8XbfbksnhJ1Hx3j8eKmFhEAK1CxKheVILz92FKJcjD80dibokUM6Hl32/g00KVgZ3Gg 1QNYtTHEUBpBgbbWA527+66Lw448XEAtlVy66PYk+G7Co1Ep48mvmZGxfg4YZ3ZcV/pnWghd6fx/ KfrSPnYQMHx99uc7HtpMBI3S3pzbWvZXIzXcQ68WUw+5hzG16ogfWZ9I6lB7Alb5jj8i3OY9BLJl +Podq6BVB2rP0IB7YuGg== X-QQ-XMRINFO: MPJ6Tf5t3I/ycC2BItcBVIA= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Sun, 19 Jan 2025 00:35:06 +0800 X-OQ-MSGID: <20250118163506.92254-1-quinkblack@foxmail.com> X-Mailer: git-send-email 2.46.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3] avcodec/vvc: Add support for output_corrupt/showall flags 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: Zhao Zhili Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: From: Zhao Zhili --- v3: Use temporary variable to make the condition check more readable v2: Fix GDR stream libavcodec/vvc/refs.c | 20 +++++++++++++++++++- libavcodec/vvc/refs.h | 1 + 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/libavcodec/vvc/refs.c b/libavcodec/vvc/refs.c index 79b692ac48..aef34da7ab 100644 --- a/libavcodec/vvc/refs.c +++ b/libavcodec/vvc/refs.c @@ -48,6 +48,8 @@ void ff_vvc_unref_frame(VVCFrameContext *fc, VVCFrame *frame, int flags) return; frame->flags &= ~flags; + if (!(frame->flags & ~VVC_FRAME_FLAG_CORRUPT)) + frame->flags = 0; if (!frame->flags) { av_frame_unref(frame->frame); av_refstruct_unref(&frame->sps); @@ -280,6 +282,9 @@ int ff_vvc_output_frame(VVCContext *s, VVCFrameContext *fc, AVFrame *out, const if (nb_output) { VVCFrame *frame = &fc->DPB[min_idx]; + if (frame->flags & VVC_FRAME_FLAG_CORRUPT) + frame->frame->flags |= AV_FRAME_FLAG_CORRUPT; + ret = av_frame_ref(out, frame->frame); if (frame->flags & VVC_FRAME_FLAG_BUMPING) ff_vvc_unref_frame(fc, frame, VVC_FRAME_FLAG_OUTPUT | VVC_FRAME_FLAG_BUMPING); @@ -389,7 +394,7 @@ static VVCFrame *generate_missing_ref(VVCContext *s, VVCFrameContext *fc, int po frame->poc = poc; frame->sequence = s->seq_decode; - frame->flags = 0; + frame->flags = VVC_FRAME_FLAG_CORRUPT; ff_vvc_report_frame_finished(frame); @@ -424,6 +429,19 @@ static int add_candidate_ref(VVCContext *s, VVCFrameContext *fc, RefPicList *lis if (ref == fc->ref || list->nb_refs >= VVC_MAX_REF_ENTRIES) return AVERROR_INVALIDDATA; + if (!IS_CVSS(s)) { + bool ref_corrupt = !ref || (ref->flags & VVC_FRAME_FLAG_CORRUPT); + bool recovering = s->no_output_before_recovery_flag && !GDR_IS_RECOVERED(s); + + if (ref_corrupt && !recovering) { + if (!(s->avctx->flags & AV_CODEC_FLAG_OUTPUT_CORRUPT) && + !(s->avctx->flags2 & AV_CODEC_FLAG2_SHOW_ALL)) + return AVERROR_INVALIDDATA; + + fc->ref->flags |= VVC_FRAME_FLAG_CORRUPT; + } + } + if (!ref) { ref = generate_missing_ref(s, fc, poc); if (!ref) diff --git a/libavcodec/vvc/refs.h b/libavcodec/vvc/refs.h index e2271ab381..a3081a76be 100644 --- a/libavcodec/vvc/refs.h +++ b/libavcodec/vvc/refs.h @@ -29,6 +29,7 @@ #define VVC_FRAME_FLAG_SHORT_REF (1 << 1) #define VVC_FRAME_FLAG_LONG_REF (1 << 2) #define VVC_FRAME_FLAG_BUMPING (1 << 3) +#define VVC_FRAME_FLAG_CORRUPT (1 << 4) int ff_vvc_output_frame(VVCContext *s, VVCFrameContext *fc, struct AVFrame *out, int no_output_of_prior_pics_flag, int flush); void ff_vvc_bump_frame(VVCContext *s, VVCFrameContext *fc); -- 2.46.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".