- add sndio recording support

- drop sun audio support
- allow non-filenames for audio input names
with feedback from ratchov@
This commit is contained in:
jakemsr 2010-01-11 08:49:27 +00:00
parent 35e16e2203
commit 8df3585b3b
14 changed files with 529 additions and 57 deletions

View File

@ -1,10 +1,11 @@
# $OpenBSD: Makefile,v 1.28 2009/11/03 14:32:33 sthen Exp $
# $OpenBSD: Makefile,v 1.29 2010/01/11 08:49:27 jakemsr Exp $
SHARED_ONLY= Yes
COMMENT= video stream processing tools
DISTNAME= transcode-1.1.5
PKGNAME= ${DISTNAME}p0
CATEGORIES= multimedia
MASTER_SITES= ${MASTER_SITE_BERLIOS:=tcforge/}
EXTRACT_SUFX= .tar.bz2
@ -60,8 +61,9 @@ SEPARATE_BUILD= concurrent
USE_X11= Yes
USE_LIBTOOL= Yes
LIBTOOL_FLAGS+= --tag=disable-static
CONFIGURE_STYLE= autoconf
CONFIGURE_STYLE= autoconf automake
AUTOCONF_VERSION= 2.61
AUTOMAKE_VERSION= 1.9
MODGNU_CONFIG_GUESS_DIRS=${WRKSRC}/autotools
CONFIGURE_ARGS+=--enable-a52 \
--enable-a52-default-decoder \
@ -81,7 +83,7 @@ CONFIGURE_ARGS+=--enable-a52 \
--enable-ogg \
--enable-sdl \
--enable-statbuffer \
--enable-sunau \
--enable-sndio \
--enable-theora \
--enable-vorbis \
--enable-xvid \
@ -123,4 +125,16 @@ CONFIGURE_ARGS+=--enable-altivec
CONFIGURE_ARGS+=--disable-altivec
.endif
post-extract:
cp ${FILESDIR}/import_sndio.c ${WRKSRC}/import/
AUTO_ENV= AUTOCONF_VERSION=${AUTOCONF_VERSION} \
AUTOMAKE_VERSION=${AUTOMAKE_VERSION}
post-patch:
cd ${WRKSRC}; ${AUTO_ENV} aclocal
pre-configure:
cd ${WRKSRC}; ${AUTO_ENV} automake --foreign
.include <bsd.port.mk>

View File

