[FFmpeg-devel] [PATCH v2] lavc/vvc/refs: export keyframe and picture type in output frames
Rubén Gonzalez
rgonzalez at fluendo.com
Mon Jan 13 23:03:14 EET 2025
+1 to this improved implementation.
I tested with all vectors from the test suite JVET-VVC_draft6 using fluster
[1]
[1] https://github.com/fluendo/fluster/
On Sun, Jan 12, 2025 at 4:34 AM Nuo Mi <nuomi2021 at gmail.com> wrote:
> Tested with:
> ```
> wget
> https://www.itu.int/wftp3/av-arch/jvet-site/bitstream_exchange/VVC/draft_conformance/draft6/CodingToolsSets_E_Tencent_1.zip
> unzip CodingToolsSets_E_Tencent_1.zip CodingToolsSets_E_Tencent_1.bit
> ffprobe -hide_banner CodingToolsSets_E_Tencent_1.bit -select_streams v
> -show_frames -show_entries frame=pict_type,key_frame -of csv
> ```
>
> From
> ```
> frame,0,?
> frame,0,?
> frame,0,?
> frame,0,?
> frame,0,?
> frame,0,?
> frame,0,?
> frame,0,?
> frame,0,?
> ```
>
> To:
> ```
> frame,1,I
> frame,0,B
> frame,0,B
> frame,0,B
> frame,0,B
> frame,0,B
> frame,0,B
> frame,0,P
> frame,0,B
> ```
>
> fixes https://trac.ffmpeg.org/ticket/11406
>
> Co-authored-by: Ruben Gonzalez <rgonzalez at fluendo.com>
> ---
> libavcodec/vvc/refs.c | 32 ++++++++++++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/libavcodec/vvc/refs.c b/libavcodec/vvc/refs.c
> index bc3b3d0d13..79b692ac48 100644
> --- a/libavcodec/vvc/refs.c
> +++ b/libavcodec/vvc/refs.c
> @@ -21,6 +21,7 @@
> */
>
> #include <stdatomic.h>
> +#include <stdbool.h>
>
> #include "libavutil/mem.h"
> #include "libavutil/thread.h"
> @@ -168,6 +169,36 @@ fail:
> return NULL;
> }
>
> +static void set_pict_type(AVFrame *frame, const VVCContext *s, const
> VVCFrameContext *fc)
> +{
> + bool has_b = false, has_inter = false;
> +
> + if (IS_IRAP(s)) {
> + frame->pict_type = AV_PICTURE_TYPE_I;
> + frame->flags |= AV_FRAME_FLAG_KEY;
> + return;
> + }
> +
> + if (fc->ps.ph.r->ph_inter_slice_allowed_flag) {
> + // At this point, fc->slices is not fully initialized; we need to
> inspect the CBS directly.
> + const CodedBitstreamFragment *current = &s->current_frame;
> + for (int i = 0; i < current->nb_units && !has_b; i++) {
> + const CodedBitstreamUnit *unit = current->units + i;
> + if (unit->type <= VVC_RSV_IRAP_11) {
> + const H266RawSliceHeader *rsh = unit->content_ref;
> + has_inter |= !IS_I(rsh);
> + has_b |= IS_B(rsh);
> + }
> + }
> + }
> + if (!has_inter)
> + frame->pict_type = AV_PICTURE_TYPE_I;
> + else if (has_b)
> + frame->pict_type = AV_PICTURE_TYPE_B;
> + else
> + frame->pict_type = AV_PICTURE_TYPE_P;
> +}
> +
> int ff_vvc_set_new_ref(VVCContext *s, VVCFrameContext *fc, AVFrame
> **frame)
> {
> const VVCPH *ph= &fc->ps.ph;
> @@ -189,6 +220,7 @@ int ff_vvc_set_new_ref(VVCContext *s, VVCFrameContext
> *fc, AVFrame **frame)
> if (!ref)
> return AVERROR(ENOMEM);
>
> + set_pict_type(ref->frame, s, fc);
> *frame = ref->frame;
> fc->ref = ref;
>
> --
> 2.34.1
>
>
--
More information about the ffmpeg-devel
mailing list