--- a/gst/isomp4/qtdemux.c
+++ b/gst/isomp4/qtdemux.c
@@ -197,6 +197,7 @@ struct _QtDemuxStream
 
   /* stream type */
   guint32 subtype;
+  gchar *subtype_name;
   GstCaps *caps;
   guint32 fourcc;
 
@@ -1817,6 +1818,7 @@ gst_qtdemux_stream_free (GstQTDemux * qtdemux, QtDemuxStream * stream)
   g_free (stream->redirect_uri);
   /* free stbl sub-atoms */
   gst_qtdemux_stbl_free (stream);
+  g_free (stream->subtype_name);
   g_free (stream);
 }
 
@@ -3569,6 +3571,39 @@ clipped:
   }
 }
 
+static gboolean
+default_channel_mask_for_channels (gint channels, guint64 * channel_mask)
+{
+  switch (channels) {
+    case 2:
+      *channel_mask = GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_LEFT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_RIGHT);
+      break;
+    case 6:
+      *channel_mask = GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_LEFT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_CENTER) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_RIGHT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (SIDE_LEFT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (SIDE_RIGHT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (LFE1);
+      break;
+    case 8:
+      *channel_mask = GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_LEFT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_CENTER) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (FRONT_RIGHT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (SIDE_LEFT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (SIDE_RIGHT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (REAR_LEFT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (REAR_RIGHT) |
+          GST_AUDIO_CHANNEL_POSITION_MASK (LFE1);
+      break;
+    default:
+      return FALSE;
+  }
+
+  return TRUE;
+}
+
 /* the input buffer metadata must be writable,
  * but time/duration etc not yet set and need not be preserved */
 static GstBuffer *
@@ -5221,6 +5256,32 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux,
         gst_caps_set_simple (stream->caps,
             "channel-mask", GST_TYPE_BITMASK, G_GUINT64_CONSTANT (0), NULL);
       }
+
+      if (!strncmp (stream->subtype_name, "DTSNeural", 9)) {
+        guint64 channel_mask;
+        gint to_channels = 0;
+
+        switch (stream->n_channels) {
+          case 2:
+            if (!strcmp (stream->subtype_name + 9, "522"))
+              to_channels = 6;
+            else if (!strcmp (stream->subtype_name + 9, "722"))
+              to_channels = 8;
+            break;
+
+          case 5:
+            if (!strcmp (stream->subtype_name + 9, "725"))
+              to_channels = 8;
+            break;
+        }
+
+        if (to_channels > 0 &&
+            default_channel_mask_for_channels (to_channels, &channel_mask)) {
+          gst_caps_set_simple (stream->caps,
+              "neural-channels", G_TYPE_INT, to_channels,
+              "neural-channel-mask", GST_TYPE_BITMASK, channel_mask, NULL);
+        }
+      }
     }
     qtdemux->n_audio_streams++;
   } else if (stream->subtype == FOURCC_strm) {
@@ -6602,6 +6663,11 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
   GST_LOG_OBJECT (qtdemux, "track subtype: %" GST_FOURCC_FORMAT,
       GST_FOURCC_ARGS (stream->subtype));
 
+  if (len > 32) {
+    stream->subtype_name = g_strndup ((gchar *) hdlr->data + 32, len - 32);
+    stream->subtype_name[len - 32] = '\0';
+  }
+
   if (!(minf = qtdemux_tree_get_child_by_type (mdia, FOURCC_minf)))
     goto corrupt_file;
 
@@ -7695,12 +7761,14 @@ corrupt_file:
   {
     GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX,
         (_("This file is corrupt and cannot be played.")), (NULL));
+    g_free (stream->subtype_name);
     g_free (stream);
     return FALSE;
   }
 error_encrypted:
   {
     GST_ELEMENT_ERROR (qtdemux, STREAM, DECRYPT, (NULL), (NULL));
+    g_free (stream->subtype_name);
     g_free (stream);
     return FALSE;
   }
@@ -7710,6 +7778,7 @@ segments_failed:
     /* we posted an error already */
     /* free stbl sub-atoms */
     gst_qtdemux_stbl_free (stream);
+    g_free (stream->subtype_name);
     g_free (stream);
     return FALSE;
   }
@@ -7717,6 +7786,7 @@ unknown_stream:
   {
     GST_INFO_OBJECT (qtdemux, "unknown subtype %" GST_FOURCC_FORMAT,
         GST_FOURCC_ARGS (stream->subtype));
+    g_free (stream->subtype_name);
     g_free (stream);
     return TRUE;
   }
