[FFmpeg-cvslog] avcodec/extract_extradata: add support for H266/VVC

James Almer git at videolan.org
Thu Jun 29 20:36:11 EEST 2023


ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Thu Jun 29 11:16:57 2023 -0300| [136e96a8a896b04724bcb991c5eb2943d101aa51] | committer: James Almer

avcodec/extract_extradata: add support for H266/VVC

Signed-off-by: James Almer <jamrial at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=136e96a8a896b04724bcb991c5eb2943d101aa51
---

 libavcodec/extract_extradata_bsf.c | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/libavcodec/extract_extradata_bsf.c b/libavcodec/extract_extradata_bsf.c
index 329b1a6174..d5c81a2768 100644
--- a/libavcodec/extract_extradata_bsf.c
+++ b/libavcodec/extract_extradata_bsf.c
@@ -31,6 +31,7 @@
 #include "hevc.h"
 #include "startcode.h"
 #include "vc1_common.h"
+#include "vvc.h"
 
 typedef struct ExtractExtradataContext {
     const AVClass *class;
@@ -134,6 +135,9 @@ static int extract_extradata_av1(AVBSFContext *ctx, AVPacket *pkt,
 static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
                                    uint8_t **data, int *size)
 {
+    static const int extradata_nal_types_vvc[] = {
+        VVC_VPS_NUT, VVC_SPS_NUT, VVC_PPS_NUT,
+    };
     static const int extradata_nal_types_hevc[] = {
         HEVC_NAL_VPS, HEVC_NAL_SPS, HEVC_NAL_PPS,
     };
@@ -148,7 +152,10 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
     int nb_extradata_nal_types;
     int i, has_sps = 0, has_vps = 0, ret = 0;
 
-    if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
+    if (ctx->par_in->codec_id == AV_CODEC_ID_VVC) {
+        extradata_nal_types    = extradata_nal_types_vvc;
+        nb_extradata_nal_types = FF_ARRAY_ELEMS(extradata_nal_types_vvc);
+    } else if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
         extradata_nal_types    = extradata_nal_types_hevc;
         nb_extradata_nal_types = FF_ARRAY_ELEMS(extradata_nal_types_hevc);
     } else {
@@ -165,7 +172,10 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
         H2645NAL *nal = &s->h2645_pkt.nals[i];
         if (val_in_array(extradata_nal_types, nb_extradata_nal_types, nal->type)) {
             extradata_size += nal->raw_size + 3;
-            if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
+            if (ctx->par_in->codec_id == AV_CODEC_ID_VVC) {
+                if (nal->type == VVC_SPS_NUT) has_sps = 1;
+                if (nal->type == VVC_VPS_NUT) has_vps = 1;
+            } else if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
                 if (nal->type == HEVC_NAL_SPS) has_sps = 1;
                 if (nal->type == HEVC_NAL_VPS) has_vps = 1;
             } else {
@@ -177,7 +187,8 @@ static int extract_extradata_h2645(AVBSFContext *ctx, AVPacket *pkt,
     }
 
     if (extradata_size &&
-        ((ctx->par_in->codec_id == AV_CODEC_ID_HEVC && has_sps && has_vps) ||
+        ((ctx->par_in->codec_id == AV_CODEC_ID_VVC  && has_sps) ||
+         (ctx->par_in->codec_id == AV_CODEC_ID_HEVC && has_sps && has_vps) ||
          (ctx->par_in->codec_id == AV_CODEC_ID_H264 && has_sps))) {
         AVBufferRef *filtered_buf = NULL;
         PutByteContext pb_filtered_data, pb_extradata;
@@ -335,6 +346,7 @@ static const struct {
     { AV_CODEC_ID_MPEG2VIDEO, extract_extradata_mpeg12  },
     { AV_CODEC_ID_MPEG4,      extract_extradata_mpeg4   },
     { AV_CODEC_ID_VC1,        extract_extradata_vc1     },
+    { AV_CODEC_ID_VVC,        extract_extradata_h2645   },
 };
 
 static int extract_extradata_init(AVBSFContext *ctx)
@@ -404,6 +416,7 @@ static const enum AVCodecID codec_ids[] = {
     AV_CODEC_ID_MPEG2VIDEO,
     AV_CODEC_ID_MPEG4,
     AV_CODEC_ID_VC1,
+    AV_CODEC_ID_VVC,
     AV_CODEC_ID_NONE,
 };
 



More information about the ffmpeg-cvslog mailing list