gst/rtp/gstrtpL16pay.c: Implement getcaps in rtpL16pay. Fixes #556484.
authorOlivier Crete <tester@tester.ca>
Mon, 27 Oct 2008 11:28:30 +0000 (11:28 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Mon, 27 Oct 2008 11:28:30 +0000 (11:28 +0000)
Original commit message from CVS:
Patch by: Olivier Crete <tester at tester dot ca>
* gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_class_init),
(gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_getcaps):
Implement getcaps in rtpL16pay. Fixes #556484.

ChangeLog
gst/rtp/gstrtpL16pay.c

index bfdfe89..ed8069f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2008-10-27  Wim Taymans  <wim.taymans@collabora.co.uk>
 
+       Patch by: Olivier Crete <tester at tester dot ca>
+
+       * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_class_init),
+       (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_getcaps):
+       Implement getcaps in rtpL16pay. Fixes #556484.
+
+2008-10-27  Wim Taymans  <wim.taymans@collabora.co.uk>
+
        * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps),
        (gst_rtp_L16_depay_process):
        Check if clock-rate and channels are valid.
index 4b761ad..8d121e6 100644 (file)
@@ -58,12 +58,17 @@ static GstStaticPadTemplate gst_rtp_L16_pay_src_template =
         "payload = (int) [ 96, 127 ], "
         "clock-rate = (int) [ 1, MAX ], "
         "encoding-name = (string) \"L16\", "
-        "channels = (int) [ 1, MAX ], "
-        "rate = (int) [ 1, MAX ];"
+        "channels = (int) [ 1, MAX ];"
         "application/x-rtp, "
         "media = (string) \"audio\", "
-        "payload = (int) { " GST_RTP_PAYLOAD_L16_STEREO_STRING ", "
-        GST_RTP_PAYLOAD_L16_MONO_STRING " }," "clock-rate = (int) 44100")
+        "encoding-name = (string) \"L16\", "
+        "payload = (int) " GST_RTP_PAYLOAD_L16_STEREO_STRING ", "
+        "clock-rate = (int) 44100;"
+        "application/x-rtp, "
+        "media = (string) \"audio\", "
+        "encoding-name = (string) \"L16\", "
+        "payload = (int) " GST_RTP_PAYLOAD_L16_MONO_STRING ", "
+        "clock-rate = (int) 44100")
     );
 
 static void gst_rtp_L16_pay_class_init (GstRtpL16PayClass * klass);
@@ -75,6 +80,8 @@ static gboolean gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload,
     GstCaps * caps);
 static GstFlowReturn gst_rtp_L16_pay_handle_buffer (GstBaseRTPPayload * pad,
     GstBuffer * buffer);
+static GstCaps *gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload,
+    GstPad * pad);
 
 static GstBaseRTPPayloadClass *parent_class = NULL;
 
@@ -132,6 +139,7 @@ gst_rtp_L16_pay_class_init (GstRtpL16PayClass * klass)
   gobject_class->finalize = gst_rtp_L16_pay_finalize;
 
   gstbasertppayload_class->set_caps = gst_rtp_L16_pay_setcaps;
+  gstbasertppayload_class->get_caps = gst_rtp_L16_pay_getcaps;
   gstbasertppayload_class->handle_buffer = gst_rtp_L16_pay_handle_buffer;
 
   GST_DEBUG_CATEGORY_INIT (rtpL16pay_debug, "rtpL16pay", 0,
@@ -164,6 +172,7 @@ gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps)
   GstStructure *structure;
   gint channels, rate;
   gboolean res;
+  gchar *params;
 
   rtpL16pay = GST_RTP_L16_PAY (basepayload);
 
@@ -176,9 +185,13 @@ gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps)
   if (!gst_structure_get_int (structure, "channels", &channels))
     goto no_channels;
 
+
   gst_basertppayload_set_options (basepayload, "audio", TRUE, "L16", rate);
+  params = g_strdup_printf ("%d", channels);
   res = gst_basertppayload_set_outcaps (basepayload,
-      "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, rate, NULL);
+      "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT,
+      channels, NULL);
+  g_free (params);
 
   rtpL16pay->rate = rate;
   rtpL16pay->channels = channels;
@@ -273,6 +286,47 @@ gst_rtp_L16_pay_handle_buffer (GstBaseRTPPayload * basepayload,
   return ret;
 }
 
+static GstCaps *
+gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad)
+{
+  GstCaps *otherpadcaps;
+  GstCaps *caps;
+
+  otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad);
+  caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
+
+  if (otherpadcaps) {
+    if (!gst_caps_is_empty (otherpadcaps)) {
+      GstStructure *structure;
+      gint channels;
+      gint pt;
+      gint rate;
+
+      structure = gst_caps_get_structure (otherpadcaps, 0);
+
+      if (gst_structure_get_int (structure, "channels", &channels)) {
+        gst_caps_set_simple (caps, "channels", G_TYPE_INT, channels, NULL);
+      } else if (gst_structure_get_int (structure, "payload", &pt)) {
+        if (pt == 10)
+          gst_caps_set_simple (caps, "channels", G_TYPE_INT, 2, NULL);
+        else if (pt == 11)
+          gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL);
+      }
+
+      if (gst_structure_get_int (structure, "clock-rate", &rate)) {
+        gst_caps_set_simple (caps, "rate", G_TYPE_INT, rate, NULL);
+      } else if (gst_structure_get_int (structure, "payload", &pt)) {
+        if (pt == 10 || pt == 11)
+          gst_caps_set_simple (caps, "rate", G_TYPE_INT, 44100, NULL);
+      }
+
+    }
+    gst_caps_unref (otherpadcaps);
+  }
+
+  return caps;
+}
+
 gboolean
 gst_rtp_L16_pay_plugin_init (GstPlugin * plugin)
 {