qtdemux: add support for VVC/H.266
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5088>
This commit is contained in:
parent
7faa031e0e
commit
a5c6eea957
@ -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')
|
||||
|
@ -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",
|
||||
|
@ -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},
|
||||
|
Loading…
x
Reference in New Issue
Block a user