From ef560b86e22f0865e3323e161bc85a693430141b Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 30 Aug 2011 12:25:35 +0200 Subject: [PATCH] law: port to 0.11 --- gst/law/alaw.c | 22 ++++---- gst/law/mulaw-decode.c | 135 +++++++++++++++++++++---------------------------- gst/law/mulaw-encode.c | 121 ++++++++++++++++---------------------------- gst/law/mulaw.c | 22 ++++---- 4 files changed, 126 insertions(+), 174 deletions(-) diff --git a/gst/law/alaw.c b/gst/law/alaw.c index 0442935..1e7cc78 100644 --- a/gst/law/alaw.c +++ b/gst/law/alaw.c @@ -23,14 +23,18 @@ #include "alaw-encode.h" #include "alaw-decode.h" +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define INT_FORMAT "S16_LE" +#else +#define INT_FORMAT "S16_BE" +#endif + GstStaticPadTemplate alaw_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "rate = (int) [ 8000, 192000 ], " - "channels = (int) [ 1, 2 ], " - "endianness = (int) BYTE_ORDER, " - "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " INT_FORMAT ", " + "rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ]") ); GstStaticPadTemplate alaw_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", @@ -43,11 +47,9 @@ GstStaticPadTemplate alaw_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GstStaticPadTemplate alaw_enc_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "rate = (int) [ 8000, 192000 ], " - "channels = (int) [ 1, 2 ], " - "endianness = (int) BYTE_ORDER, " - "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " INT_FORMAT ", " + "rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ]") ); 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 40347ab..15bbcd8 100644 --- a/gst/law/mulaw-decode.c +++ b/gst/law/mulaw-decode.c @@ -26,9 +26,16 @@ #include "config.h" #endif #include + #include "mulaw-decode.h" #include "mulaw-conversion.h" +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define INT_FORMAT "S16_LE" +#else +#define INT_FORMAT "S16_BE" +#endif + extern GstStaticPadTemplate mulaw_dec_src_factory; extern GstStaticPadTemplate mulaw_dec_sink_factory; @@ -44,38 +51,31 @@ enum ARG_0 }; -static void gst_mulawdec_class_init (GstMuLawDecClass * klass); -static void gst_mulawdec_base_init (GstMuLawDecClass * klass); -static void gst_mulawdec_init (GstMuLawDec * mulawdec); static GstStateChangeReturn gst_mulawdec_change_state (GstElement * element, GstStateChange transition); +static gboolean gst_mulawdec_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_mulawdec_chain (GstPad * pad, GstBuffer * buffer); -static GstElementClass *parent_class = NULL; +#define gst_mulawdec_parent_class parent_class +G_DEFINE_TYPE (GstMuLawDec, gst_mulawdec, GST_TYPE_ELEMENT); static gboolean -mulawdec_sink_setcaps (GstPad * pad, GstCaps * caps) +mulawdec_setcaps (GstMuLawDec * mulawdec, GstCaps * caps) { - GstMuLawDec *mulawdec; GstStructure *structure; int rate, channels; gboolean ret; GstCaps *outcaps; - mulawdec = GST_MULAWDEC (GST_PAD_PARENT (pad)); - structure = gst_caps_get_structure (caps, 0); ret = gst_structure_get_int (structure, "rate", &rate); ret = ret && gst_structure_get_int (structure, "channels", &channels); if (!ret) return FALSE; - outcaps = gst_caps_new_simple ("audio/x-raw-int", - "width", G_TYPE_INT, 16, - "depth", G_TYPE_INT, 16, - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, + outcaps = gst_caps_new_simple ("audio/x-raw", + "format", G_TYPE_STRING, INT_FORMAT, "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, channels, NULL); ret = gst_pad_set_caps (mulawdec->srcpad, outcaps); gst_caps_unref (outcaps); @@ -89,7 +89,7 @@ mulawdec_sink_setcaps (GstPad * pad, GstCaps * caps) } static GstCaps * -mulawdec_getcaps (GstPad * pad) +mulawdec_getcaps (GstPad * pad, GstCaps * filter) { GstMuLawDec *mulawdec; GstPad *otherpad; @@ -102,14 +102,14 @@ mulawdec_getcaps (GstPad * pad) /* figure out the name of the caps we are going to return */ if (pad == mulawdec->srcpad) { - name = "audio/x-raw-int"; + name = "audio/x-raw"; 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); + othercaps = gst_pad_peer_get_caps (otherpad, filter); /* get the template caps to make sure we return something acceptable */ templ = gst_pad_get_pad_template_caps (pad); @@ -129,14 +129,11 @@ mulawdec_getcaps (GstPad * pad) if (pad == mulawdec->sinkpad) { /* remove the fields we don't want */ - gst_structure_remove_fields (structure, "width", "depth", "endianness", - "signed", NULL); + gst_structure_remove_fields (structure, "format", 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); + gst_structure_set (structure, "format", G_TYPE_STRING, INT_FORMAT, + NULL); } } /* filter against the allowed caps of the pad to return our result */ @@ -149,52 +146,20 @@ mulawdec_getcaps (GstPad * pad) return result; } -GType -gst_mulawdec_get_type (void) -{ - static GType mulawdec_type = 0; - - if (!mulawdec_type) { - static const GTypeInfo mulawdec_info = { - sizeof (GstMuLawDecClass), - (GBaseInitFunc) gst_mulawdec_base_init, - NULL, - (GClassInitFunc) gst_mulawdec_class_init, - NULL, - NULL, - sizeof (GstMuLawDec), - 0, - (GInstanceInitFunc) gst_mulawdec_init, - }; - - mulawdec_type = - g_type_register_static (GST_TYPE_ELEMENT, "GstMuLawDec", &mulawdec_info, - 0); - } - return mulawdec_type; -} - static void -gst_mulawdec_base_init (GstMuLawDecClass * klass) +gst_mulawdec_class_init (GstMuLawDecClass * klass) { - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstElementClass *element_class = (GstElementClass *) klass; gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&mulaw_dec_src_factory)); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&mulaw_dec_sink_factory)); + gst_element_class_set_details_simple (element_class, "Mu Law audio decoder", "Codec/Decoder/Audio", "Convert 8bit mu law to 16bit PCM", "Zaheer Abbas Merali "); -} - -static void -gst_mulawdec_class_init (GstMuLawDecClass * klass) -{ - GstElementClass *element_class = (GstElementClass *) klass; - - parent_class = g_type_class_peek_parent (klass); element_class->change_state = GST_DEBUG_FUNCPTR (gst_mulawdec_change_state); } @@ -204,8 +169,8 @@ gst_mulawdec_init (GstMuLawDec * mulawdec) { mulawdec->sinkpad = gst_pad_new_from_static_template (&mulaw_dec_sink_factory, "sink"); - gst_pad_set_setcaps_function (mulawdec->sinkpad, mulawdec_sink_setcaps); gst_pad_set_getcaps_function (mulawdec->sinkpad, mulawdec_getcaps); + gst_pad_set_event_function (mulawdec->sinkpad, gst_mulawdec_event); gst_pad_set_chain_function (mulawdec->sinkpad, gst_mulawdec_chain); gst_element_add_pad (GST_ELEMENT (mulawdec), mulawdec->sinkpad); @@ -216,13 +181,40 @@ gst_mulawdec_init (GstMuLawDec * mulawdec) gst_element_add_pad (GST_ELEMENT (mulawdec), mulawdec->srcpad); } +static gboolean +gst_mulawdec_event (GstPad * pad, GstEvent * event) +{ + GstMuLawDec *mulawdec; + gboolean res; + + mulawdec = GST_MULAWDEC (GST_PAD_PARENT (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + mulawdec_setcaps (mulawdec, caps); + gst_event_unref (event); + + res = TRUE; + break; + } + default: + res = gst_pad_event_default (pad, event); + break; + } + return res; +} + static GstFlowReturn gst_mulawdec_chain (GstPad * pad, GstBuffer * buffer) { GstMuLawDec *mulawdec; gint16 *linear_data; guint8 *mulaw_data; - guint mulaw_size; + gsize mulaw_size, linear_size; GstBuffer *outbuf; GstFlowReturn ret; @@ -231,17 +223,12 @@ gst_mulawdec_chain (GstPad * pad, GstBuffer * buffer) if (G_UNLIKELY (mulawdec->rate == 0)) goto not_negotiated; - mulaw_data = (guint8 *) GST_BUFFER_DATA (buffer); - mulaw_size = GST_BUFFER_SIZE (buffer); + mulaw_data = gst_buffer_map (buffer, &mulaw_size, NULL, GST_MAP_READ); - ret = - gst_pad_alloc_buffer_and_set_caps (mulawdec->srcpad, - GST_BUFFER_OFFSET_NONE, mulaw_size * 2, GST_PAD_CAPS (mulawdec->srcpad), - &outbuf); - if (ret != GST_FLOW_OK) - goto alloc_failed; + linear_size = mulaw_size * 2; - linear_data = (gint16 *) GST_BUFFER_DATA (outbuf); + outbuf = gst_buffer_new_allocate (NULL, linear_size, 0); + linear_data = gst_buffer_map (outbuf, NULL, NULL, GST_MAP_WRITE); /* copy discont flag */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) @@ -250,13 +237,14 @@ gst_mulawdec_chain (GstPad * pad, GstBuffer * buffer) GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); if (GST_BUFFER_DURATION (outbuf) == GST_CLOCK_TIME_NONE) GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (GST_SECOND, - mulaw_size * 2, 2 * mulawdec->rate * mulawdec->channels); + linear_size, 2 * mulawdec->rate * mulawdec->channels); else GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buffer); - gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mulawdec->srcpad)); mulaw_decode (mulaw_data, linear_data, mulaw_size); + gst_buffer_unmap (outbuf, linear_data, -1); + gst_buffer_unmap (buffer, mulaw_data, -1); gst_buffer_unref (buffer); ret = gst_pad_push (mulawdec->srcpad, outbuf); @@ -270,13 +258,6 @@ not_negotiated: gst_buffer_unref (buffer); return GST_FLOW_NOT_NEGOTIATED; } -alloc_failed: - { - GST_DEBUG_OBJECT (mulawdec, "pad alloc failed, flow: %s", - gst_flow_get_name (ret)); - gst_buffer_unref (buffer); - return ret; - } } static GstStateChangeReturn diff --git a/gst/law/mulaw-encode.c b/gst/law/mulaw-encode.c index 0ab1a1e..53661ab 100644 --- a/gst/law/mulaw-encode.c +++ b/gst/law/mulaw-encode.c @@ -44,18 +44,16 @@ enum ARG_0 }; -static void gst_mulawenc_class_init (GstMuLawEncClass * klass); -static void gst_mulawenc_base_init (GstMuLawEncClass * klass); -static void gst_mulawenc_init (GstMuLawEnc * mulawenc); - +static gboolean gst_mulawenc_event (GstPad * pad, GstEvent * event); static GstFlowReturn gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer); -static GstElementClass *parent_class = NULL; +#define gst_mulawenc_parent_class parent_class +G_DEFINE_TYPE (GstMuLawEnc, gst_mulawenc, GST_TYPE_ELEMENT); /*static guint gst_stereo_signals[LAST_SIGNAL] = { 0 }; */ static GstCaps * -mulawenc_getcaps (GstPad * pad) +mulawenc_getcaps (GstPad * pad, GstCaps * filter) { GstMuLawEnc *mulawenc; GstPad *otherpad; @@ -75,7 +73,7 @@ mulawenc_getcaps (GstPad * pad) otherpad = mulawenc->srcpad; } /* get caps from the peer, this can return NULL when there is no peer */ - othercaps = gst_pad_peer_get_caps (otherpad); + othercaps = gst_pad_peer_get_caps (otherpad, filter); /* get the template caps to make sure we return something acceptable */ templ = gst_pad_get_pad_template_caps (pad); @@ -116,66 +114,31 @@ mulawenc_getcaps (GstPad * pad) } static gboolean -mulawenc_setcaps (GstPad * pad, GstCaps * caps) +mulawenc_setcaps (GstMuLawEnc * mulawenc, GstCaps * caps) { - GstMuLawEnc *mulawenc; - GstPad *otherpad; GstStructure *structure; GstCaps *base_caps; - mulawenc = GST_MULAWENC (gst_pad_get_parent (pad)); - structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "channels", &mulawenc->channels); gst_structure_get_int (structure, "rate", &mulawenc->rate); - if (pad == mulawenc->sinkpad) { - otherpad = mulawenc->srcpad; - } else { - otherpad = mulawenc->sinkpad; - } - base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad)); + base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (mulawenc->srcpad)); structure = gst_caps_get_structure (base_caps, 0); gst_structure_set (structure, "rate", G_TYPE_INT, mulawenc->rate, NULL); gst_structure_set (structure, "channels", G_TYPE_INT, mulawenc->channels, NULL); - gst_pad_set_caps (otherpad, base_caps); + gst_pad_set_caps (mulawenc->srcpad, base_caps); - gst_object_unref (mulawenc); gst_caps_unref (base_caps); return TRUE; } -GType -gst_mulawenc_get_type (void) -{ - static GType mulawenc_type = 0; - - if (!mulawenc_type) { - static const GTypeInfo mulawenc_info = { - sizeof (GstMuLawEncClass), - (GBaseInitFunc) gst_mulawenc_base_init, - NULL, - (GClassInitFunc) gst_mulawenc_class_init, - NULL, - NULL, - sizeof (GstMuLawEnc), - 0, - (GInstanceInitFunc) gst_mulawenc_init, - }; - - mulawenc_type = - g_type_register_static (GST_TYPE_ELEMENT, "GstMuLawEnc", &mulawenc_info, - 0); - } - return mulawenc_type; -} - static void -gst_mulawenc_base_init (GstMuLawEncClass * klass) +gst_mulawenc_class_init (GstMuLawEncClass * klass) { GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -183,6 +146,7 @@ gst_mulawenc_base_init (GstMuLawEncClass * klass) gst_static_pad_template_get (&mulaw_enc_src_factory)); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&mulaw_enc_sink_factory)); + gst_element_class_set_details_simple (element_class, "Mu Law audio encoder", "Codec/Encoder/Audio", "Convert 16bit PCM to 8bit mu law", @@ -190,24 +154,17 @@ gst_mulawenc_base_init (GstMuLawEncClass * klass) } static void -gst_mulawenc_class_init (GstMuLawEncClass * klass) -{ - parent_class = g_type_class_peek_parent (klass); -} - -static void gst_mulawenc_init (GstMuLawEnc * mulawenc) { mulawenc->sinkpad = gst_pad_new_from_static_template (&mulaw_enc_sink_factory, "sink"); - gst_pad_set_setcaps_function (mulawenc->sinkpad, mulawenc_setcaps); gst_pad_set_getcaps_function (mulawenc->sinkpad, mulawenc_getcaps); + gst_pad_set_event_function (mulawenc->sinkpad, gst_mulawenc_event); gst_pad_set_chain_function (mulawenc->sinkpad, gst_mulawenc_chain); gst_element_add_pad (GST_ELEMENT (mulawenc), mulawenc->sinkpad); mulawenc->srcpad = gst_pad_new_from_static_template (&mulaw_enc_src_factory, "src"); - gst_pad_set_setcaps_function (mulawenc->srcpad, mulawenc_setcaps); gst_pad_set_getcaps_function (mulawenc->srcpad, mulawenc_getcaps); gst_pad_use_fixed_caps (mulawenc->srcpad); gst_element_add_pad (GST_ELEMENT (mulawenc), mulawenc->srcpad); @@ -217,12 +174,39 @@ gst_mulawenc_init (GstMuLawEnc * mulawenc) mulawenc->rate = 0; } +static gboolean +gst_mulawenc_event (GstPad * pad, GstEvent * event) +{ + GstMuLawEnc *mulawenc; + gboolean res; + + mulawenc = GST_MULAWENC (GST_PAD_PARENT (pad)); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_CAPS: + { + GstCaps *caps; + + gst_event_parse_caps (event, &caps); + mulawenc_setcaps (mulawenc, caps); + gst_event_unref (event); + + res = TRUE; + break; + } + default: + res = gst_pad_event_default (pad, event); + break; + } + return res; +} + static GstFlowReturn gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer) { GstMuLawEnc *mulawenc; gint16 *linear_data; - guint linear_size; + gsize linear_size; guint8 *mulaw_data; guint mulaw_size; GstBuffer *outbuf; @@ -234,32 +218,21 @@ gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer) if (!mulawenc->rate || !mulawenc->channels) goto not_negotiated; - linear_data = (gint16 *) GST_BUFFER_DATA (buffer); - linear_size = GST_BUFFER_SIZE (buffer); + linear_data = gst_buffer_map (buffer, &linear_size, NULL, GST_MAP_READ); mulaw_size = linear_size / 2; timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); - ret = gst_pad_alloc_buffer_and_set_caps (mulawenc->srcpad, - GST_BUFFER_OFFSET_NONE, mulaw_size, GST_PAD_CAPS (mulawenc->srcpad), - &outbuf); - if (ret != GST_FLOW_OK) - goto alloc_failed; + outbuf = gst_buffer_new_allocate (NULL, mulaw_size, 0); if (duration == -1) { duration = gst_util_uint64_scale_int (mulaw_size, GST_SECOND, mulawenc->rate * mulawenc->channels); } - if (GST_BUFFER_SIZE (outbuf) < mulaw_size) { - /* pad-alloc can suggest a smaller size */ - gst_buffer_unref (outbuf); - outbuf = gst_buffer_new_and_alloc (mulaw_size); - } - - mulaw_data = (guint8 *) GST_BUFFER_DATA (outbuf); + mulaw_data = gst_buffer_map (outbuf, NULL, NULL, GST_MAP_WRITE); /* copy discont flag */ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) @@ -268,10 +241,10 @@ gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer) GST_BUFFER_TIMESTAMP (outbuf) = timestamp; GST_BUFFER_DURATION (outbuf) = duration; - gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mulawenc->srcpad)); - mulaw_encode (linear_data, mulaw_data, mulaw_size); + gst_buffer_unmap (outbuf, mulaw_data, -1); + gst_buffer_unmap (buffer, linear_data, -1); gst_buffer_unref (buffer); ret = gst_pad_push (mulawenc->srcpad, outbuf); @@ -288,10 +261,4 @@ not_negotiated: gst_buffer_unref (buffer); goto done; } -alloc_failed: - { - GST_DEBUG_OBJECT (mulawenc, "pad alloc failed"); - gst_buffer_unref (buffer); - goto done; - } } diff --git a/gst/law/mulaw.c b/gst/law/mulaw.c index e8d9e72..1784084 100644 --- a/gst/law/mulaw.c +++ b/gst/law/mulaw.c @@ -22,14 +22,18 @@ #include "mulaw-encode.h" #include "mulaw-decode.h" +#if G_BYTE_ORDER == G_LITTLE_ENDIAN +#define INT_FORMAT "S16_LE" +#else +#define INT_FORMAT "S16_BE" +#endif + GstStaticPadTemplate mulaw_dec_src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "rate = (int) [ 8000, 192000 ], " - "channels = (int) [ 1, 2 ], " - "endianness = (int) BYTE_ORDER, " - "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " INT_FORMAT ", " + "rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ]") ); GstStaticPadTemplate mulaw_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", @@ -42,11 +46,9 @@ GstStaticPadTemplate mulaw_dec_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GstStaticPadTemplate mulaw_enc_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-raw-int, " - "rate = (int) [ 8000, 192000 ], " - "channels = (int) [ 1, 2 ], " - "endianness = (int) BYTE_ORDER, " - "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) True") + GST_STATIC_CAPS ("audio/x-raw, " + "format = (string) " INT_FORMAT ", " + "rate = (int) [ 8000, 192000 ], " "channels = (int) [ 1, 2 ]") ); GstStaticPadTemplate mulaw_enc_src_factory = GST_STATIC_PAD_TEMPLATE ("src", -- 2.7.4