Commit efbe7fb6 authored by Edgard Gusmão Lima's avatar Edgard Gusmão Lima
Browse files

Gsmdec ported to 0.9. Tested with filesrc ! gsmdec ! alsasink and osssink.

Original commit message from CVS:
Gsmdec ported to 0.9. Tested with filesrc ! gsmdec ! alsasink and osssink.
parent 4de70b15
2005-09-23 Edgard Lima <edgard.lima@indt.org.br>
* ext/gsm/Makefile.am:
* ext/gsm/gstgsm.c:
* ext/gsm/gstgsmdec.c:
* PORTED_09:
Gsmdec ported to 0.9.
2005-09-22 Arwed v. Merkatz <v.merkatz@gmx.net> 2005-09-22 Arwed v. Merkatz <v.merkatz@gmx.net>
* configure.ac: * configure.ac:
......
When porting a plugin start with 0.8 CVS head, not the old code in this module. There are many bugfixes which have gone into 0.8 which you want to keep. When porting a plugin start with 0.8 CVS head, not the old code in this module. There are many bugfixes which have gone into 0.8 which you want to keep.
List of ported plugins (update when you commit a ported plugin): List of ported plugins (update when you commit a ported plugin):
gsmdec (alima)
sdl (alima) sdl (alima)
speed (fcarvalho) speed (fcarvalho)
gsmenc (fcarvalho) gsmenc (fcarvalho)
......
plugin_LTLIBRARIES = libgstgsm.la 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_CFLAGS = $(GST_CFLAGS) $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
libgstgsm_la_LIBADD = $(GSM_LIBS) $(GST_PLUGINS_BASE_LIBS) \ libgstgsm_la_LIBADD = $(GSM_LIBS) $(GST_PLUGINS_BASE_LIBS) \
-lgstaudio-@GST_MAJORMINOR@ -lgstaudio-@GST_MAJORMINOR@
libgstgsm_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstgsm_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
noinst_HEADERS = gstgsmenc.h noinst_HEADERS = gstgsmenc.h gstgsmdec.h
...@@ -29,11 +29,9 @@ plugin_init (GstPlugin * plugin) ...@@ -29,11 +29,9 @@ plugin_init (GstPlugin * plugin)
{ {
if (!gst_element_register (plugin, "gsmenc", GST_RANK_NONE, GST_TYPE_GSMENC)) if (!gst_element_register (plugin, "gsmenc", GST_RANK_NONE, GST_TYPE_GSMENC))
return FALSE; return FALSE;
/*
if (!gst_element_register (plugin, "gsmdec", GST_RANK_PRIMARY, if (!gst_element_register (plugin, "gsmdec", GST_RANK_PRIMARY,
GST_TYPE_GSMDEC)) GST_TYPE_GSMDEC))
return FALSE; return FALSE;
*/
return TRUE; return TRUE;
} }
......
...@@ -50,7 +50,7 @@ static void gst_gsmdec_base_init (gpointer g_class); ...@@ -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_class_init (GstGSMDec * klass);
static void gst_gsmdec_init (GstGSMDec * gsmdec); 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; static GstElementClass *parent_class = NULL;
...@@ -143,89 +143,67 @@ gst_gsmdec_init (GstGSMDec * gsmdec) ...@@ -143,89 +143,67 @@ gst_gsmdec_init (GstGSMDec * gsmdec)
gsmdec->next_of = 0; gsmdec->next_of = 0;
} }
static void static GstFlowReturn
gst_gsmdec_chain (GstPad * pad, GstData * _data) gst_gsmdec_chain (GstPad * pad, GstBuffer * buf)
{ {
GstGSMDec *gsmdec; 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)); gsmdec = GST_GSMDEC (gst_pad_get_parent (pad));
if (GST_IS_EVENT (_data)) { gsm_byte *data = (gsm_byte *) GST_BUFFER_DATA (buf);
GstEvent *event = GST_EVENT (_data); guint size = GST_BUFFER_SIZE (buf);
switch (GST_EVENT_TYPE (event)) { if (gsmdec->bufsize && (gsmdec->bufsize + size >= 33)) {
case GST_EVENT_EOS:{ GstBuffer *outbuf;
gst_element_set_eos (GST_ELEMENT (gsmdec));
gst_pad_push (gsmdec->srcpad, _data); memcpy (gsmdec->buffer + gsmdec->bufsize, data,
break; (33 - gsmdec->bufsize) * sizeof (gsm_byte));
}
case GST_EVENT_DISCONTINUOUS:{ outbuf = gst_buffer_new_and_alloc (160 * sizeof (gsm_signal));
/* drop the discontinuity */ GST_BUFFER_TIMESTAMP (outbuf) = gsmdec->next_ts;
break; GST_BUFFER_DURATION (outbuf) = 20 * GST_MSECOND;
} GST_BUFFER_OFFSET (outbuf) = gsmdec->next_of;
default:{ GST_BUFFER_OFFSET_END (outbuf) = gsmdec->next_of + 160 - 1;
gst_pad_event_default (pad, event); gst_buffer_set_caps (outbuf, gst_pad_get_caps (gsmdec->srcpad));
break;
} gsmdec->next_ts += 20 * GST_MSECOND;
} gsmdec->next_of += 160;
return;
} else if (GST_IS_BUFFER (_data)) { gsm_decode (gsmdec->state, gsmdec->buffer,
GstBuffer *buf = GST_BUFFER (_data); (gsm_signal *) GST_BUFFER_DATA (outbuf));
gsm_byte *data = (gsm_byte *) GST_BUFFER_DATA (buf);
guint size = GST_BUFFER_SIZE (buf); gst_pad_push (gsmdec->srcpad, outbuf);
if (gsmdec->bufsize && (gsmdec->bufsize + size >= 33)) { size -= (33 - gsmdec->bufsize);
GstBuffer *outbuf; data += (33 - gsmdec->bufsize);
gsmdec->bufsize = 0;
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;
} }
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;
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment