All pastes #757692 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-11-01 15:11 UTC
rendered paste body
From 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