summaryrefslogtreecommitdiff
path: root/ext/sbc
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-01-30 17:30:27 +0000
committerTim-Philipp Müller <tim@centricular.net>2013-03-27 22:21:15 +0000
commit10325f3604cbdc9a2f0e15ff0b9d0fe1774bfe58 (patch)
tree93dab0131f9481ebff639aca3517a295e33dd088 /ext/sbc
parent2a5e58f44fcb18aef9b37991cbb8e5c257bbe83b (diff)
sbc: Enable gstreamer plugin to use autoconnect flag.
Diffstat (limited to 'ext/sbc')
-rw-r--r--ext/sbc/gstsbcparse.c39
-rw-r--r--ext/sbc/gstsbcparse.h3
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;