law: fix caps and negotiation
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 30 Jun 2009 13:59:20 +0000 (15:59 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 30 Jun 2009 13:59:20 +0000 (15:59 +0200)
Fix the caps to include the depth (instead of width twice) in the caps of
audio/x-raw-int.
Fix negotiation to not only copy the rate/channels of the first structure.

gst/law/alaw-decode.c
gst/law/alaw-encode.c
gst/law/alaw.c
gst/law/mulaw-decode.c
gst/law/mulaw-encode.c
gst/law/mulaw.c

index ac4c6df..d7b6f2f 100644 (file)
@@ -150,50 +150,61 @@ gst_alaw_dec_getcaps (GstPad * pad)
 {
   GstALawDec *alawdec;
   GstPad *otherpad;
-  GstCaps *base_caps, *othercaps;
+  GstCaps *othercaps, *result;
+  const GstCaps *templ;
+  gchar *name;
+  gint i;
 
   alawdec = GST_ALAW_DEC (GST_PAD_PARENT (pad));
 
-  base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
-
+  /* figure out the name of the caps we are going to return */
   if (pad == alawdec->srcpad) {
+    name = "audio/x-raw-int";
     otherpad = alawdec->sinkpad;
   } else {
+    name = "audio/x-alaw";
     otherpad = alawdec->srcpad;
   }
+  /* get caps from the peer, this can return NULL when there is no peer */
   othercaps = gst_pad_peer_get_caps (otherpad);
-  if (othercaps) {
-    GstStructure *structure;
-    const GValue *orate, *ochans;
-    const GValue *rate, *chans;
-    GValue irate = { 0 };
-    GValue ichans = { 0 };
-
-    if (gst_caps_is_empty (othercaps) || gst_caps_is_any (othercaps))
-      goto done;
-
-    structure = gst_caps_get_structure (othercaps, 0);
-    orate = gst_structure_get_value (structure, "rate");
-    ochans = gst_structure_get_value (structure, "channels");
-
-    structure = gst_caps_get_structure (base_caps, 0);
-    rate = gst_structure_get_value (structure, "rate");
-    chans = gst_structure_get_value (structure, "channels");
-
-    if (orate) {
-      gst_value_intersect (&irate, orate, rate);
-      gst_structure_set_value (structure, "rate", &irate);
-    }
 
-    if (ochans) {
-      gst_value_intersect (&ichans, ochans, chans);
-      gst_structure_set_value (structure, "channels", &ichans);
-    }
+  /* get the template caps to make sure we return something acceptable */
+  templ = gst_pad_get_pad_template_caps (pad);
 
-  done:
+  if (othercaps) {
+    /* there was a peer */
+    othercaps = gst_caps_make_writable (othercaps);
+
+    /* go through the caps and remove the fields we don't want */
+    for (i = 0; i < gst_caps_get_size (othercaps); i++) {
+      GstStructure *structure;
+
+      structure = gst_caps_get_structure (othercaps, i);
+
+      /* adjust the name */
+      gst_structure_set_name (structure, name);
+
+      if (pad == alawdec->sinkpad) {
+        /* remove the fields we don't want */
+        gst_structure_remove_fields (structure, "width", "depth", "endianness",
+            "signed", NULL);
+      } else {
+        /* add fixed fields */
+        gst_structure_set (structure, "width", G_TYPE_INT, 16,
+            "depth", G_TYPE_INT, 16,
+            "endianness", G_TYPE_INT, G_BYTE_ORDER,
+            "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      }
+    }
+    /* filter against the allowed caps of the pad to return our result */
+    result = gst_caps_intersect (othercaps, templ);
     gst_caps_unref (othercaps);
+  } else {
+    /* there was no peer, return the template caps */
+    result = gst_caps_copy (templ);
   }
-  return base_caps;
+
+  return result;
 }
 
 static void
index b98d8e2..2b1b058 100644 (file)
@@ -301,51 +301,61 @@ gst_alaw_enc_getcaps (GstPad * pad)
 {
   GstALawEnc *alawenc;
   GstPad *otherpad;
-  GstCaps *base_caps, *othercaps;
+  GstCaps *othercaps, *result;
+  const GstCaps *templ;
+  gchar *name;
+  gint i;
 
   alawenc = GST_ALAW_ENC (GST_PAD_PARENT (pad));
 
-  /* we can do what our template says */
-  base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
-
+  /* figure out the name of the caps we are going to return */
   if (pad == alawenc->srcpad) {
+    name = "audio/x-alaw";
     otherpad = alawenc->sinkpad;
   } else {
+    name = "audio/x-raw-int";
     otherpad = alawenc->srcpad;
   }
+  /* get caps from the peer, this can return NULL when there is no peer */
   othercaps = gst_pad_peer_get_caps (otherpad);
-  if (othercaps) {
-    GstStructure *structure;
-    const GValue *orate, *ochans;
-    const GValue *rate, *chans;
-    GValue irate = { 0 };
-    GValue ichans = { 0 };
-
-    if (gst_caps_is_empty (othercaps) || gst_caps_is_any (othercaps))
-      goto done;
-
-    structure = gst_caps_get_structure (othercaps, 0);
-    orate = gst_structure_get_value (structure, "rate");
-    ochans = gst_structure_get_value (structure, "channels");
-
-    structure = gst_caps_get_structure (base_caps, 0);
-    rate = gst_structure_get_value (structure, "rate");
-    chans = gst_structure_get_value (structure, "channels");
-
-    if (orate) {
-      gst_value_intersect (&irate, orate, rate);
-      gst_structure_set_value (structure, "rate", &irate);
-    }
 
-    if (ochans) {
-      gst_value_intersect (&ichans, ochans, chans);
-      gst_structure_set_value (structure, "channels", &ichans);
-    }
+  /* get the template caps to make sure we return something acceptable */
+  templ = gst_pad_get_pad_template_caps (pad);
 
-  done:
+  if (othercaps) {
+    /* there was a peer */
+    othercaps = gst_caps_make_writable (othercaps);
+
+    /* go through the caps and remove the fields we don't want */
+    for (i = 0; i < gst_caps_get_size (othercaps); i++) {
+      GstStructure *structure;
+
+      structure = gst_caps_get_structure (othercaps, i);
+
+      /* adjust the name */
+      gst_structure_set_name (structure, name);
+
+      if (pad == alawenc->srcpad) {
+        /* remove the fields we don't want */
+        gst_structure_remove_fields (structure, "width", "depth", "endianness",
+            "signed", NULL);
+      } else {
+        /* add fixed fields */
+        gst_structure_set (structure, "width", G_TYPE_INT, 16,
+            "depth", G_TYPE_INT, 16,
+            "endianness", G_TYPE_INT, G_BYTE_ORDER,
+            "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      }
+    }
+    /* filter against the allowed caps of the pad to return our result */
+    result = gst_caps_intersect (othercaps, templ);
     gst_caps_unref (othercaps);
+  } else {
+    /* there was no peer, return the template caps */
+    result = gst_caps_copy (templ);
   }
-  return base_caps;
+
+  return result;
 }
 
 static gboolean
index 3525848..95ae992 100644 (file)
@@ -30,7 +30,7 @@ GstStaticPadTemplate alaw_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src",
         "rate = (int) [ 8000, 192000 ], "
         "channels = (int) [ 1, 2 ], "
         "endianness = (int) BYTE_ORDER, "
-        "width = (int) 16, " "width = (int) 16, " "signed = (boolean) True")
+        "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True")
     );
 
 GstStaticPadTemplate alaw_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
@@ -47,7 +47,7 @@ GstStaticPadTemplate alaw_enc_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
         "rate = (int) [ 8000, 192000 ], "
         "channels = (int) [ 1, 2 ], "
         "endianness = (int) BYTE_ORDER, "
-        "width = (int) 16, " "width = (int) 16, " "signed = (boolean) True")
+        "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True")
     );
 
 GstStaticPadTemplate alaw_enc_src_factory = GST_STATIC_PAD_TEMPLATE ("src",
index 831ef0f..6d09c16 100644 (file)
@@ -93,50 +93,60 @@ mulawdec_getcaps (GstPad * pad)
 {
   GstMuLawDec *mulawdec;
   GstPad *otherpad;
-  GstCaps *base_caps, *othercaps;
+  GstCaps *othercaps, *result;
+  const GstCaps *templ;
+  gchar *name;
+  gint i;
 
   mulawdec = GST_MULAWDEC (GST_PAD_PARENT (pad));
 
-  base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
-
+  /* figure out the name of the caps we are going to return */
   if (pad == mulawdec->srcpad) {
+    name = "audio/x-raw-int";
     otherpad = mulawdec->sinkpad;
   } else {
+    name = "audio/x-mulaw";
     otherpad = mulawdec->srcpad;
   }
+  /* get caps from the peer, this can return NULL when there is no peer */
   othercaps = gst_pad_peer_get_caps (otherpad);
-  if (othercaps) {
-    GstStructure *structure;
-    const GValue *orate, *ochans;
-    const GValue *rate, *chans;
-    GValue irate = { 0 };
-    GValue ichans = { 0 };
-
-    if (gst_caps_is_empty (othercaps) || gst_caps_is_any (othercaps))
-      goto done;
-
-    structure = gst_caps_get_structure (othercaps, 0);
-    orate = gst_structure_get_value (structure, "rate");
-    ochans = gst_structure_get_value (structure, "channels");
-
-    structure = gst_caps_get_structure (base_caps, 0);
-    rate = gst_structure_get_value (structure, "rate");
-    chans = gst_structure_get_value (structure, "channels");
-
-    if (orate) {
-      gst_value_intersect (&irate, orate, rate);
-      gst_structure_set_value (structure, "rate", &irate);
-    }
 
-    if (ochans) {
-      gst_value_intersect (&ichans, ochans, chans);
-      gst_structure_set_value (structure, "channels", &ichans);
-    }
+  /* get the template caps to make sure we return something acceptable */
+  templ = gst_pad_get_pad_template_caps (pad);
 
-  done:
+  if (othercaps) {
+    /* there was a peer */
+    othercaps = gst_caps_make_writable (othercaps);
+
+    /* go through the caps and remove the fields we don't want */
+    for (i = 0; i < gst_caps_get_size (othercaps); i++) {
+      GstStructure *structure;
+
+      structure = gst_caps_get_structure (othercaps, i);
+
+      /* adjust the name */
+      gst_structure_set_name (structure, name);
+
+      if (pad == mulawdec->sinkpad) {
+        /* remove the fields we don't want */
+        gst_structure_remove_fields (structure, "width", "depth", "endianness",
+            "signed", NULL);
+      } else {
+        /* add fixed fields */
+        gst_structure_set (structure, "width", G_TYPE_INT, 16,
+            "depth", G_TYPE_INT, 16,
+            "endianness", G_TYPE_INT, G_BYTE_ORDER,
+            "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      }
+    }
+    /* filter against the allowed caps of the pad to return our result */
+    result = gst_caps_intersect (othercaps, templ);
     gst_caps_unref (othercaps);
+  } else {
+    /* there was no peer, return the template caps */
+    result = gst_caps_copy (templ);
   }
-  return base_caps;
+  return result;
 }
 
 GType
index 022e96f..fde922b 100644 (file)
@@ -59,50 +59,60 @@ mulawenc_getcaps (GstPad * pad)
 {
   GstMuLawEnc *mulawenc;
   GstPad *otherpad;
-  GstCaps *base_caps, *othercaps;
+  GstCaps *othercaps, *result;
+  const GstCaps *templ;
+  gchar *name;
+  gint i;
 
   mulawenc = GST_MULAWENC (GST_PAD_PARENT (pad));
 
-  base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad));
-
+  /* figure out the name of the caps we are going to return */
   if (pad == mulawenc->srcpad) {
+    name = "audio/x-mulaw";
     otherpad = mulawenc->sinkpad;
   } else {
+    name = "audio/x-raw-int";
     otherpad = mulawenc->srcpad;
   }
+  /* get caps from the peer, this can return NULL when there is no peer */
   othercaps = gst_pad_peer_get_caps (otherpad);
-  if (othercaps) {
-    GstStructure *structure;
-    const GValue *orate, *ochans;
-    const GValue *rate, *chans;
-    GValue irate = { 0 };
-    GValue ichans = { 0 };
-
-    if (gst_caps_is_empty (othercaps) || gst_caps_is_any (othercaps))
-      goto done;
-
-    structure = gst_caps_get_structure (othercaps, 0);
-    orate = gst_structure_get_value (structure, "rate");
-    ochans = gst_structure_get_value (structure, "channels");
-
-    structure = gst_caps_get_structure (base_caps, 0);
-    rate = gst_structure_get_value (structure, "rate");
-    chans = gst_structure_get_value (structure, "channels");
-
-    if (orate) {
-      gst_value_intersect (&irate, orate, rate);
-      gst_structure_set_value (structure, "rate", &irate);
-    }
 
-    if (ochans) {
-      gst_value_intersect (&ichans, ochans, chans);
-      gst_structure_set_value (structure, "channels", &ichans);
-    }
+  /* get the template caps to make sure we return something acceptable */
+  templ = gst_pad_get_pad_template_caps (pad);
 
-  done:
+  if (othercaps) {
+    /* there was a peer */
+    othercaps = gst_caps_make_writable (othercaps);
+
+    /* go through the caps and remove the fields we don't want */
+    for (i = 0; i < gst_caps_get_size (othercaps); i++) {
+      GstStructure *structure;
+
+      structure = gst_caps_get_structure (othercaps, i);
+
+      /* adjust the name */
+      gst_structure_set_name (structure, name);
+
+      if (pad == mulawenc->srcpad) {
+        /* remove the fields we don't want */
+        gst_structure_remove_fields (structure, "width", "depth", "endianness",
+            "signed", NULL);
+      } else {
+        /* add fixed fields */
+        gst_structure_set (structure, "width", G_TYPE_INT, 16,
+            "depth", G_TYPE_INT, 16,
+            "endianness", G_TYPE_INT, G_BYTE_ORDER,
+            "signed", G_TYPE_BOOLEAN, TRUE, NULL);
+      }
+    }
+    /* filter against the allowed caps of the pad to return our result */
+    result = gst_caps_intersect (othercaps, templ);
     gst_caps_unref (othercaps);
+  } else {
+    /* there was no peer, return the template caps */
+    result = gst_caps_copy (templ);
   }
-  return base_caps;
+  return result;
 }
 
 static gboolean
index 3317e58..27a76db 100644 (file)
@@ -29,7 +29,7 @@ GstStaticPadTemplate mulaw_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src",
         "rate = (int) [ 8000, 192000 ], "
         "channels = (int) [ 1, 2 ], "
         "endianness = (int) BYTE_ORDER, "
-        "width = (int) 16, " "width = (int) 16, " "signed = (boolean) True")
+        "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True")
     );
 
 GstStaticPadTemplate mulaw_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
@@ -46,7 +46,7 @@ GstStaticPadTemplate mulaw_enc_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
         "rate = (int) [ 8000, 192000 ], "
         "channels = (int) [ 1, 2 ], "
         "endianness = (int) BYTE_ORDER, "
-        "width = (int) 16, " "width = (int) 16, " "signed = (boolean) True")
+        "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True")
     );
 
 GstStaticPadTemplate mulaw_enc_src_factory = GST_STATIC_PAD_TEMPLATE ("src",