mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 05:06:17 +00:00
qtdemux: Add initial support for AV1 demuxing
Following the spec at https://aomediacodec.github.io/av1-isobmff/
This commit is contained in:
parent
f067b50dd6
commit
b6e8c6323e
4 changed files with 55 additions and 0 deletions
|
@ -264,6 +264,7 @@ G_BEGIN_DECLS
|
||||||
#define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e')
|
#define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e')
|
||||||
#define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b')
|
#define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b')
|
||||||
#define FOURCC_lpcm GST_MAKE_FOURCC('l','p','c','m')
|
#define FOURCC_lpcm GST_MAKE_FOURCC('l','p','c','m')
|
||||||
|
#define FOURCC_av01 GST_MAKE_FOURCC('a','v','0','1')
|
||||||
|
|
||||||
#define FOURCC_cfhd GST_MAKE_FOURCC('C','F','H','D')
|
#define FOURCC_cfhd GST_MAKE_FOURCC('C','F','H','D')
|
||||||
#define FOURCC_ap4x GST_MAKE_FOURCC('a','p','4','x')
|
#define FOURCC_ap4x GST_MAKE_FOURCC('a','p','4','x')
|
||||||
|
|
|
@ -14651,6 +14651,10 @@ qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
|
||||||
caps = gst_caps_new_simple ("video/x-wmv",
|
caps = gst_caps_new_simple ("video/x-wmv",
|
||||||
"wmvversion", G_TYPE_INT, 3, "format", G_TYPE_STRING, "WVC1", NULL);
|
"wmvversion", G_TYPE_INT, 3, "format", G_TYPE_STRING, "WVC1", NULL);
|
||||||
break;
|
break;
|
||||||
|
case FOURCC_av01:
|
||||||
|
_codec ("AV1");
|
||||||
|
caps = gst_caps_new_empty_simple ("video/x-av1");
|
||||||
|
break;
|
||||||
case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'):
|
case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'):
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
|
|
@ -303,6 +303,51 @@ qtdemux_dump_stsd_avc1 (GstQTDemux * qtdemux, GstByteReader * data, guint size,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
qtdemux_dump_stsd_av01 (GstQTDemux * qtdemux, GstByteReader * data, guint size,
|
||||||
|
int depth)
|
||||||
|
{
|
||||||
|
guint compressor_len;
|
||||||
|
char compressor_name[32];
|
||||||
|
|
||||||
|
/* Size of av01 = 78 bytes */
|
||||||
|
if (size < (6 + 2 + 4 + 12 + 2 + 2 + 4 + 4 + 4 + 2 + 1 + 31 + 2 + 2))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
gst_byte_reader_skip_unchecked (data, 6);
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s data reference:%d", depth, "",
|
||||||
|
GET_UINT16 (data));
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s version/rev.: %08x", depth, "",
|
||||||
|
GET_UINT32 (data));
|
||||||
|
gst_byte_reader_skip_unchecked (data, 12); /* pre-defined & reserved */
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s width: %u", depth, "",
|
||||||
|
GET_UINT16 (data));
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s height: %u", depth, "",
|
||||||
|
GET_UINT16 (data));
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s horiz. resol: %g", depth, "",
|
||||||
|
GET_FP32 (data));
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s vert. resol.: %g", depth, "",
|
||||||
|
GET_FP32 (data));
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s data size: %u", depth, "",
|
||||||
|
GET_UINT32 (data));
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s frame count: %u", depth, "",
|
||||||
|
GET_UINT16 (data));
|
||||||
|
/* something is not right with this, it's supposed to be a string but it's
|
||||||
|
* not apparently, so just skip this for now */
|
||||||
|
compressor_len = MAX (GET_UINT8 (data), 31);
|
||||||
|
memcpy (compressor_name, gst_byte_reader_get_data_unchecked (data, 31), 31);
|
||||||
|
compressor_name[compressor_len] = 0;
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s compressor: %s", depth, "",
|
||||||
|
compressor_name);
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s depth: %u", depth, "",
|
||||||
|
GET_UINT16 (data));
|
||||||
|
GST_LOG_OBJECT (qtdemux, "%*s color table ID:%u", depth, "",
|
||||||
|
GET_UINT16 (data));
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
qtdemux_dump_stsd (GstQTDemux * qtdemux, GstByteReader * data, int depth)
|
qtdemux_dump_stsd (GstQTDemux * qtdemux, GstByteReader * data, int depth)
|
||||||
{
|
{
|
||||||
|
@ -353,6 +398,10 @@ qtdemux_dump_stsd (GstQTDemux * qtdemux, GstByteReader * data, int depth)
|
||||||
if (!qtdemux_dump_unknown (qtdemux, &sub, depth + 1))
|
if (!qtdemux_dump_unknown (qtdemux, &sub, depth + 1))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
break;
|
break;
|
||||||
|
case FOURCC_av01:
|
||||||
|
if (!qtdemux_dump_stsd_av01 (qtdemux, &sub, size, depth + 1))
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
/* Unknown stsd data, dump the bytes */
|
/* Unknown stsd data, dump the bytes */
|
||||||
if (!qtdemux_dump_unknown (qtdemux, &sub, depth + 1))
|
if (!qtdemux_dump_unknown (qtdemux, &sub, depth + 1))
|
||||||
|
|
|
@ -214,6 +214,7 @@ static const QtNodeType qt_node_types[] = {
|
||||||
{FOURCC_tenc, "track encryption", 0},
|
{FOURCC_tenc, "track encryption", 0},
|
||||||
{FOURCC_stpp, "XML subtitle sample entry", 0},
|
{FOURCC_stpp, "XML subtitle sample entry", 0},
|
||||||
{FOURCC_clcp, "Closed Caption", 0},
|
{FOURCC_clcp, "Closed Caption", 0},
|
||||||
|
{FOURCC_av01, "AV1 Sample Entry", 0},
|
||||||
{0, "unknown", 0,},
|
{0, "unknown", 0,},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue