diff options
Diffstat (limited to 'ext/gsm')
-rw-r--r-- | ext/gsm/Makefile.am | 4 | ||||
-rw-r--r-- | ext/gsm/gstgsm.c | 2 | ||||
-rw-r--r-- | ext/gsm/gstgsmdec.c | 138 |
3 files changed, 60 insertions, 84 deletions
diff --git a/ext/gsm/Makefile.am b/ext/gsm/Makefile.am index 6782a242..e91ea73d 100644 --- a/ext/gsm/Makefile.am +++ b/ext/gsm/Makefile.am @@ -1,9 +1,9 @@ plugin_LTLIBRARIES = libgstgsm.la -libgstgsm_la_SOURCES = gstgsm.c gstgsmenc.c +libgstgsm_la_SOURCES = gstgsm.c gstgsmenc.c gstgsmdec.c libgstgsm_la_CFLAGS = $(GST_CFLAGS) $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) libgstgsm_la_LIBADD = $(GSM_LIBS) $(GST_PLUGINS_BASE_LIBS) \ -lgstaudio-@GST_MAJORMINOR@ libgstgsm_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -noinst_HEADERS = gstgsmenc.h +noinst_HEADERS = gstgsmenc.h gstgsmdec.h diff --git a/ext/gsm/gstgsm.c b/ext/gsm/gstgsm.c index c629c236..c71dacb0 100644 --- a/ext/gsm/gstgsm.c +++ b/ext/gsm/gstgsm.c @@ -29,11 +29,9 @@ plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "gsmenc", GST_RANK_NONE, GST_TYPE_GSMENC)) return FALSE; -/* if (!gst_element_register (plugin, "gsmdec", GST_RANK_PRIMARY, GST_TYPE_GSMDEC)) return FALSE; -*/ return TRUE; } diff --git a/ext/gsm/gstgsmdec.c b/ext/gsm/gstgsmdec.c index c44067b3..f3ce9cf5 100644 --- a/ext/gsm/gstgsmdec.c +++ b/ext/gsm/gstgsmdec.c @@ -50,7 +50,7 @@ static void gst_gsmdec_base_init (gpointer g_class); 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 GstFlowReturn gst_gsmdec_chain (GstPad * pad, GstBuffer * buffer); static GstElementClass *parent_class = NULL; @@ -143,89 +143,67 @@ gst_gsmdec_init (GstGSMDec * gsmdec) gsmdec->next_of = 0; } -static void -gst_gsmdec_chain (GstPad * pad, GstData * _data) +static GstFlowReturn +gst_gsmdec_chain (GstPad * pad, GstBuffer * buf) { GstGSMDec *gsmdec; - g_return_if_fail (pad != NULL); - g_return_if_fail (GST_IS_PAD (pad)); - g_return_if_fail (_data != NULL); - gsmdec = GST_GSMDEC (gst_pad_get_parent (pad)); - 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; + 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; + gst_buffer_set_caps (outbuf, gst_pad_get_caps (gsmdec->srcpad)); + + 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, 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; + gst_buffer_set_caps (outbuf, gst_pad_get_caps (gsmdec->srcpad)); + + 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, outbuf); + + size -= 33; + data += 33; + } + + if (size) { + memcpy (gsmdec->buffer + gsmdec->bufsize, data, size * sizeof (gsm_byte)); + gsmdec->bufsize += size; + } + + return GST_FLOW_OK; + } |