Additional media type support in qtmux (and friends).
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Wed, 28 Jan 2009 12:25:14 +0000 (13:25 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Tue, 12 Apr 2011 19:32:11 +0000 (20:32 +0100)
Support AMR and H263 for both qtmux and gppmux,
and add extensions in sample table description.

gst/quicktime/atoms.c
gst/quicktime/atoms.h
gst/quicktime/gstqtmux.c
gst/quicktime/gstqtmuxmap.c

index cbe66f6..df6958e 100644 (file)
@@ -2972,3 +2972,55 @@ build_codec_data_extension (guint32 fourcc, const GstBuffer * codec_data)
 
   return result;
 }
+
+AtomInfo *
+build_amr_extension ()
+{
+  guint8 ext[9];
+  GstBuffer *buf;
+  AtomInfo *res;
+
+  buf = gst_buffer_new ();
+  GST_BUFFER_DATA (buf) = ext;
+  GST_BUFFER_SIZE (buf) = sizeof (ext);
+
+  /* vendor */
+  GST_WRITE_UINT32_LE (ext, 0);
+  /* decoder version */
+  GST_WRITE_UINT8 (ext + 4, 0);
+  /* mode set (all modes) */
+  GST_WRITE_UINT16_BE (ext + 5, 0x81FF);
+  /* mode change period (no restriction) */
+  GST_WRITE_UINT8 (ext + 7, 0);
+  /* frames per sample */
+  GST_WRITE_UINT8 (ext + 8, 1);
+
+  res = build_codec_data_extension (GST_MAKE_FOURCC ('d', 'a', 'm', 'r'), buf);
+  gst_buffer_unref (buf);
+  return res;
+}
+
+AtomInfo *
+build_h263_extension ()
+{
+  guint8 ext[7];
+  GstBuffer *buf;
+  AtomInfo *res;
+
+  buf = gst_buffer_new ();
+  GST_BUFFER_DATA (buf) = ext;
+  GST_BUFFER_SIZE (buf) = sizeof (ext);
+
+  /* vendor */
+  GST_WRITE_UINT32_LE (ext, 0);
+  /* decoder version */
+  GST_WRITE_UINT8 (ext + 4, 0);
+  /* level / profile */
+  /* FIXME ? maybe ? obtain somewhere; baseline for now */
+  GST_WRITE_UINT8 (ext + 5, 10);
+  GST_WRITE_UINT8 (ext + 6, 0);
+
+  res = build_codec_data_extension (GST_MAKE_FOURCC ('d', '2', '6', '3'), buf);
+  gst_buffer_unref (buf);
+  return res;
+}
index 631aaf4..4d8dce1 100644 (file)
@@ -631,6 +631,8 @@ AtomInfo *   build_esds_extension        (AtomTRAK * trak, guint8 object_type,
                                           guint8 stream_type, const GstBuffer * codec_data);
 AtomInfo *   build_jp2h_extension        (AtomTRAK * trak, gint width, gint height,
                                           guint32 fourcc);
+AtomInfo *   build_amr_extension         ();
+AtomInfo *   build_h263_extension        ();
 
 
 /*
index fe784f1..25fd4e3 100644 (file)
@@ -1269,6 +1269,13 @@ gst_qt_mux_audio_sink_set_caps (GstPad * pad, GstCaps * caps)
     entry.sample_size = 16;
     entry.samples_per_packet = 160;
     entry.bytes_per_sample = 2;
+    ext_atom = build_amr_extension ();
+  } else if (strcmp (mimetype, "audio/AMR-WB") == 0) {
+    entry.fourcc = FOURCC_sawb;
+    entry.sample_size = 16;
+    entry.samples_per_packet = 320;
+    entry.bytes_per_sample = 2;
+    ext_atom = build_amr_extension ();
   } else if (strcmp (mimetype, "audio/x-raw-int") == 0) {
     gint width;
     gint depth;
@@ -1472,6 +1479,7 @@ gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps)
     }
   } else if (strcmp (mimetype, "video/x-h263") == 0) {
     entry.fourcc = FOURCC_h263;
+    ext_atom = build_h263_extension ();
   } else if (strcmp (mimetype, "video/x-divx") == 0 ||
       strcmp (mimetype, "video/mpeg") == 0) {
     gint version = 0;
index af1cb31..9b6ae58 100644 (file)
   "width = (int) [ 16, 4096 ], " \
   "height = (int) [ 16, 4096 ] "
 
+#define H263_CAPS \
+  "video/x-h263, " \
+  COMMON_VIDEO_CAPS
+
 #define H264_CAPS \
   "video/x-h264, " \
   COMMON_VIDEO_CAPS
   "mpegversion = (int) 4, " \
   COMMON_AUDIO_CAPS (8, MAX)
 
+#define AMR_CAPS \
+  "audio/AMR, " \
+  "rate = (int) 8000, " \
+  "channels = [ 1, 2 ]; " \
+  "audio/AMR-WB, " \
+  "rate = (int) 16000, " \
+  "channels = [ 1, 2 ] "
 
 GstQTMuxFormatProp gst_qt_mux_format_list[] = {
   /* original QuickTime format; see Apple site (e.g. qtff.pdf) */
@@ -126,10 +137,8 @@ GstQTMuxFormatProp gst_qt_mux_format_list[] = {
             "video/x-raw-yuv, "
             "format = (fourcc) UYVY, "
             COMMON_VIDEO_CAPS "; "
-            "video/x-h263, "
-            "h263version = (string) h263, "
-            COMMON_VIDEO_CAPS "; "
             MPEG4V_CAPS "; "
+            H263_CAPS "; "
             H264_CAPS "; "
             "video/x-dv, "
             "systemstream = (boolean) false, "
@@ -140,9 +149,7 @@ GstQTMuxFormatProp gst_qt_mux_format_list[] = {
         GST_STATIC_CAPS (PCM_CAPS_FULL "; "
             MP3_CAPS " ; "
             AAC_CAPS " ; "
-            "audio/x-alaw, "
-            COMMON_AUDIO_CAPS (2, MAX) "; "
-            "audio/x-mulaw, " COMMON_AUDIO_CAPS (2, MAX))
+            "audio/x-alaw, " COMMON_AUDIO_CAPS (2, MAX) "; " AMR_CAPS)
       }
   ,
   /* ISO 14496-14: mp42 as ISO base media extension
@@ -167,9 +174,8 @@ GstQTMuxFormatProp gst_qt_mux_format_list[] = {
         "3GPP",
         "GstGPPMux",
         GST_STATIC_CAPS ("application/x-3gp"),
-        GST_STATIC_CAPS (H264_CAPS),
-        GST_STATIC_CAPS ("audio/AMR, "
-            COMMON_AUDIO_CAPS (8, MAX) "; " MP3_CAPS "; " AAC_CAPS)
+        GST_STATIC_CAPS (H263_CAPS "; " H264_CAPS),
+        GST_STATIC_CAPS (AMR_CAPS "; " MP3_CAPS "; " AAC_CAPS)
       }
   ,
   /* ISO 15444-3: Motion-JPEG-2000 (also ISO base media extension) */