Fixed event handling in gsmenc.
Original commit message from CVS: Fixed event handling in gsmenc.
This commit is contained in:
parent
69431fca55
commit
4d87f79f85
@ -1,3 +1,10 @@
|
|||||||
|
2005-10-25 Edgard Lima <edgard.lima@indt.org.br>
|
||||||
|
|
||||||
|
* ext/gsm/gstgsmenc.c: (gst_gsmenc_init),
|
||||||
|
(gst_gsmenc_sink_event), (gst_gsmenc_chain):
|
||||||
|
* ext/gsm/gstgsmenc.h:
|
||||||
|
Fixed event handling
|
||||||
|
|
||||||
2005-10-24 Christian Schaller <christian@fluendo.com>
|
2005-10-24 Christian Schaller <christian@fluendo.com>
|
||||||
|
|
||||||
* configure.ac: port over thomas's plugin listing from base
|
* configure.ac: port over thomas's plugin listing from base
|
||||||
|
@ -56,6 +56,9 @@ static GstFlowReturn gst_gsmenc_chain (GstPad * pad, GstBuffer * buf);
|
|||||||
static GstElementClass *parent_class = NULL;
|
static GstElementClass *parent_class = NULL;
|
||||||
static guint gst_gsmenc_signals[LAST_SIGNAL] = { 0 };
|
static guint gst_gsmenc_signals[LAST_SIGNAL] = { 0 };
|
||||||
|
|
||||||
|
static gboolean gst_gsmenc_sink_event (GstPad * pad, GstEvent * event);
|
||||||
|
|
||||||
|
|
||||||
GType
|
GType
|
||||||
gst_gsmenc_get_type (void)
|
gst_gsmenc_get_type (void)
|
||||||
{
|
{
|
||||||
@ -137,6 +140,7 @@ gst_gsmenc_init (GstGSMEnc * gsmenc)
|
|||||||
(&gsmenc_sink_template), "sink");
|
(&gsmenc_sink_template), "sink");
|
||||||
gst_element_add_pad (GST_ELEMENT (gsmenc), gsmenc->sinkpad);
|
gst_element_add_pad (GST_ELEMENT (gsmenc), gsmenc->sinkpad);
|
||||||
gst_pad_set_chain_function (gsmenc->sinkpad, gst_gsmenc_chain);
|
gst_pad_set_chain_function (gsmenc->sinkpad, gst_gsmenc_chain);
|
||||||
|
gst_pad_set_event_function (gsmenc->sinkpad, gst_gsmenc_sink_event);
|
||||||
|
|
||||||
gsmenc->srcpad =
|
gsmenc->srcpad =
|
||||||
gst_pad_new_from_template (gst_static_pad_template_get
|
gst_pad_new_from_template (gst_static_pad_template_get
|
||||||
@ -146,38 +150,51 @@ gst_gsmenc_init (GstGSMEnc * gsmenc)
|
|||||||
gsmenc->state = gsm_create ();
|
gsmenc->state = gsm_create ();
|
||||||
gsmenc->bufsize = 0;
|
gsmenc->bufsize = 0;
|
||||||
gsmenc->next_ts = 0;
|
gsmenc->next_ts = 0;
|
||||||
|
gsmenc->firstBuf = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_gsmenc_sink_event (GstPad * pad, GstEvent * event)
|
||||||
|
{
|
||||||
|
|
||||||
|
GstGSMEnc *gsmenc;
|
||||||
|
|
||||||
|
gsmenc = GST_GSMENC (GST_OBJECT_PARENT (pad));
|
||||||
|
gboolean ret = TRUE;
|
||||||
|
|
||||||
|
switch (GST_EVENT_TYPE (event)) {
|
||||||
|
case GST_EVENT_EOS:
|
||||||
|
{
|
||||||
|
GST_STREAM_LOCK (pad);
|
||||||
|
ret = gst_pad_push_event (gsmenc->srcpad, event);
|
||||||
|
GST_STREAM_UNLOCK (pad);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GST_EVENT_NEWSEGMENT:
|
||||||
|
{
|
||||||
|
/* drop the discontinuity */
|
||||||
|
gst_event_unref (event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
gst_pad_event_default (pad, event);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_gsmenc_chain (GstPad * pad, GstBuffer * buf)
|
gst_gsmenc_chain (GstPad * pad, GstBuffer * buf)
|
||||||
{
|
{
|
||||||
GstGSMEnc *gsmenc;
|
GstGSMEnc *gsmenc;
|
||||||
|
|
||||||
gsmenc = GST_GSMENC (GST_OBJECT_PARENT (pad));
|
|
||||||
|
|
||||||
if (GST_IS_EVENT (buf)) {
|
|
||||||
GstEvent *event = GST_EVENT (buf);
|
|
||||||
|
|
||||||
switch (GST_EVENT_TYPE (event)) {
|
|
||||||
case GST_EVENT_EOS:{
|
|
||||||
gst_pad_push_event (gsmenc->srcpad, gst_event_new_eos ());
|
|
||||||
gst_pad_push (gsmenc->srcpad, buf);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GST_EVENT_NEWSEGMENT:{
|
|
||||||
/* drop the discontinuity */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:{
|
|
||||||
gst_pad_event_default (pad, event);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
} else if (GST_IS_BUFFER (buf)) {
|
|
||||||
gsm_signal *data;
|
gsm_signal *data;
|
||||||
guint size;
|
guint size;
|
||||||
GstCaps *tempcaps = NULL;
|
GstFlowReturn ret = GST_FLOW_OK;
|
||||||
|
|
||||||
|
gsmenc = GST_GSMENC (gst_pad_get_parent (pad));
|
||||||
|
|
||||||
data = (gsm_signal *) GST_BUFFER_DATA (buf);
|
data = (gsm_signal *) GST_BUFFER_DATA (buf);
|
||||||
size = GST_BUFFER_SIZE (buf) / sizeof (gsm_signal);
|
size = GST_BUFFER_SIZE (buf) / sizeof (gsm_signal);
|
||||||
@ -196,15 +213,26 @@ gst_gsmenc_chain (GstPad * pad, GstBuffer * buf)
|
|||||||
gsm_encode (gsmenc->state, gsmenc->buffer,
|
gsm_encode (gsmenc->state, gsmenc->buffer,
|
||||||
(gsm_byte *) GST_BUFFER_DATA (outbuf));
|
(gsm_byte *) GST_BUFFER_DATA (outbuf));
|
||||||
|
|
||||||
tempcaps = gst_caps_new_simple ("audio/x-gsm",
|
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (gsmenc->srcpad));
|
||||||
"rate", G_TYPE_INT, 8000, "channels", G_TYPE_INT, 1, NULL);
|
|
||||||
|
|
||||||
gst_buffer_set_caps (outbuf, tempcaps);
|
if (gsmenc->firstBuf) {
|
||||||
gst_pad_push (gsmenc->srcpad, outbuf);
|
gst_pad_push_event (gsmenc->srcpad,
|
||||||
|
gst_event_new_newsegment (FALSE, 1.0, GST_FORMAT_DEFAULT,
|
||||||
|
0, GST_CLOCK_TIME_NONE, 0));
|
||||||
|
gsmenc->firstBuf = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = gst_pad_push (gsmenc->srcpad, outbuf);
|
||||||
|
|
||||||
|
if (ret != GST_FLOW_OK) {
|
||||||
|
gst_buffer_unref (outbuf);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
size -= (160 - gsmenc->bufsize);
|
size -= (160 - gsmenc->bufsize);
|
||||||
data += (160 - gsmenc->bufsize);
|
data += (160 - gsmenc->bufsize);
|
||||||
gsmenc->bufsize = 0;
|
gsmenc->bufsize = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while (size >= 160) {
|
while (size >= 160) {
|
||||||
@ -217,27 +245,32 @@ gst_gsmenc_chain (GstPad * pad, GstBuffer * buf)
|
|||||||
|
|
||||||
gsm_encode (gsmenc->state, data, (gsm_byte *) GST_BUFFER_DATA (outbuf));
|
gsm_encode (gsmenc->state, data, (gsm_byte *) GST_BUFFER_DATA (outbuf));
|
||||||
|
|
||||||
/* I was wondering that gst_buffer_set_caps (outbuf, GST_PAD_CAPS (gsmenc->srcpad));
|
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (gsmenc->srcpad));
|
||||||
* could work, but it doens't work */
|
if (gsmenc->firstBuf) {
|
||||||
|
gst_pad_push_event (gsmenc->srcpad,
|
||||||
|
gst_event_new_newsegment (FALSE, 1.0, GST_FORMAT_DEFAULT,
|
||||||
|
0, GST_CLOCK_TIME_NONE, 0));
|
||||||
|
gsmenc->firstBuf = FALSE;
|
||||||
|
}
|
||||||
|
ret = gst_pad_push (gsmenc->srcpad, outbuf);
|
||||||
|
|
||||||
tempcaps = gst_caps_new_simple ("audio/x-gsm",
|
if (ret != GST_FLOW_OK) {
|
||||||
"rate", G_TYPE_INT, 8000, "channels", G_TYPE_INT, 1, NULL);
|
gst_buffer_unref (outbuf);
|
||||||
|
goto error;
|
||||||
gst_buffer_set_caps (outbuf, tempcaps);
|
}
|
||||||
gst_pad_push (gsmenc->srcpad, outbuf);
|
|
||||||
|
|
||||||
size -= 160;
|
size -= 160;
|
||||||
data += 160;
|
data += 160;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size) {
|
if (size) {
|
||||||
memcpy (gsmenc->buffer + gsmenc->bufsize, data,
|
memcpy (gsmenc->buffer + gsmenc->bufsize, data, size * sizeof (gsm_signal));
|
||||||
size * sizeof (gsm_signal));
|
|
||||||
gsmenc->bufsize += size;
|
gsmenc->bufsize += size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*gst_buffer_unref (buf); */
|
error:
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
gst_object_unref (gsmenc);
|
||||||
return GST_FLOW_OK;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,7 @@ struct _GstGSMEnc
|
|||||||
gsm_signal buffer[160];
|
gsm_signal buffer[160];
|
||||||
gint bufsize;
|
gint bufsize;
|
||||||
GstClockTime next_ts;
|
GstClockTime next_ts;
|
||||||
|
gboolean firstBuf;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstGSMEncClass
|
struct _GstGSMEncClass
|
||||||
|
Loading…
x
Reference in New Issue
Block a user