rendered paste bodyFrom 4cf624aefaaa9578599e81f386d66060ea854126 Mon Sep 17 00:00:00 2001
From: Marc-Andre Lureau <marcandre.lureau@gmail.com>
Date: Thu, 1 Nov 2007 17:07:39 +0200
Subject: [PATCH] gstsbcenc: use adapter, compute timestamp
---
audio/gstsbcenc.c | 37 ++++++++++++++++++++++++-------------
audio/gstsbcenc.h | 3 +++
2 files changed, 27 insertions(+), 13 deletions(-)
diff --git a/audio/gstsbcenc.c b/audio/gstsbcenc.c
index 69e67ae..aec0f21 100644
--- a/audio/gstsbcenc.c
+++ b/audio/gstsbcenc.c
@@ -191,21 +191,24 @@ error:
static GstFlowReturn sbc_enc_chain(GstPad *pad, GstBuffer *buffer)
{
GstSbcEnc *enc = GST_SBC_ENC(gst_pad_get_parent(pad));
+ GstAdapter *adapter = enc->adapter;
GstFlowReturn res = GST_FLOW_OK;
- guint size, offset = 0;
- guint8 *data;
+ gint codesize = enc->sbc.subbands * enc->sbc.blocks * enc->sbc.channels * 2;
- data = GST_BUFFER_DATA(buffer);
- size = GST_BUFFER_SIZE(buffer);
+ gst_adapter_push(adapter, buffer);
- while (offset < size) {
+ while (gst_adapter_available(adapter) >= codesize && res == GST_FLOW_OK) {
GstBuffer *output;
GstCaps *caps;
int consumed;
- consumed = sbc_encode(&enc->sbc, data + offset, size - offset);
- if (consumed <= 0)
+ consumed = sbc_encode(&enc->sbc, (gpointer)gst_adapter_peek(adapter, codesize), codesize);
+ if (consumed <= 0) {
+ GST_ERROR ("comsumed < 0, codesize: %d", codesize);
break;
+ }
+ gst_adapter_flush(adapter, codesize);
+ enc->consumed += codesize;
caps = GST_PAD_CAPS(enc->srcpad);
@@ -217,19 +220,14 @@ static GstFlowReturn sbc_enc_chain(GstPad *pad, GstBuffer *buffer)
goto done;
memcpy(GST_BUFFER_DATA(output), enc->sbc.data, enc->sbc.len);
+ GST_BUFFER_TIMESTAMP(output) = GST_SECOND * enc->consumed / (enc->sbc.rate * enc->sbc.channels * 2);
res = gst_pad_push(enc->srcpad, output);
if (res != GST_FLOW_OK)
goto done;
-
- offset += consumed;
}
- if (offset < size)
- res = GST_FLOW_ERROR;
-
done:
- gst_buffer_unref(buffer);
gst_object_unref(enc);
return res;
@@ -244,6 +242,7 @@ static GstStateChangeReturn sbc_enc_change_state(GstElement *element,
case GST_STATE_CHANGE_READY_TO_PAUSED:
GST_DEBUG("Setup subband codec");
sbc_init(&enc->sbc, 0);
+ enc->consumed = 0;
break;
case GST_STATE_CHANGE_PAUSED_TO_READY:
@@ -322,6 +321,15 @@ static void gst_sbc_enc_get_property(GObject *object, guint prop_id,
break;
}
}
+static void gst_sbc_enc_dispose(GObject *object)
+{
+ GstSbcEnc *enc = GST_SBC_ENC(object);
+
+ if (enc->adapter != NULL)
+ g_object_unref (G_OBJECT (enc->adapter));
+
+ enc->adapter = NULL;
+}
static void gst_sbc_enc_class_init(GstSbcEncClass *klass)
{
@@ -332,6 +340,7 @@ static void gst_sbc_enc_class_init(GstSbcEncClass *klass)
object_class->set_property = GST_DEBUG_FUNCPTR(gst_sbc_enc_set_property);
object_class->get_property = GST_DEBUG_FUNCPTR(gst_sbc_enc_get_property);
+ object_class->dispose = GST_DEBUG_FUNCPTR(gst_sbc_enc_dispose);
element_class->change_state = GST_DEBUG_FUNCPTR(sbc_enc_change_state);
@@ -374,4 +383,6 @@ static void gst_sbc_enc_init(GstSbcEnc *self, GstSbcEncClass *klass)
self->blocks = SBC_ENC_DEFAULT_BLOCKS;
self->mode = SBC_ENC_DEFAULT_MODE;
self->allocation = SBC_ENC_DEFAULT_ALLOCATION;
+
+ self->adapter = gst_adapter_new();
}
diff --git a/audio/gstsbcenc.h b/audio/gstsbcenc.h
index 0a95bce..971067b 100644
--- a/audio/gstsbcenc.h
+++ b/audio/gstsbcenc.h
@@ -22,6 +22,7 @@
*/
#include <gst/gst.h>
+#include <gst/base/gstadapter.h>
#include "sbc.h"
#include "ipc.h"
@@ -49,10 +50,12 @@ struct _GstSbcEnc {
GstPad *sinkpad;
GstPad *srcpad;
+ GstAdapter *adapter;
gint mode;
gint blocks;
gint allocation;
gint subbands;
+ guint consumed;
sbc_t sbc;
};
--
1.5.2.rc0.2336.g85b0