diff options
author | Luiz Augusto von Dentz <luiz.dentz@openbossa.org> | 2008-01-30 17:30:27 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2013-03-27 22:21:15 +0000 |
commit | 10325f3604cbdc9a2f0e15ff0b9d0fe1774bfe58 (patch) | |
tree | 93dab0131f9481ebff639aca3517a295e33dd088 /ext/sbc | |
parent | 2a5e58f44fcb18aef9b37991cbb8e5c257bbe83b (diff) |
sbc: Enable gstreamer plugin to use autoconnect flag.
Diffstat (limited to 'ext/sbc')
-rw-r--r-- | ext/sbc/gstsbcparse.c | 39 | ||||
-rw-r--r-- | ext/sbc/gstsbcparse.h | 3 |
2 files changed, 33 insertions, 9 deletions
diff --git a/ext/sbc/gstsbcparse.c b/ext/sbc/gstsbcparse.c index 16507abcde..446fb98652 100644 --- a/ext/sbc/gstsbcparse.c +++ b/ext/sbc/gstsbcparse.c @@ -67,6 +67,7 @@ sbc_parse_chain (GstPad * pad, GstBuffer * buffer) timestamp = GST_BUFFER_TIMESTAMP (buffer); + /* FIXME use a gstadpter */ if (parse->buffer) { GstBuffer *temp; temp = buffer; @@ -83,17 +84,26 @@ 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); + GST_BUFFER_OFFSET_NONE, consumed, parse->outcaps, &output); if (res != GST_FLOW_OK) goto done; @@ -125,10 +135,11 @@ sbc_parse_change_state (GstElement * element, GstStateChange transition) 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; @@ -139,8 +150,12 @@ sbc_parse_change_state (GstElement * element, GstStateChange transition) 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 +204,12 @@ 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 diff --git a/ext/sbc/gstsbcparse.h b/ext/sbc/gstsbcparse.h index eb9ca4418f..a71aea729e 100644 --- a/ext/sbc/gstsbcparse.h +++ b/ext/sbc/gstsbcparse.h @@ -50,6 +50,9 @@ struct _GstSbcParse { GstBuffer *buffer; sbc_t sbc; + sbc_t new_sbc; + GstCaps *outcaps; + gboolean first_parsing; gint channels; gint rate; |