diff --git a/subprojects/gst-plugins-good/gst/isomp4/fourcc.h b/subprojects/gst-plugins-good/gst/isomp4/fourcc.h index 2736afb4f1..6254c3d472 100644 --- a/subprojects/gst-plugins-good/gst/isomp4/fourcc.h +++ b/subprojects/gst-plugins-good/gst/isomp4/fourcc.h @@ -54,6 +54,7 @@ G_BEGIN_DECLS #define FOURCC_FMP4 GST_MAKE_FOURCC('F','M','P','4') #define FOURCC_H264 GST_MAKE_FOURCC('H','2','6','4') #define FOURCC_H265 GST_MAKE_FOURCC('H','2','6','5') +#define FOURCC_H266 GST_MAKE_FOURCC('H','2','6','6') #define FOURCC_LAGS GST_MAKE_FOURCC('L','A','G','S') #define FOURCC_MAC3 GST_MAKE_FOURCC('M','A','C','3') #define FOURCC_MAC6 GST_MAKE_FOURCC('M','A','C','6') @@ -296,6 +297,9 @@ G_BEGIN_DECLS #define FOURCC_vttc GST_MAKE_FOURCC('v','t','t','c') #define FOURCC_vttC GST_MAKE_FOURCC('v','t','t','C') #define FOURCC_vtte GST_MAKE_FOURCC('v','t','t','e') +#define FOURCC_vvc1 GST_MAKE_FOURCC('v','v','c','1') +#define FOURCC_vvcC GST_MAKE_FOURCC('v','v','c','C') +#define FOURCC_vvi1 GST_MAKE_FOURCC('v','v','i','1') #define FOURCC_xvid GST_MAKE_FOURCC('x','v','i','d') #define FOURCC_wave GST_MAKE_FOURCC('w','a','v','e') #define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e') diff --git a/subprojects/gst-plugins-good/gst/isomp4/qtdemux.c b/subprojects/gst-plugins-good/gst/isomp4/qtdemux.c index 5c8f1bf0d6..75d60cc49f 100644 --- a/subprojects/gst-plugins-good/gst/isomp4/qtdemux.c +++ b/subprojects/gst-plugins-good/gst/isomp4/qtdemux.c @@ -9135,6 +9135,9 @@ qtdemux_parse_node (GstQTDemux * qtdemux, GNode * node, const guint8 * buffer, case FOURCC_dvhe: case FOURCC_mjp2: case FOURCC_encv: + case FOURCC_H266: + case FOURCC_vvc1: + case FOURCC_vvi1: { guint32 version; guint32 str_len; @@ -13507,6 +13510,62 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak, guint32 * mvhd_matrix) } break; } + case FOURCC_H266: + case FOURCC_vvc1: + case FOURCC_vvi1: + { + guint len = QT_UINT32 (stsd_entry_data); + len = len <= 0x56 ? 0 : len - 0x56; + const guint8 *vvc_data = stsd_entry_data + 0x56; + + /* find vvcC, which is a FullBox. */ + while (len >= 12) { + guint size = QT_UINT32 (vvc_data); + + if (size < 12 || size > len) + break; + + switch (QT_FOURCC (vvc_data + 4)) { + case FOURCC_vvcC: + { + /* parse, if found */ + GstBuffer *buf; + guint8 version; + + if (size < 12 + 1) + break; + + GST_DEBUG_OBJECT (qtdemux, "found vvcC codec_data in stsd"); + + /* First 4 bytes are the length of the atom, the next 4 bytes + * are the fourcc, the next 1 byte is the version, the next 3 bytes are flags and the + * subsequent bytes are the decoder configuration record. */ + version = vvc_data[8]; + if (version != 0) { + GST_ERROR_OBJECT (qtdemux, + "Unsupported vvcC version %u. Only version 0 is supported", + version); + break; + } + + gst_codec_utils_h266_caps_set_level_tier_and_profile + (entry->caps, vvc_data + 12, size - 12); + + buf = gst_buffer_new_and_alloc (size - 12); + gst_buffer_fill (buf, 0, vvc_data + 12, size - 12); + gst_caps_set_simple (entry->caps, + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + break; + } + default: + break; + } + len -= size; + vvc_data += size; + } + break; + } case FOURCC_mp4v: case FOURCC_MP4V: case FOURCC_fmp4: @@ -16882,6 +16941,19 @@ qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, "stream-format", G_TYPE_STRING, "hev1", "alignment", G_TYPE_STRING, "au", NULL); break; + case FOURCC_H266: + case FOURCC_vvc1: + _codec ("H.266 / VVC"); + caps = gst_caps_new_simple ("video/x-h266", + "stream-format", G_TYPE_STRING, "vvc1", + "alignment", G_TYPE_STRING, "au", NULL); + break; + case FOURCC_vvi1: + _codec ("H.266 / VVC"); + caps = gst_caps_new_simple ("video/x-h266", + "stream-format", G_TYPE_STRING, "vvi1", + "alignment", G_TYPE_STRING, "au", NULL); + break; case FOURCC_rle_: _codec ("Run-length encoding"); caps = gst_caps_new_simple ("video/x-rle", diff --git a/subprojects/gst-plugins-good/gst/isomp4/qtdemux_types.c b/subprojects/gst-plugins-good/gst/isomp4/qtdemux_types.c index af9b77b6d3..a3daab0b7b 100644 --- a/subprojects/gst-plugins-good/gst/isomp4/qtdemux_types.c +++ b/subprojects/gst-plugins-good/gst/isomp4/qtdemux_types.c @@ -211,6 +211,9 @@ static const QtNodeType qt_node_types[] = { {FOURCC_dvhe, "HEVC-based Dolby Vision codec derived from hev1 ", 0}, {FOURCC_dvh1, "HEVC-based Dolby Vision codec derived from hvc1 ", 0}, {FOURCC_dvcC, "HEVC-based Dolby Vision codec configuration container", 0}, + {FOURCC_vvc1, "VVC codec configuration", 0}, + {FOURCC_vvi1, "VVC codec configuration", 0}, + {FOURCC_vvcC, "VVC codec configuration container", 0}, {FOURCC_tfdt, "Track fragment decode time", 0, qtdemux_dump_tfdt}, {FOURCC_chap, "Chapter Reference"}, {FOURCC_btrt, "Bitrate information", 0},