use dlopen for vorbis encoder to load so when actual needed, this will reduce runtime... 05/68105/3 accepted/tizen/common/20160504.125847 accepted/tizen/ivi/20160504.011131 accepted/tizen/mobile/20160504.011037 accepted/tizen/tv/20160504.011055 accepted/tizen/wearable/20160504.011111 submit/tizen/20160503.074218
authorSeungbae Shin <seungbae.shin@samsung.com>
Mon, 2 May 2016 08:32:17 +0000 (17:32 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Tue, 3 May 2016 03:04:01 +0000 (12:04 +0900)
Change-Id: I7b3b6b82cafde364b752812523221ce430ae0526

examples/generate.c
packaging/libsndfile.spec
src/ogg_vorbis.c

index 884e8d7..44cb6f2 100644 (file)
@@ -60,6 +60,9 @@ main (int argc, char **argv)
        encode_file (argv [1], "imaadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM) ;
        encode_file (argv [1], "msadpcm.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM) ;
        encode_file (argv [1], "gsm610.wav"     , SF_FORMAT_WAV | SF_FORMAT_GSM610) ;
+#if 0 /* For temporal testing of encoding ogg/vorbis functionality */
+       encode_file (argv [1], "pcm16.ogg"      , SF_FORMAT_OGG | SF_FORMAT_VORBIS) ;
+#endif
 
        /* Soundforge W64. */
        encode_file (argv [1], "pcmu8.w64"      , SF_FORMAT_W64 | SF_FORMAT_PCM_U8) ;
index d32f6c5..5de68c4 100644 (file)
@@ -39,8 +39,10 @@ cp %{SOURCE1001} .
 %build
 %define warn_flags -W -Wall -Wstrict-prototypes -Wpointer-arith -Wno-unused-parameter
 autoreconf --force --install
-CFLAGS="%{optflags} %{warn_flags}"
+CFLAGS="%{optflags} %{warn_flags} -D__TIZEN__"
 export CFLAGS
+LDFLAGS="-ldl"
+export LDFLAGS
 %configure --disable-static \
     --disable-dependency-tracking \
     --disable-sqlite --disable-alsa
index e384ea6..45dc568 100644 (file)
 
 #if HAVE_EXTERNAL_LIBS
 
+
 #include <ogg/ogg.h>
 #include <vorbis/codec.h>
-#if ENABLE_VORBIS_ENC /* default disabled for memory optimization */
+
+#ifdef __TIZEN__
+#include <dlfcn.h> /* for dlopen */
+#else
 #include <vorbis/vorbisenc.h>
 #endif
 
@@ -129,6 +133,11 @@ typedef struct
 
        /* Encoding quality in range [0.0, 1.0]. */
        double quality ;
+
+#ifdef __TIZEN__
+       /* func ptr for encoder */
+       void *dl;
+#endif
 } VORBIS_PRIVATE ;
 
 static int
@@ -340,6 +349,41 @@ vorbis_read_header (SF_PRIVATE *psf, int log_data)
        return 0 ;
 } /* vorbis_read_header */
 
+
+#ifdef __TIZEN__
+#define VORBIS_ENC_SO_NAME "/usr/lib/libvorbisenc.so.2" /* FIXME : Any good way to avoid hardcoding? */
+#define VORBIS_ENC_INIT_VBR "vorbis_encode_init_vbr"
+
+static int
+_vorbis_encode_init(SF_PRIVATE *psf)
+{
+       int (*fn) (vorbis_info *, long, long, float);
+       void *dl = NULL;
+       VORBIS_PRIVATE *vdata = (VORBIS_PRIVATE *) psf->codec_data ;
+
+       /* load so */
+       dl = dlopen(VORBIS_ENC_SO_NAME, RTLD_GLOBAL | RTLD_NOW);
+       if (!dl) {
+               psf_log_printf (psf, "failed to dlopen [%s], error [%s]\n", VORBIS_ENC_SO_NAME, dlerror());
+               return -1;
+       }
+       dlerror();
+
+       vdata->dl = dl;
+
+       /* load symbol */
+       fn = dlsym(dl, VORBIS_ENC_INIT_VBR);
+       if (!fn) {
+               psf_log_printf (psf, "failed to dlsym [%s], error [%s]\n", VORBIS_ENC_INIT_VBR, dlerror());
+               return -1;
+       }
+       dlerror();
+
+       /* call function */
+       return fn(&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, vdata->quality);
+}
+#endif /* __TIZEN__ */
+
 static int
 vorbis_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
 {
@@ -350,7 +394,9 @@ vorbis_write_header (SF_PRIVATE *psf, int UNUSED (calc_length))
        vorbis_info_init (&vdata->vinfo) ;
 
        /* The style of encoding should be selectable here, VBR quality mode. */
-#if ENABLE_VORBIS_ENC
+#ifdef __TIZEN__
+       ret = _vorbis_encode_init(psf);
+#else
        ret = vorbis_encode_init_vbr (&vdata->vinfo, psf->sf.channels, psf->sf.samplerate, vdata->quality) ;
 #endif
 
@@ -487,6 +533,13 @@ vorbis_close (SF_PRIVATE *psf)
        vorbis_comment_clear (&vdata->vcomment) ;
        vorbis_info_clear (&vdata->vinfo) ;
 
+#ifdef __TIZEN__
+       if (vdata->dl) {
+               dlclose(vdata->dl);
+               vdata->dl = NULL;
+       }
+#endif
+
        return 0 ;
 } /* vorbis_close */