qtdemux: add support for VVC/H.266

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5088>
This commit is contained in:
Carlos Bentzen 2023-07-22 01:14:52 +02:00 committed by GStreamer Marge Bot
parent 7faa031e0e
commit a5c6eea957
3 changed files with 79 additions and 0 deletions

View File

@ -54,6 +54,7 @@ G_BEGIN_DECLS
#define FOURCC_FMP4 GST_MAKE_FOURCC('F','M','P','4') #define FOURCC_FMP4 GST_MAKE_FOURCC('F','M','P','4')
#define FOURCC_H264 GST_MAKE_FOURCC('H','2','6','4') #define FOURCC_H264 GST_MAKE_FOURCC('H','2','6','4')
#define FOURCC_H265 GST_MAKE_FOURCC('H','2','6','5') #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_LAGS GST_MAKE_FOURCC('L','A','G','S')
#define FOURCC_MAC3 GST_MAKE_FOURCC('M','A','C','3') #define FOURCC_MAC3 GST_MAKE_FOURCC('M','A','C','3')
#define FOURCC_MAC6 GST_MAKE_FOURCC('M','A','C','6') #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_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_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_xvid GST_MAKE_FOURCC('x','v','i','d')
#define FOURCC_wave GST_MAKE_FOURCC('w','a','v','e') #define FOURCC_wave GST_MAKE_FOURCC('w','a','v','e')
#define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e') #define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e')

View File

@ -9135,6 +9135,9 @@ qtdemux_parse_node (GstQTDemux * qtdemux, GNode * node, const guint8 * buffer,
case FOURCC_dvhe: case FOURCC_dvhe:
case FOURCC_mjp2: case FOURCC_mjp2:
case FOURCC_encv: case FOURCC_encv:
case FOURCC_H266:
case FOURCC_vvc1:
case FOURCC_vvi1:
{ {
guint32 version; guint32 version;
guint32 str_len; guint32 str_len;
@ -13507,6 +13510,62 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak, guint32 * mvhd_matrix)
} }
break; 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_MP4V: case FOURCC_MP4V:
case FOURCC_fmp4: case FOURCC_fmp4:
@ -16882,6 +16941,19 @@ qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
"stream-format", G_TYPE_STRING, "hev1", "stream-format", G_TYPE_STRING, "hev1",
"alignment", G_TYPE_STRING, "au", NULL); "alignment", G_TYPE_STRING, "au", NULL);
break; 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_: case FOURCC_rle_:
_codec ("Run-length encoding"); _codec ("Run-length encoding");
caps = gst_caps_new_simple ("video/x-rle", caps = gst_caps_new_simple ("video/x-rle",

View File

@ -211,6 +211,9 @@ static const QtNodeType qt_node_types[] = {
{FOURCC_dvhe, "HEVC-based Dolby Vision codec derived from hev1 ", 0}, {FOURCC_dvhe, "HEVC-based Dolby Vision codec derived from hev1 ", 0},
{FOURCC_dvh1, "HEVC-based Dolby Vision codec derived from hvc1 ", 0}, {FOURCC_dvh1, "HEVC-based Dolby Vision codec derived from hvc1 ", 0},
{FOURCC_dvcC, "HEVC-based Dolby Vision codec configuration container", 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_tfdt, "Track fragment decode time", 0, qtdemux_dump_tfdt},
{FOURCC_chap, "Chapter Reference"}, {FOURCC_chap, "Chapter Reference"},
{FOURCC_btrt, "Bitrate information", 0}, {FOURCC_btrt, "Bitrate information", 0},