qtmux: add basic HEVC/H.265 muxing support
authorAurélien Zanelli <aurelien.zanelli@parrot.com>
Thu, 8 Dec 2016 16:02:22 +0000 (17:02 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 12 Jan 2017 17:16:23 +0000 (19:16 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=736752

gst/isomp4/gstqtmux.c
gst/isomp4/gstqtmuxmap.c

index 6e818b6..7d184eb 100644 (file)
@@ -4226,6 +4226,28 @@ gst_qt_mux_video_sink_set_caps (GstQTPad * qtpad, GstCaps * caps)
     ext_atom = build_codec_data_extension (FOURCC_avcC, codec_data);
     if (ext_atom != NULL)
       ext_atom_list = g_list_prepend (ext_atom_list, ext_atom);
+  } else if (strcmp (mimetype, "video/x-h265") == 0) {
+    const gchar *format;
+
+    if (!codec_data) {
+      GST_WARNING_OBJECT (qtmux, "no codec_data in h265 caps");
+      goto refuse_caps;
+    }
+
+    format = gst_structure_get_string (structure, "stream-format");
+    if (strcmp (format, "hvc1") == 0)
+      entry.fourcc = FOURCC_hvc1;
+    else if (strcmp (format, "hev1") == 0)
+      entry.fourcc = FOURCC_hev1;
+
+    ext_atom = build_btrt_extension (0, qtpad->avg_bitrate, qtpad->max_bitrate);
+    if (ext_atom != NULL)
+      ext_atom_list = g_list_prepend (ext_atom_list, ext_atom);
+
+    ext_atom = build_codec_data_extension (FOURCC_hvcC, codec_data);
+    if (ext_atom != NULL)
+      ext_atom_list = g_list_prepend (ext_atom_list, ext_atom);
+
   } else if (strcmp (mimetype, "video/x-svq") == 0) {
     gint version = 0;
     const GstBuffer *seqh = NULL;
index 3bc5567..f14ecf7 100644 (file)
   "alignment = (string) au, " \
   COMMON_VIDEO_CAPS
 
+#define H265_CAPS \
+  "video/x-h265, " \
+  "stream-format = (string) { hvc1, hev1 }, " \
+  "alignment = (string) au, " \
+  COMMON_VIDEO_CAPS
+
 #define MPEG4V_CAPS \
   "video/mpeg, " \
   "mpegversion = (int) 4, "\
@@ -173,6 +179,7 @@ GstQTMuxFormatProp gst_qt_mux_format_list[] = {
             PRORES_CAPS "; "
             H263_CAPS "; "
             H264_CAPS "; "
+            H265_CAPS "; "
             SVQ_CAPS "; "
             "video/x-dv, "
             "systemstream = (boolean) false, "
@@ -202,7 +209,7 @@ GstQTMuxFormatProp gst_qt_mux_format_list[] = {
         "MP4",
         "GstMP4Mux",
         GST_STATIC_CAPS ("video/quicktime, variant = (string) iso"),
-        GST_STATIC_CAPS (MPEG4V_CAPS "; " H264_CAPS ";"
+        GST_STATIC_CAPS (MPEG4V_CAPS "; " H264_CAPS ";" H265_CAPS ";"
             "video/x-mp4-part," COMMON_VIDEO_CAPS),
         GST_STATIC_CAPS (MP123_CAPS "; "
             AAC_CAPS " ; " AC3_CAPS " ; " ALAC_CAPS " ; " OPUS_CAPS),