From 89f0c37c9fc1debc75b28b9fc627a25c3769583b Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 30 Jun 2009 15:59:20 +0200 Subject: 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. --- gst/law/alaw-decode.c | 73 ++++++++++++++++++++++++++++--------------------- gst/law/alaw-encode.c | 74 ++++++++++++++++++++++++++++---------------------- gst/law/alaw.c | 4 +-- gst/law/mulaw-decode.c | 72 +++++++++++++++++++++++++++--------------------- gst/law/mulaw-encode.c | 72 +++++++++++++++++++++++++++--------------------- gst/law/mulaw.c | 4 +-- 6 files changed, 170 insertions(+), 129 deletions(-) (limited to 'gst/law') 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", -- cgit