[FFmpeg-devel] [PATCH] avcodec/vvc: Add support for output_corrupt/showall flags

Zhao Zhili quinkblack at foxmail.com
Wed Jan 15 16:02:36 EET 2025



> On Jan 15, 2025, at 21:19, Nuo Mi <nuomi2021 at gmail.com> wrote:
> 
> On Mon, Jan 13, 2025 at 4:46 PM Zhao Zhili <
> quinkblack-at-foxmail.com at ffmpeg.org> wrote:
> 
>> From: Zhao Zhili <zhilizhao at tencent.com>
>> 
>> Hi Zhili,
> Thank you for the patch.
> 
> This will fail on GDR clips, such as:
>    GDR_B_NOKIA_2.bit
>    GDR_C_NOKIA_2.bit

+    if (!IS_CVSS(s) && (!ref || ref->flags & VVC_FRAME_FLAG_CORRUPT))

The condition already takes GDR into consideration, so it never be marked as corrupted.

> 
> By design, a GDR frame refers to missing frames and gradually refreshes the
> entire frame.
> See
> https://www.nokia.com/blog/fast-forwarding-video-takes-more-than-a-swipe/
> 
> ---
>> libavcodec/vvc/refs.c | 16 +++++++++++++++-
>> libavcodec/vvc/refs.h |  1 +
>> 2 files changed, 16 insertions(+), 1 deletion(-)
>> 
>> diff --git a/libavcodec/vvc/refs.c b/libavcodec/vvc/refs.c
>> index bc3b3d0d13..a204e7d800 100644
>> --- a/libavcodec/vvc/refs.c
>> +++ b/libavcodec/vvc/refs.c
>> @@ -47,6 +47,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);
>> @@ -248,6 +250,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);
>> @@ -357,7 +362,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);
>> 
>> @@ -392,6 +397,15 @@ 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) && (!ref || ref->flags & VVC_FRAME_FLAG_CORRUPT)) {
>> +        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 at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> 
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".



More information about the ffmpeg-devel mailing list