vorbis: add support for using tremolo on android
authorThibault Saunier <thibault.saunier@collabora.co.uk>
Thu, 31 Mar 2011 17:56:00 +0000 (17:56 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Sat, 16 Apr 2011 14:33:16 +0000 (15:33 +0100)
Tremolo is an ARM-optimised version of xiph's tremor library.

Android.mk
configure.ac
ext/vorbis/Makefile.am
ext/vorbis/gstvorbisdec.c
ext/vorbis/gstvorbisdec.h
ext/vorbis/gstvorbisdeclib.h

index eb3b374..b3d345b 100644 (file)
@@ -63,6 +63,7 @@ GST_PLUGINS_BASE_BUILT_SOURCES :=                                             \
        gst/audiorate/Android.mk                                        \
        gst/volume/Android.mk                                   \
        tools/Android.mk                                        \
+       ext/vorbis/Android.mk                           \
        ext/ogg/Android.mk
 
 GST_PLUGINS_BASE_BUILT_SOURCES := $(patsubst %, $(abspath $(GST_PLUGINS_BASE_TOP))/%, $(GST_PLUGINS_BASE_BUILT_SOURCES))
@@ -79,8 +80,10 @@ gst-plugins-base-configure:
        CPPFLAGS="$(CONFIGURE_CPPFLAGS)" \
        PKG_CONFIG_LIBDIR="$(CONFIGURE_PKG_CONFIG_LIBDIR)" \
        PKG_CONFIG_TOP_BUILD_DIR=/ \
+       IVORBIS_CFLAGS="-I$(TOP)/external/tremolo -DTREMOR" \
+       IVORBIS_LIBS="-lvorbisidec" \
        $(abspath $(GST_PLUGINS_BASE_TOP))/$(CONFIGURE) --host=arm-linux-androideabi \
-       --prefix=/system --disable-orc --disable-gio \
+       --prefix=/system --disable-orc --disable-gio --enable-ivorbis \
        --disable-valgrind --disable-gtk-doc && \
        for file in $(GST_PLUGINS_BASE_BUILT_SOURCES); do \
                rm -f $$file && \
@@ -118,4 +121,5 @@ CONFIGURE_TARGETS += gst-plugins-base-configure
 -include $(GST_PLUGINS_BASE_TOP)/gst/audiorate/Android.mk
 -include $(GST_PLUGINS_BASE_TOP)/gst/volume/Android.mk
 -include $(GST_PLUGINS_BASE_TOP)/ext/ogg/Android.mk
+-include $(GST_PLUGINS_BASE_TOP)/ext/vorbis/Android.mk
 -include $(GST_PLUGINS_BASE_TOP)/tools/Android.mk
index b91b4f4..7b6a8ce 100644 (file)
@@ -715,6 +715,10 @@ AG_GST_CHECK_FEATURE(IVORBIS, [integer vorbis plug-in], ivorbisdec, [
       HAVE_IVORBIS=no)
     AC_SUBST(IVORBIS_LIBS)
     AC_SUBST(IVORBIS_CFLAGS)
+  else
+    AC_CHECK_LIB(vorbisidec, vorbis_dsp_pcmout,
+      AC_DEFINE([USE_TREMOLO],1, "Define if building for android"),
+      USE_TREMOLO=no)
   fi
 ])
 
index fc285a8..7c18ff1 100644 (file)
@@ -44,3 +44,17 @@ noinst_HEADERS = gstvorbisenc.h \
                 gstvorbistag.h \
                 gstvorbiscommon.h
 
+Android.mk: Makefile.am $(BUILT_SOURCES)
+       androgenizer \
+       -:PROJECT libgstivorbisdec -:SHARED libgstivorbisdec \
+        -:TAGS eng debug \
+         -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
+        -:SOURCES $(libgstivorbisdec_la_SOURCES) \
+        -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstivorbisdec_la_CFLAGS) \
+        -:LDFLAGS $(libgstivorbisdec_la_LDFLAGS) \
+                  $(libgstivorbisdec_la_LIBADD) \
+                  -lvorbisidec \
+                  -ldl \
+        -:PASSTHROUGH LOCAL_ARM_MODE:=arm \
+                      LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \
+       > $@
index ab6a077..645c27d 100644 (file)
@@ -166,7 +166,10 @@ vorbis_dec_finalize (GObject * object)
    */
   GstVorbisDec *vd = GST_VORBIS_DEC (object);
 
+#ifndef USE_TREMOLO
   vorbis_block_clear (&vd->vb);
+#endif
+
   vorbis_dsp_clear (&vd->vd);
   vorbis_comment_clear (&vd->vc);
   vorbis_info_clear (&vd->vi);
@@ -712,11 +715,16 @@ vorbis_handle_type_packet (GstVorbisDec * vd)
 
   g_assert (vd->initialized == FALSE);
 
+#ifdef USE_TREMOLO
+  if (G_UNLIKELY ((res = vorbis_dsp_init (&vd->vd, &vd->vi))))
+    goto synthesis_init_error;
+#else
   if (G_UNLIKELY ((res = vorbis_synthesis_init (&vd->vd, &vd->vi))))
     goto synthesis_init_error;
 
   if (G_UNLIKELY ((res = vorbis_block_init (&vd->vd, &vd->vb))))
     goto block_init_error;
+#endif
 
   vd->initialized = TRUE;
 
