qtdemux: Add initial support for AV1 demuxing
authorOlivier Crête <olivier.crete@collabora.com>
Wed, 25 Jul 2018 14:43:11 +0000 (10:43 -0400)
committerOlivier Crête <olivier.crete@collabora.com>
Thu, 26 Jul 2018 18:14:53 +0000 (14:14 -0400)
Following the spec at
https://aomediacodec.github.io/av1-isobmff/

gst/isomp4/fourcc.h
gst/isomp4/qtdemux.c
gst/isomp4/qtdemux_dump.c
gst/isomp4/qtdemux_types.c

index 6f467ff..c06b694 100644 (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')
index 3efb5ba..7a68283 100644 (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:
     {
index 5ff2e92..25921df 100644 (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))
index 1d58403..68f98bd 100644 (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,},
 };