@ -0,0 +1,340 @@
/*
* Copyright (c) 2009 Jacob Meuser <jakemsr@sdf.lonestar.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "transcode.h"
#include "libtc/optstr.h"
#include "libtc/tcmodule-plugin.h"
#define MOD_NAME "import_sndio.so"
#define MOD_VERSION "v0.0.1 (2009-12-24)"
#define MOD_CAP "capture audio using sndio"
#define MOD_FEATURES \
TC_MODULE_FEATURE_AUDIO | TC_MODULE_FEATURE_DEMULTIPLEX
#define MOD_FLAGS \
TC_MODULE_FLAG_RECONFIGURABLE
#include <sndio.h>
static int sndio_init(void *, const char *, int, int, int);
static int sndio_grab(void *, size_t, char *, size_t *);
static int sndio_stop(void *);
struct tc_sndio_data {
struct sio_hdl *hdl;
struct sio_par par;
};
static const char tc_sndio_help[] =
"Overview:\n"
" Captures audio from sndio devices.\n"
"Options:\n"
" device=dev will use 'dev' as the sndio device\n"
" help prints this message\n";
static int
sndio_init(void *data, const char *dev, int rate, int bits, int chan)
{
struct tc_sndio_data *d = data;
if (!strncmp(dev, "/dev/null", 9) ||
!strncmp(dev, "/dev/zero", 9) ||
!strncmp(dev, "default", 7) ||
!strncmp(dev, "", 1))
d->hdl = sio_open(NULL, SIO_REC, 0);
else
d->hdl = sio_open(dev, SIO_REC, 0);
if (!d->hdl) {
tc_log_error(MOD_NAME, "opening audio device failed");
return TC_ERROR;
}
sio_initpar(&d->par);
d->par.bits = bits;
d->par.sig = d->par.bits == 8 ? 0 : 1;
d->par.le = SIO_LE_NATIVE;
d->par.rchan = chan;
d->par.rate = rate;
d->par.xrun = SIO_SYNC;
if (!sio_setpar(d->hdl, &d->par) || !sio_getpar(d->hdl, &d->par)) {
tc_log_error(MOD_NAME, "setting audio parameters failed");
return TC_ERROR;
}
if (d->par.bits != bits || d->par.rchan != chan || d->par.rate != rate) {
tc_log_error(MOD_NAME, "could not set audio parameters as desired");
return TC_ERROR;
}
if (!sio_start(d->hdl)) {
tc_log_error(MOD_NAME, "could not start capture");
return TC_ERROR;
}
return TC_OK;
}
static int
sndio_grab(void *data, size_t size, char *buffer, size_t *done)
{
struct tc_sndio_data *d = data;
size_t bytes_read;
int ret;
if (!d->hdl) {
tc_log_error(MOD_NAME, "attempt to read NULL handle");
return TC_ERROR;
}
bytes_read = 0;
while (size > 0) {
ret = sio_read(d->hdl, buffer + bytes_read, size);
if (!ret) {
tc_log_error(MOD_NAME, "audio read failed");
return TC_ERROR;
}
bytes_read += ret;
size -= ret;
}
if (done != NULL)
*done = bytes_read;
return TC_OK;
}
static int
sndio_stop(void *data)
{
struct tc_sndio_data *d = data;
if (d->hdl)
sio_close(d->hdl);
d->hdl = NULL;
return TC_OK;
}
/* ------------------------------------------------------------
* NMS interface
* ------------------------------------------------------------*/
static int
tc_sndio_init(TCModuleInstance *self, uint32_t features)
{
struct tc_sndio_data *d;
TC_MODULE_SELF_CHECK(self, "init");
TC_MODULE_INIT_CHECK(self, MOD_FEATURES, features);
d = tc_zalloc(sizeof(struct tc_sndio_data));
if (!d)
return TC_ERROR;
self->userdata = d;
return TC_OK;
}
static int
tc_sndio_fini(TCModuleInstance *self)
{
TC_MODULE_SELF_CHECK(self, "fini");
tc_free(self->userdata);
self->userdata = NULL;
return TC_OK;
}
static int
tc_sndio_inspect(TCModuleInstance *self, const char *param, const char **value)
{
TC_MODULE_SELF_CHECK(self, "inspect");
if (optstr_lookup(param, "help"))
*value = tc_sndio_help;
return TC_OK;
}
static int
tc_sndio_configure(TCModuleInstance *self, const char *options, vob_t *vob)
{
struct tc_sndio_data *d = NULL;
char device[1024];
TC_MODULE_SELF_CHECK(self, "configure");
d = self->userdata;
strlcpy(device, "default", 1024);
if (options)
optstr_get(options, "device", "%1023s", device);
return sndio_init(d, device, vob->a_rate, vob->a_bits, vob->a_chan);
}
static int
tc_sndio_stop(TCModuleInstance *self)
{
struct tc_sndio_data *d = NULL;
TC_MODULE_SELF_CHECK(self, "stop");
d = self->userdata;
return sndio_stop(d);
}
static int
tc_sndio_demux(TCModuleInstance *self, vframe_list_t *vf, aframe_list_t *af)
{
struct tc_sndio_data *d = NULL;
size_t done;
TC_MODULE_SELF_CHECK(self, "demultiplex");
d = self->userdata;
if (vf)
vf->video_len = 0;
if (af) {
if (sndio_grab(d, af->audio_size, af->audio_buf, &done) != TC_OK)
return TC_ERROR;
af->audio_len = done;
}
return TC_OK;
}
static const TCCodecID tc_sndio_codecs_in[] =
{ TC_CODEC_ERROR };
static const TCCodecID tc_sndio_codecs_out[] =
{ TC_CODEC_PCM, TC_CODEC_ERROR };
static const TCCodecID tc_sndio_formats_in[] =
{ TC_FORMAT_RAW, TC_FORMAT_ERROR };
static const TCCodecID tc_sndio_formats_out[] =
{ TC_CODEC_ERROR };
static const TCModuleInfo tc_sndio_info = {
.features = MOD_FEATURES,
.flags = MOD_FLAGS,
.name = MOD_NAME,
.version = MOD_VERSION,
.description = MOD_CAP,
.codecs_in = tc_sndio_codecs_in,
.codecs_out = tc_sndio_codecs_out,
.formats_in = tc_sndio_formats_in,
.formats_out = tc_sndio_formats_out
};
static const TCModuleClass tc_sndio_class = {
TC_MODULE_CLASS_HEAD(tc_sndio),
.init = tc_sndio_init,
.fini = tc_sndio_fini,
.configure = tc_sndio_configure,
.stop = tc_sndio_stop,
.inspect = tc_sndio_inspect,
.demultiplex = tc_sndio_demux
};
TC_MODULE_ENTRY_POINT(tc_sndio)
/* ------------------------------------------------------------
* old interface
* ------------------------------------------------------------*/
static int verbose_flag = TC_QUIET;
static int capability_flag = TC_CAP_PCM;
#define MOD_PRE sndio
#define MOD_CODEC "(audio) pcm"
#include "import_def.h"
static struct tc_sndio_data data;
MOD_open
{
int ret = TC_OK;
switch (param->flag) {
case TC_VIDEO:
tc_log_warn(MOD_NAME, "unsupported request (open video)");
ret = TC_ERROR;
break;
case TC_AUDIO:
if (verbose_flag & TC_DEBUG)
tc_log_info(MOD_NAME, "sndio audio capture");
ret = sndio_init(&data, vob->audio_in_file, vob->a_rate,
vob->a_bits, vob->a_chan);
break;
default:
tc_log_warn(MOD_NAME, "unsupported request (open)");
ret = TC_ERROR;
break;
}
return ret;
}
MOD_decode
{
int ret = TC_OK;
switch (param->flag) {
case TC_VIDEO:
tc_log_error(MOD_NAME, "unsupported request (decode video)");
ret = TC_ERROR;
break;
case TC_AUDIO:
ret = sndio_grab(&data, param->size, param->buffer, NULL);
break;
default:
tc_log_error(MOD_NAME, "unsupported request (decode)");
ret = TC_ERROR;
break;
}
return ret;
}
MOD_close
{
int ret = TC_OK;
switch (param->flag) {
case TC_VIDEO:
tc_log_error(MOD_NAME, "unsupported request (close video)");
ret = TC_ERROR;
break;
case TC_AUDIO:
ret = sndio_stop(&data);
break;
default:
tc_log_error(MOD_NAME, "unsupported request (close)");
ret = TC_ERROR;
break;
}
return ret;
}

