summaryrefslogtreecommitdiffstats
path: root/gst/law
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2009-06-30 15:59:20 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2009-06-30 15:59:20 +0200
commit89f0c37c9fc1debc75b28b9fc627a25c3769583b (patch)
tree039b26b4bb37a024dab9bc43c7c8171386c6adb8 /gst/law
parent6d0007372b317b049f475fab0df0ea03195332dc (diff)
law: fix caps and negotiation
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.
Diffstat (limited to 'gst/law')
-rw-r--r--gst/law/alaw-decode.c73
-rw-r--r--gst/law/alaw-encode.c74
-rw-r--r--gst/law/alaw.c4
-rw-r--r--gst/law/mulaw-decode.c72
-rw-r--r--gst/law/mulaw-encode.c72
-rw-r--r--gst/law/mulaw.c4
6 files changed, 170 insertions, 129 deletions
diff --git a/gst/law/alaw-decode.c b/gst/law/alaw-decode.c
index ac4c6df5..d7b6f2f2 100644
--- a/gst/law/alaw-decode.c
+++ b/gst/law/alaw-decode.c
@@ -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
diff --git a/gst/law/alaw-encode.c b/gst/law/alaw-encode.c
index b98d8e2e..2b1b0583 100644
--- a/gst/law/alaw-encode.c
+++ b/gst/law/alaw-encode.c
@@ -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
diff --git a/gst/law/alaw.c b/gst/law/alaw.c
index 3525848d..95ae992d 100644
--- a/gst/law/alaw.c
+++ b/gst/law/alaw.c
@@ -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",
diff --git a/gst/law/mulaw-decode.c b/gst/law/mulaw-decode.c
index 831ef0fa..6d09c167 100644
--- a/gst/law/mulaw-decode.c
+++ b/gst/law/mulaw-decode.c
@@ -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
diff --git a/gst/law/mulaw-encode.c b/gst/law/mulaw-encode.c
index 022e96f1..fde922b7 100644
--- a/gst/law/mulaw-encode.c
+++ b/gst/law/mulaw-encode.c
@@ -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
diff --git a/gst/law/mulaw.c b/gst/law/mulaw.c
index 3317e58f..27a76db8 100644
--- a/gst/law/mulaw.c
+++ b/gst/law/mulaw.c
@@ -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",