qtdemux: Add initial support for AV1 demuxing

Following the spec at
https://aomediacodec.github.io/av1-isobmff/
This commit is contained in:
Olivier Crête 2018-07-25 10:43:11 -04:00
parent f067b50dd6
commit b6e8c6323e
4 changed files with 55 additions and 0 deletions

View file

@ -264,6 +264,7 @@ G_BEGIN_DECLS
#define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e')
#define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b')
#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_ap4x GST_MAKE_FOURCC('a','p','4','x')

View file

@ -14651,6 +14651,10 @@ qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream,
caps = gst_caps_new_simple ("video/x-wmv",
"wmvversion", G_TYPE_INT, 3, "format", G_TYPE_STRING, "WVC1", NULL);
break;
case FOURCC_av01:
_codec ("AV1");
caps = gst_caps_new_empty_simple ("video/x-av1");
break;
case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'):
default:
{

View file

@ -303,6 +303,51 @@ qtdemux_dump_stsd_avc1 (GstQTDemux * qtdemux, GstByteReader * data, guint size,
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
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))
return FALSE;
break;
case FOURCC_av01:
if (!qtdemux_dump_stsd_av01 (qtdemux, &sub, size, depth + 1))
return FALSE;
break;
default:
/* Unknown stsd data, dump the bytes */
if (!qtdemux_dump_unknown (qtdemux, &sub, depth + 1))

View file

@ -214,6 +214,7 @@ static const QtNodeType qt_node_types[] = {
{FOURCC_tenc, "track encryption", 0},
{FOURCC_stpp, "XML subtitle sample entry", 0},
{FOURCC_clcp, "Closed Caption", 0},
{FOURCC_av01, "AV1 Sample Entry", 0},
{0, "unknown", 0,},
};