View File

@ -0,0 +1,12 @@
$OpenBSD: gcc-filter_yuvdenoise_Makefile_am,v 1.1 2010/01/11 08:49:27 jakemsr Exp $
--- filter/yuvdenoise/Makefile.am.orig Sat Feb 21 06:34:02 2009
+++ filter/yuvdenoise/Makefile.am Fri Dec 25 02:57:18 2009
@@ -5,6 +5,8 @@ AM_CPPFLAGS = \
-I$(top_srcdir) \
-I$(top_srcdir)/src
+CFLAGS = -O0 -Wall
+
pkgdir = $(MOD_PATH)
pkg_LTLIBRARIES = \

View File

@ -1,24 +0,0 @@
$OpenBSD: gcc-filter_yuvdenoise_Makefile_in,v 1.4 2009/08/18 22:24:13 sthen Exp $
--- filter/yuvdenoise/Makefile.in.orig Sat Mar 28 05:13:17 2009
+++ filter/yuvdenoise/Makefile.in Sun Jun 7 23:54:37 2009
@@ -428,6 +428,20 @@ distclean-compile:
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+deinterlace.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -O0 -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+denoise.lo:
+@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -O0 -c -o $@ $<; \
+@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
mostlyclean-libtool:
-rm -f *.lo

View File

@ -0,0 +1,11 @@
$OpenBSD: patch-Makefile_am,v 1.1 2010/01/11 08:49:27 jakemsr Exp $
--- Makefile.am.orig Thu Dec 24 22:43:57 2009
+++ Makefile.am Thu Dec 24 22:44:09 2009
@@ -24,7 +24,6 @@ SUBDIRS = \
multiplex \
$(PVM3) \
src \
- testsuite \
tools \
docs

View File

@ -1,11 +0,0 @@
$OpenBSD: patch-Makefile_in,v 1.2 2009/11/03 14:32:33 sthen Exp $
--- Makefile.in.orig Sat Oct 31 13:41:03 2009
+++ Makefile.in Sun Nov 1 20:42:17 2009
@@ -315,7 +315,6 @@ SUBDIRS = \
multiplex \
$(PVM3) \
src \
- testsuite \
tools \
docs

View File

