diff options
author | Maciej Katafiasz <mathrick@mathrick.org> | 2005-01-24 21:57:15 +0000 |
---|---|---|
committer | Maciej Katafiasz <mathrick@mathrick.org> | 2005-01-24 21:57:15 +0000 |
commit | 9d608aed4da8cf0bfc96f348c5d70f64e4b51168 (patch) | |
tree | 57d292a5e31248f2f5553e2f40942849e1782de6 /ext/gsm/gstgsmdec.c | |
parent | 5c88ccad34797478f5e7fc9ed4f17648a2918732 (diff) | |
download | gst-plugins-bad-9d608aed4da8cf0bfc96f348c5d70f64e4b51168.tar.gz gst-plugins-bad-9d608aed4da8cf0bfc96f348c5d70f64e4b51168.tar.bz2 gst-plugins-bad-9d608aed4da8cf0bfc96f348c5d70f64e4b51168.zip |
Apply patch from Jeffrey C. Ollie. Fixes rate (now always 8kHz) and adds timestamps
Original commit message from CVS:
Apply patch from Jeffrey C. Ollie. Fixes rate (now always 8kHz) and
adds timestamps
Diffstat (limited to 'ext/gsm/gstgsmdec.c')
-rw-r--r-- | ext/gsm/gstgsmdec.c | 190 |
1 files changed, 78 insertions, 112 deletions
diff --git a/ext/gsm/gstgsmdec.c b/ext/gsm/gstgsmdec.c index 26b6d02c..c44067b3 100644 --- a/ext/gsm/gstgsmdec.c +++ b/ext/gsm/gstgsmdec.c @@ -51,8 +51,6 @@ static void gst_gsmdec_class_init (GstGSMDec * klass); static void gst_gsmdec_init (GstGSMDec * gsmdec); static void gst_gsmdec_chain (GstPad * pad, GstData * _data); -static GstCaps *gst_gsmdec_getcaps (GstPad * pad); -static GstPadLinkReturn gst_gsmdec_link (GstPad * pad, const GstCaps * caps); static GstElementClass *parent_class = NULL; @@ -86,8 +84,7 @@ static GstStaticPadTemplate gsmdec_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-gsm, " - "rate = (int) [ 1000, 48000 ], " "channels = (int) 1") + GST_STATIC_CAPS ("audio/x-gsm, " "rate = (int) 8000, " "channels = (int) 1") ); static GstStaticPadTemplate gsmdec_src_template = @@ -98,8 +95,7 @@ GST_STATIC_PAD_TEMPLATE ("src", "endianness = (int) BYTE_ORDER, " "signed = (boolean) true, " "width = (int) 16, " - "depth = (int) 16, " - "rate = (int) [ 1000, 48000 ], " "channels = (int) 1") + "depth = (int) 16, " "rate = (int) 8000, " "channels = (int) 1") ); static void @@ -134,132 +130,102 @@ gst_gsmdec_init (GstGSMDec * gsmdec) gst_pad_new_from_template (gst_static_pad_template_get (&gsmdec_sink_template), "sink"); gst_pad_set_chain_function (gsmdec->sinkpad, gst_gsmdec_chain); - gst_pad_set_getcaps_function (gsmdec->sinkpad, gst_gsmdec_getcaps); - gst_pad_set_link_function (gsmdec->sinkpad, gst_gsmdec_link); gst_element_add_pad (GST_ELEMENT (gsmdec), gsmdec->sinkpad); gsmdec->srcpad = gst_pad_new_from_template (gst_static_pad_template_get (&gsmdec_src_template), "src"); - gst_pad_set_getcaps_function (gsmdec->srcpad, gst_gsmdec_getcaps); - gst_pad_set_link_function (gsmdec->srcpad, gst_gsmdec_link); gst_element_add_pad (GST_ELEMENT (gsmdec), gsmdec->srcpad); gsmdec->state = gsm_create (); gsmdec->bufsize = 0; -} - -static GstCaps * -gst_gsmdec_getcaps (GstPad * pad) -{ - GstGSMDec *gsmdec = GST_GSMDEC (gst_pad_get_parent (pad)); - const GValue *rate_value; - GstPad *otherpad; - GstCaps *othercaps, *basecaps; - - if (pad == gsmdec->srcpad) { - otherpad = gsmdec->sinkpad; - basecaps = gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, NULL); - } else { - otherpad = gsmdec->srcpad; - basecaps = gst_caps_new_simple ("audio/x-gsm", NULL); - } - - othercaps = gst_pad_get_allowed_caps (otherpad); - rate_value = gst_structure_get_value (gst_caps_get_structure (othercaps, - 0), "rate"); - gst_structure_set_value (gst_caps_get_structure (basecaps, 0), "rate", - rate_value); - gst_caps_set_simple (basecaps, "channels", G_TYPE_INT, 1, NULL); - - return basecaps; -} - -static GstPadLinkReturn -gst_gsmdec_link (GstPad * pad, const GstCaps * caps) -{ - GstGSMDec *gsmdec = GST_GSMDEC (gst_pad_get_parent (pad)); - GstPad *otherpad; - GstCaps *othercaps; - gint rate; - GstStructure *structure; - - structure = gst_caps_get_structure (caps, 0); - gst_structure_get_int (structure, "rate", &rate); - - if (pad == gsmdec->sinkpad) { - otherpad = gsmdec->srcpad; - othercaps = gst_caps_new_simple ("audio/x-raw-int", - "endianness", G_TYPE_INT, G_BYTE_ORDER, - "signed", G_TYPE_BOOLEAN, TRUE, - "width", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, NULL); - } else { - otherpad = gsmdec->sinkpad; - othercaps = gst_caps_new_simple ("audio/x-gsm", NULL); - } - - gst_caps_set_simple (othercaps, - "rate", G_TYPE_INT, rate, "channels", G_TYPE_INT, 1, NULL); - - return gst_pad_try_set_caps (otherpad, othercaps); + gsmdec->next_ts = 0; + gsmdec->next_of = 0; } static void gst_gsmdec_chain (GstPad * pad, GstData * _data) { - GstBuffer *buf = GST_BUFFER (_data); GstGSMDec *gsmdec; - gsm_byte *data; - guint size; g_return_if_fail (pad != NULL); g_return_if_fail (GST_IS_PAD (pad)); - g_return_if_fail (buf != NULL); - /*g_return_if_fail(GST_IS_BUFFER(buf)); */ + g_return_if_fail (_data != NULL); gsmdec = GST_GSMDEC (gst_pad_get_parent (pad)); - data = (gsm_byte *) GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); - - if (gsmdec->bufsize && (gsmdec->bufsize + size >= 33)) { - GstBuffer *outbuf; - - memcpy (gsmdec->buffer + gsmdec->bufsize, data, - (33 - gsmdec->bufsize) * sizeof (gsm_byte)); - - outbuf = gst_buffer_new (); - GST_BUFFER_DATA (outbuf) = g_malloc (160 * sizeof (gsm_signal)); - GST_BUFFER_SIZE (outbuf) = 160 * sizeof (gsm_signal); - - gsm_decode (gsmdec->state, gsmdec->buffer, - (gsm_signal *) GST_BUFFER_DATA (outbuf)); - - gst_pad_push (gsmdec->srcpad, GST_DATA (outbuf)); - - size -= (33 - gsmdec->bufsize); - data += (33 - gsmdec->bufsize); - gsmdec->bufsize = 0; - } - - while (size >= 33) { - GstBuffer *outbuf; - - outbuf = gst_buffer_new_and_alloc (160 * sizeof (gsm_signal)); - gsm_decode (gsmdec->state, data, (gsm_signal *) GST_BUFFER_DATA (outbuf)); - gst_pad_push (gsmdec->srcpad, GST_DATA (outbuf)); - - size -= 33; - data += 33; + if (GST_IS_EVENT (_data)) { + GstEvent *event = GST_EVENT (_data); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS:{ + gst_element_set_eos (GST_ELEMENT (gsmdec)); + gst_pad_push (gsmdec->srcpad, _data); + break; + } + case GST_EVENT_DISCONTINUOUS:{ + /* drop the discontinuity */ + break; + } + default:{ + gst_pad_event_default (pad, event); + break; + } + } + return; + } else if (GST_IS_BUFFER (_data)) { + GstBuffer *buf = GST_BUFFER (_data); + gsm_byte *data = (gsm_byte *) GST_BUFFER_DATA (buf); + guint size = GST_BUFFER_SIZE (buf); + + if (gsmdec->bufsize && (gsmdec->bufsize + size >= 33)) { + GstBuffer *outbuf; + + memcpy (gsmdec->buffer + gsmdec->bufsize, data, + (33 - gsmdec->bufsize) * sizeof (gsm_byte)); + + outbuf = gst_buffer_new_and_alloc (160 * sizeof (gsm_signal)); + GST_BUFFER_TIMESTAMP (outbuf) = gsmdec->next_ts; + GST_BUFFER_DURATION (outbuf) = 20 * GST_MSECOND; + GST_BUFFER_OFFSET (outbuf) = gsmdec->next_of; + GST_BUFFER_OFFSET_END (outbuf) = gsmdec->next_of + 160 - 1; + gsmdec->next_ts += 20 * GST_MSECOND; + gsmdec->next_of += 160; + + gsm_decode (gsmdec->state, gsmdec->buffer, + (gsm_signal *) GST_BUFFER_DATA (outbuf)); + + gst_pad_push (gsmdec->srcpad, GST_DATA (outbuf)); + + size -= (33 - gsmdec->bufsize); + data += (33 - gsmdec->bufsize); + gsmdec->bufsize = 0; + } + + while (size >= 33) { + GstBuffer *outbuf; + + outbuf = gst_buffer_new_and_alloc (160 * sizeof (gsm_signal)); + GST_BUFFER_TIMESTAMP (outbuf) = gsmdec->next_ts; + GST_BUFFER_DURATION (outbuf) = 20 * GST_MSECOND; + GST_BUFFER_OFFSET (outbuf) = gsmdec->next_of; + GST_BUFFER_OFFSET_END (outbuf) = gsmdec->next_of + 160 - 1; + gsmdec->next_ts += 20 * GST_MSECOND; + gsmdec->next_of += 160; + + gsm_decode (gsmdec->state, data, (gsm_signal *) GST_BUFFER_DATA (outbuf)); + gst_pad_push (gsmdec->srcpad, GST_DATA (outbuf)); + + size -= 33; + data += 33; + } + + if (size) { + memcpy (gsmdec->buffer + gsmdec->bufsize, data, size * sizeof (gsm_byte)); + gsmdec->bufsize += size; + } + + gst_buffer_unref (buf); + return; } - - if (size) { - memcpy (gsmdec->buffer + gsmdec->bufsize, data, size * sizeof (gsm_byte)); - gsmdec->bufsize += size; - } - - gst_buffer_unref (buf); } |