diff options
author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-01-30 17:30:27 +0000 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-01-30 17:30:27 +0000 |
commit | 6c4268df1dff13f3b1a7b778eb2e993648bff519 (patch) | |
tree | cc5d3ffb1aad24fe7edb07be100c3b0288a6ccda /audio/gstsbcparse.c | |
parent | 3ad6867c8c7251c3192378a1a0e2ed937ee47d1b (diff) |
Enable gstreamer plugin to use autoconnect flag.
Diffstat (limited to 'audio/gstsbcparse.c')
-rw-r--r-- | audio/gstsbcparse.c | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/audio/gstsbcparse.c b/audio/gstsbcparse.c index 1f699620..80bf23a2 100644 --- a/audio/gstsbcparse.c +++ b/audio/gstsbcparse.c @@ -68,6 +68,7 @@ static GstFlowReturn sbc_parse_chain(GstPad *pad, GstBuffer *buffer) timestamp = GST_BUFFER_TIMESTAMP(buffer); + /* FIXME use a gstadpter */ if (parse->buffer) { GstBuffer *temp; temp = buffer; @@ -84,18 +85,29 @@ static GstFlowReturn sbc_parse_chain(GstPad *pad, GstBuffer *buffer) while (offset < size) { GstBuffer *output; - GstCaps *temp; int consumed; - consumed = sbc_parse(&parse->sbc, data + offset, size - offset); + consumed = sbc_parse(&parse->new_sbc, data + offset, + size - offset); if (consumed <= 0) break; - temp = GST_PAD_CAPS(parse->srcpad); + if (parse->first_parsing || (memcmp(&parse->sbc, + &parse->new_sbc, sizeof(sbc_t)) != 0)) { + + memcpy(&parse->sbc, &parse->new_sbc, sizeof(sbc_t)); + if (parse->outcaps != NULL) + gst_caps_unref(parse->outcaps); + + parse->outcaps = gst_sbc_parse_caps_from_sbc( + &parse->sbc); + + parse->first_parsing = FALSE; + } res = gst_pad_alloc_buffer_and_set_caps(parse->srcpad, GST_BUFFER_OFFSET_NONE, - consumed, temp, &output); + consumed, parse->outcaps, &output); if (res != GST_FLOW_OK) goto done; @@ -128,10 +140,11 @@ static GstStateChangeReturn sbc_parse_change_state(GstElement *element, switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: GST_DEBUG("Setup subband codec"); - if (parse->buffer) { - gst_buffer_unref(parse->buffer); - parse->buffer = NULL; - } + + parse->channels = -1; + parse->rate = -1; + parse->first_parsing = TRUE; + sbc_init(&parse->sbc, 0); break; @@ -142,8 +155,12 @@ static GstStateChangeReturn sbc_parse_change_state(GstElement *element, gst_buffer_unref(parse->buffer); parse->buffer = NULL; } - sbc_finish(&parse->sbc); + if (parse->outcaps != NULL) { + gst_caps_unref(parse->outcaps); + parse->outcaps = NULL; + } + sbc_finish(&parse->sbc); break; default: @@ -189,6 +206,12 @@ static void gst_sbc_parse_init(GstSbcParse *self, GstSbcParseClass *klass) self->srcpad = gst_pad_new_from_static_template( &sbc_parse_src_factory, "src"); gst_element_add_pad(GST_ELEMENT(self), self->srcpad); + + self->outcaps = NULL; + self->buffer = NULL; + self->channels = -1; + self->rate = -1; + self->first_parsing = TRUE; } gboolean gst_sbc_parse_plugin_init (GstPlugin * plugin) |