@ -0,0 +1,42 @@
$OpenBSD: patch-acinclude_m4,v 1.1 2010/01/11 08:49:27 jakemsr Exp $
--- acinclude.m4.orig Sat Oct 31 09:39:02 2009
+++ acinclude.m4 Wed Jan 6 01:37:50 2010
@@ -271,6 +271,38 @@ if test x"$enable_sunau" = x"yes" ; then
ifelse([$1], , :, [$1])
else
AC_MSG_ERROR([sunau is requested, but cannot find headers])
+ fi
+fi
+])
+
+dnl -----------------------------------------------------------------------
+
+dnl TC_CHECK_SNDIO([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
+dnl Test for sndio headers
+dnl
+AC_DEFUN([TC_CHECK_SNDIO],
+[
+AC_MSG_CHECKING([whether sndio support is requested])
+AC_ARG_ENABLE(sndio,
+ AC_HELP_STRING([--enable-sndio],
+ [enable sndio support (no)]),
+ [case "${enableval}" in
+ yes) ;;
+ no) ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-sndio) ;;
+ esac],
+ [enable_sndio=no])
+AC_MSG_RESULT($enable_sndio)
+
+have_sndio="no"
+if test x"$enable_sndio" = x"yes" ; then
+ AC_CHECK_HEADERS([sndio.h], [have_sndio="yes"])
+
+ if test x"$have_sndio" = x"yes" ; then
+ have_sndio="yes"
+ ifelse([$1], , :, [$1])
+ else
+ AC_MSG_ERROR([sndio is requested, but cannot find headers])
fi
fi
])

View File

@ -0,0 +1,11 @@
$OpenBSD: patch-avilib_Makefile_am,v 1.1 2010/01/11 08:49:27 jakemsr Exp $
--- avilib/Makefile.am.orig Thu Dec 24 22:44:38 2009
+++ avilib/Makefile.am Thu Dec 24 22:45:00 2009
@@ -2,6 +2,7 @@
AM_CPPFLAGS = \
$(PTHREAD_CFLAGS) \
+ -I$(top_srcdir) \
$(XIO_CFLAGS)
noinst_LTLIBRARIES = libavi.la libwav.la

View File

@ -1,11 +0,0 @@
$OpenBSD: patch-avilib_Makefile_in,v 1.2 2009/11/03 14:32:33 sthen Exp $
--- avilib/Makefile.in.orig Sat Oct 31 13:40:59 2009
+++ avilib/Makefile.in Sun Nov 1 20:42:17 2009
@@ -288,6 +288,7 @@ x_libraries = @x_libraries@
xvid_config = @xvid_config@
AM_CPPFLAGS = \
$(PTHREAD_CFLAGS) \
+ -I$(top_srcdir) \
$(XIO_CFLAGS)
noinst_LTLIBRARIES = libavi.la libwav.la

View File

