summaryrefslogtreecommitdiffstats
path: root/audio/gstsbcparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/gstsbcparse.c')
-rw-r--r--audio/gstsbcparse.c41
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)