From 4cf624aefaaa9578599e81f386d66060ea854126 Mon Sep 17 00:00:00 2001 From: Marc-Andre Lureau 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 +#include #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