@ -1,7 +1,20 @@
$OpenBSD: patch-configure_in,v 1.2 2009/11/03 14:32:33 sthen Exp $
--- configure.in.orig Sat Oct 31 12:39:02 2009
+++ configure.in Sun Nov 1 20:42:17 2009
@@ -888,7 +888,8 @@ TC_PKG_HAVE(lame, LAME)
$OpenBSD: patch-configure_in,v 1.3 2010/01/11 08:49:27 jakemsr Exp $
--- configure.in.orig Sat Oct 31 09:39:02 2009
+++ configure.in Thu Dec 24 22:25:36 2009
@@ -791,6 +791,12 @@ TC_CHECK_SUNAU(AC_DEFINE([HAVE_SUNAU], 1, [Have Sun st
AM_CONDITIONAL(HAVE_SUNAU, test x"$have_sunau" = x"yes")
dnl
+dnl sndio
+dnl
+TC_CHECK_SNDIO(AC_DEFINE([HAVE_SNDIO], 1, [Have sndio(7) audio]))
+AM_CONDITIONAL(HAVE_SNDIO, test x"$have_sndio" = x"yes")
+
+dnl
dnl OSS
dnl
TC_CHECK_OSS(AC_DEFINE([HAVE_OSS], 1, [Have OSS audio]))
@@ -888,7 +894,8 @@ TC_PKG_HAVE(lame, LAME)
dnl
dnl xvid
dnl
@ -11,7 +24,7 @@ $OpenBSD: patch-configure_in,v 1.2 2009/11/03 14:32:33 sthen Exp $
[http://www.xvid.org/])
if test x"$have_xvid" = x"yes" ; then
AC_MSG_CHECKING([xvid version >= 1.0])
@@ -907,7 +908,7 @@ int main() {
@@ -907,7 +914,7 @@ int main() {
[cannot compile and run a test program])],,
[AC_MSG_RESULT([cross compiling; assumed OK...])])
if test x"$xvid_version_ok" = x"yes"; then
@ -20,3 +33,11 @@ $OpenBSD: patch-configure_in,v 1.2 2009/11/03 14:32:33 sthen Exp $
else
have_xvid="no"
TC_PKG_ERROR(xvid, xvid.h, yes, xvid, [http://www.xvid.org/],
@@ -1487,6 +1494,7 @@ ALSA $have_alsa
OSS $have_oss
bktr $have_bktr
sunau $have_sunau
+sndio $have_sndio
optional module support
----------------------------------------

View File

@ -0,0 +1,33 @@
$OpenBSD: patch-import_Makefile_am,v 1.1 2010/01/11 08:49:27 jakemsr Exp $
--- import/Makefile.am.orig Thu Dec 24 22:21:38 2009
+++ import/Makefile.am Thu Dec 24 22:23:52 2009
@@ -59,6 +59,10 @@ if HAVE_SUNAU
IMPORT_SUNAU = import_sunau.la
endif
+if HAVE_SNDIO
+IMPORT_SNDIO = import_sndio.la
+endif
+
if HAVE_LIBXML2
IMPORT_XML = import_xml.la
endif
@@ -103,6 +107,7 @@ pkg_LTLIBRARIES = \
import_pvn.la \
import_raw.la \
$(IMPORT_SUNAU) \
+ $(IMPORT_SNDIO) \
import_vag.la \
import_vnc.la \
import_vob.la \
@@ -198,6 +203,10 @@ import_raw_la_LDFLAGS = -module -avoid-version
import_sunau_la_SOURCES = import_sunau.c
import_sunau_la_LDFLAGS = -module -avoid-version
+
+import_sndio_la_SOURCES = import_sndio.c
+import_sndio_la_LDFLAGS = -module -avoid-version
+import_sndio_la_LIBADD = -lsndio
import_vag_la_SOURCES = import_vag.c
import_vag_la_LDFLAGS = -module -avoid-version

View File

@ -0,0 +1,16 @@
$OpenBSD: patch-libtc_tcglob_c,v 1.1 2010/01/11 08:49:27 jakemsr Exp $
don't try to access tcg->glob.gl_pathv[-1]
--- libtc/tcglob.c.orig Wed Jan 6 00:58:04 2010
+++ libtc/tcglob.c Wed Jan 6 01:00:55 2010
@@ -77,8 +77,7 @@ const char *tc_glob_next(TCGlob *tcg)
if (tcg != NULL) {
if (tcg->current == -1) {
ret = tcg->pattern;
- }
- if (tcg->current < tcg->glob.gl_pathc) {
+ } else if (tcg->current < tcg->glob.gl_pathc) {
ret = tcg->glob.gl_pathv[tcg->current];
}
tcg->current++;

View File

@ -0,0 +1,18 @@
$OpenBSD: patch-src_transcode_c,v 1.1 2010/01/11 08:49:27 jakemsr Exp $
audio input name isn't necessarily a file
--- src/transcode.c.orig Wed Jan 6 01:12:40 2010
+++ src/transcode.c Wed Jan 6 01:13:06 2010
@@ -1213,9 +1213,11 @@ static void setup_input_sources(vob_t *vob)
/* we always have at least one source */
tc_next_audio_in_file(vob);
}
+#if 0
if (!validate_source_path(vob->audio_in_file)) {
tc_error("invalid input audio file: %s", vob->audio_in_file);
}
+#endif
}
static void teardown_input_sources(vob_t *vob)

View File

@ -1,4 +1,4 @@
@comment $OpenBSD: PLIST,v 1.5 2009/08/18 22:24:14 sthen Exp $
@comment $OpenBSD: PLIST,v 1.6 2010/01/11 08:49:27 jakemsr Exp $
%%i386%%
%%lzo%%
%%mjpegtools%%
@ -197,8 +197,8 @@ lib/transcode/import_ogg.so
lib/transcode/import_pvn.so
@comment lib/transcode/import_raw.la
lib/transcode/import_raw.so
@comment lib/transcode/import_sunau.la
lib/transcode/import_sunau.so
@comment lib/transcode/import_sndio.la
lib/transcode/import_sndio.so
@comment lib/transcode/import_vag.la
lib/transcode/import_vag.so
@comment lib/transcode/import_vnc.la