@@ -760,7 +768,11 @@ vorbis_handle_header_packet (GstVorbisDec * vd, ogg_packet * packet)
   /* Packetno = 0 if the first byte is exactly 0x01 */
   packet->b_o_s = ((gst_ogg_packet_data (packet))[0] == 0x1) ? 1 : 0;
 
+#ifdef USE_TREMOLO
+  if ((ret = vorbis_dsp_headerin (&vd->vi, &vd->vc, packet)))
+#else
   if ((ret = vorbis_synthesis_headerin (&vd->vi, &vd->vc, packet)))
+#endif
     goto header_read_error;
 
   switch ((gst_ogg_packet_data (packet))[0]) {
@@ -861,7 +873,11 @@ static GstFlowReturn
 vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
     GstClockTime timestamp, GstClockTime duration)
 {
+#ifdef USE_TREMOLO
+  vorbis_sample_t *pcm;
+#else
   vorbis_sample_t **pcm;
+#endif
   guint sample_count;
   GstBuffer *out = NULL;
   GstFlowReturn result;
@@ -876,17 +892,27 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
    * packet to decode the current one so we must be carefull not to
    * throw away too much. For now we decode everything and clip right
    * before pushing data. */
+
+#ifdef USE_TREMOLO
+  if (G_UNLIKELY (vorbis_dsp_synthesis (&vd->vd, packet, 1)))
+    goto could_not_read;
+#else
   if (G_UNLIKELY (vorbis_synthesis (&vd->vb, packet)))
     goto could_not_read;
 
   if (G_UNLIKELY (vorbis_synthesis_blockin (&vd->vd, &vd->vb) < 0))
     goto not_accepted;
+#endif
 
   /* assume all goes well here */
   result = GST_FLOW_OK;
 
   /* count samples ready for reading */
+#ifdef USE_TREMOLO
+  if ((sample_count = vorbis_dsp_pcmout (&vd->vd, NULL, 0)) == 0)
+#else
   if ((sample_count = vorbis_synthesis_pcmout (&vd->vd, NULL)) == 0)
+#endif
     goto done;
 
   size = sample_count * vd->vi.channels * vd->width;
@@ -901,12 +927,19 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
     goto done;
 
   /* get samples ready for reading now, should be sample_count */
+#ifdef USE_TREMOLO
+  pcm = GST_BUFFER_DATA (out);
+  if (G_UNLIKELY ((vorbis_dsp_pcmout (&vd->vd, pcm, sample_count)) != sample_count))
+#else
   if (G_UNLIKELY ((vorbis_synthesis_pcmout (&vd->vd, &pcm)) != sample_count))
+#endif
     goto wrong_samples;
 
+#ifndef USE_TREMOLO
   /* copy samples in buffer */
   vd->copy_samples ((vorbis_sample_t *) GST_BUFFER_DATA (out), pcm,
       sample_count, vd->vi.channels, vd->width);
+#endif
 
   GST_LOG_OBJECT (vd, "setting output size to %d", size);
   GST_BUFFER_SIZE (out) = size;
@@ -927,7 +960,12 @@ done:
     /* no output, still keep track of timestamps */
     vorbis_do_timestamps (vd, NULL, FALSE, timestamp, duration);
   }
+
+#ifdef USE_TREMOLO
+  vorbis_dsp_read (&vd->vd, sample_count);
+#else
   vorbis_synthesis_read (&vd->vd, sample_count);
+#endif
 
   return result;
 
@@ -1243,7 +1281,11 @@ vorbis_dec_change_state (GstElement * element, GstStateChange transition)
     case GST_STATE_CHANGE_PAUSED_TO_READY:
       GST_DEBUG_OBJECT (vd, "PAUSED -> READY, clearing vorbis structures");
       vd->initialized = FALSE;
+
+#ifndef USE_TREMOLO
       vorbis_block_clear (&vd->vb);
+#endif
+
       vorbis_dsp_clear (&vd->vd);
       vorbis_comment_clear (&vd->vc);
       vorbis_info_clear (&vd->vi);
index 0f4b3dd..04e4677 100644 (file)
@@ -22,6 +22,9 @@
 #ifndef __GST_VORBIS_DEC_H__
 #define __GST_VORBIS_DEC_H__
 
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
 
 #include <gst/gst.h>
 #include "gstvorbisdeclib.h"
@@ -56,7 +59,10 @@ struct _GstVorbisDec {
   vorbis_dsp_state  vd;
   vorbis_info       vi;
   vorbis_comment    vc;
+
+#ifndef USE_TREMOLO
   vorbis_block      vb;
+#endif
 
   gboolean          initialized;
   guint             width;
index c82f0c8..ca00af9 100644 (file)
@@ -74,9 +74,15 @@ gst_ogg_packet_from_wrapper (ogg_packet_wrapper * packet)
 
 #else
 
-#include <tremor/ivorbiscodec.h>
+#ifdef USE_TREMOLO
+  #include <Tremolo/ivorbiscodec.h>
+  #include <Tremolo/codec_internal.h>
+  typedef ogg_int16_t                    vorbis_sample_t;
+#else
+  #include <tremor/ivorbiscodec.h>
+  typedef ogg_int32_t                    vorbis_sample_t;
+#endif
 
-typedef ogg_int32_t                    vorbis_sample_t;
 typedef struct _ogg_packet_wrapper     ogg_packet_wrapper;
 
 struct _ogg_packet_wrapper {