Files
sablink-distro/media-libs/libmimic/files/libmimic-1.0.4-add-python-bindings.patch
T

347 lines
11 KiB
Diff

diff -Nur -x '*.orig' -x '*~' libmimic-1.0.4/acinclude.m4 libmimic-1.0.4.new/acinclude.m4
--- libmimic-1.0.4/acinclude.m4 1970-01-01 01:00:00.000000000 +0100
+++ libmimic-1.0.4.new/acinclude.m4 2009-07-09 19:59:15.000000000 +0200
@@ -0,0 +1,32 @@
+dnl From msw.
+dnl
+dnl a macro to check for ability to create python extensions
+dnl AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE])
+dnl function also defines PYTHON_INCLUDES
+AC_DEFUN([AM_CHECK_PYTHON_HEADERS],
+[AC_REQUIRE([AM_PATH_PYTHON])
+AC_MSG_CHECKING(for headers required to compile python extensions)
+dnl deduce PYTHON_INCLUDES
+py_prefix=`$PYTHON -c "import sys; print sys.prefix"`
+py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"`
+if test -x "$PYTHON-config"; then
+ PYTHON_INCLUDES=`$PYTHON-config --includes 2>/dev/null`
+else
+ PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}"
+ if test "$py_prefix" != "$py_exec_prefix"; then
+ PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}"
+ fi
+fi
+PYTHON_LIBS="-L${py_prefix}/libs -lpython${PYTHON_VERSION}"
+AC_SUBST(PYTHON_INCLUDES)
+AC_SUBST(PYTHON_LIBS)
+dnl check if the headers exist:
+save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES"
+AC_TRY_CPP([#include <Python.h>],dnl
+[AC_MSG_RESULT(found)
+$1],dnl
+[AC_MSG_RESULT(not found)
+$2])
+CPPFLAGS="$save_CPPFLAGS"
+])
diff -Nur -x '*.orig' -x '*~' libmimic-1.0.4/configure.ac libmimic-1.0.4.new/configure.ac
--- libmimic-1.0.4/configure.ac 2009-07-09 19:59:14.000000000 +0200
+++ libmimic-1.0.4.new/configure.ac 2009-07-09 19:59:24.000000000 +0200
@@ -29,6 +29,32 @@
AC_PROG_CC
AC_PROG_INSTALL
+dnl Python bindings
+AC_ARG_ENABLE(python, [ --enable-python build python bindings],enable_python=$enableval,enable_python=auto)
+
+AC_MSG_CHECKING([whether to build python bindings])
+
+BUILD_PYTHON=false
+if test x$enable_python != xno; then
+ AM_PATH_PYTHON
+ if test -n "$PYTHON"; then
+ BUILD_PYTHON=true
+ fi
+fi
+
+if $BUILD_PYTHON; then
+ AM_CHECK_PYTHON_HEADERS(,BUILD_PYTHON=false)
+fi
+
+if ! $BUILD_PYTHON; then
+ AC_MSG_RESULT([Python bindings disabled])
+fi
+
+AC_SUBST(PYTHONREV)
+AC_SUBST(PYTHON_MODULES)
+AM_CONDITIONAL(BUILD_PYTHON_MODULES, $BUILD_PYTHON)
+
+
dnl Documentation.
AC_ARG_ENABLE(doxygen-docs, [ --enable-doxygen-docs build Doxygen documentation],enable_doxygen_docs=$enableval,enable_doxygen_docs=auto)
@@ -74,6 +100,7 @@
Makefile
doc/Makefile
doc/Doxyfile
+python/Makefile
src/Makefile
])
diff -Nur -x '*.orig' -x '*~' libmimic-1.0.4/Makefile.am libmimic-1.0.4.new/Makefile.am
--- libmimic-1.0.4/Makefile.am 2006-02-07 10:53:40.000000000 +0100
+++ libmimic-1.0.4.new/Makefile.am 2009-07-09 19:59:15.000000000 +0200
@@ -1,4 +1,4 @@
-SUBDIRS = src doc
+SUBDIRS = src python doc
### all of the standard pc files we need to generate
pcfiles = \
diff -Nur -x '*.orig' -x '*~' libmimic-1.0.4/python/Makefile.am libmimic-1.0.4.new/python/Makefile.am
--- libmimic-1.0.4/python/Makefile.am 1970-01-01 01:00:00.000000000 +0100
+++ libmimic-1.0.4.new/python/Makefile.am 2009-07-09 19:59:15.000000000 +0200
@@ -0,0 +1,14 @@
+PYTHON_MODULES = libmimic.la
+
+if BUILD_PYTHON_MODULES
+
+pythonsiteexecdir = $(pyexecdir)
+pythonsiteexec_LTLIBRARIES = $(PYTHON_MODULES)
+
+libmimic_la_SOURCES = py_libmimic.c
+libmimic_la_CPPFLAGS = -I$(top_srcdir)/src $(AM_CPPFLAGS)
+libmimic_la_CFLAGS = $(PYTHON_INCLUDES) $(AM_CFLAGS) $(GLIB_CFLAGS)
+libmimic_la_LDFLAGS = -module -avoid-version $(PYTHON_LIBS) $(PYTHON_LDFLAGS) $(AM_LDFLAGS)
+libmimic_la_LIBADD = $(top_builddir)/src/libmimic.la $(LIBS)
+
+endif
diff -Nur -x '*.orig' -x '*~' libmimic-1.0.4/python/py_libmimic.c libmimic-1.0.4.new/python/py_libmimic.c
--- libmimic-1.0.4/python/py_libmimic.c 1970-01-01 01:00:00.000000000 +0100
+++ libmimic-1.0.4.new/python/py_libmimic.c 2009-07-09 19:59:15.000000000 +0200
@@ -0,0 +1,172 @@
+/*
+ * This file is part of emesene.
+ *
+ * Emesene is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Emesene is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ *
+ * TODO:
+ * - set useful exception messages
+ */
+
+#include <Python.h>
+#include "py_libmimic.h"
+
+/* init module */
+PyMODINIT_FUNC
+initlibmimic(void)
+{
+ PyObject* m;
+ m = Py_InitModule("libmimic", LibmimicMethods);
+}
+static void close_decoder(void* ptr) {
+ MimicDecoder* decoder;
+ decoder = (MimicDecoder*)ptr;
+ mimic_close(decoder->codec);
+ free(decoder);
+}
+static PyObject* libmimic_new_decoder(PyObject *self, PyObject *args) {
+ MimicDecoder* decoder;
+
+ /* accept no arguments */
+ if(!PyArg_ParseTuple(args, ""))
+ return NULL;
+
+ decoder = (MimicDecoder*)malloc(sizeof(MimicDecoder));
+ if(!decoder) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ decoder->codec = mimic_open();
+ decoder->is_init = 0;
+
+ return PyCObject_FromVoidPtr(decoder, close_decoder);
+}
+static PyObject* libmimic_new_encoder(PyObject *self, PyObject *args) {
+ MimicEncoder* encoder;
+ unsigned char arg_resolution;
+ MimicResEnum resolution;
+
+ /* accept one argument, resolution: 0 = low, 1 = high */
+ if(!PyArg_ParseTuple(args, "b", &arg_resolution))
+ return NULL;
+
+ encoder = (MimicEncoder*)malloc(sizeof(MimicEncoder));
+ if(!encoder) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ encoder->codec = mimic_open();
+ encoder->num_frames = 0;
+
+ resolution = arg_resolution ? MIMIC_RES_HIGH : MIMIC_RES_LOW;
+ mimic_encoder_init(encoder->codec, resolution);
+
+ return PyCObject_FromVoidPtr(encoder, close_decoder);
+}
+static PyObject* libmimic_decode(PyObject *self, PyObject *args) {
+ MimicDecoder* decoder;
+ BYTE* output;
+ unsigned int width, height, length;
+
+ /* parameters */
+ PyObject* pyobj = NULL;
+ BYTE* input;
+ int inputsize;
+
+ if(!PyArg_ParseTuple(args, "Os#", &pyobj, &input, &inputsize))
+ return NULL;
+
+ decoder = PyCObject_AsVoidPtr(pyobj);
+ if(!decoder) {
+ /* TODO: ERROR */
+ return NULL;
+ }
+
+ if (!decoder->is_init) {
+ if (!mimic_decoder_init(decoder->codec, input + HEADER_SIZE)) {
+ /* TODO: ERROR */
+ return NULL;
+ } else {
+ decoder->is_init = 1;
+ }
+ }
+
+ mimic_get_property(decoder->codec, "buffer_size", &length);
+ mimic_get_property(decoder->codec, "width", &width);
+ mimic_get_property(decoder->codec, "height", &height);
+
+ output = (BYTE*)malloc(length);
+ if(!output) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ if (!mimic_decode_frame(decoder->codec, input + HEADER_SIZE, output)) {
+ /* TODO: ERROR */
+ free(output);
+ return NULL;
+ }
+
+ PyObject* val = Py_BuildValue("iis#", width, height, output, length);
+ free(output);
+ return val;
+}
+
+static PyObject* libmimic_encode(PyObject *self, PyObject *args) {
+ MimicEncoder* encoder;
+ BYTE* output;
+ int length, width, height;
+
+ /* parameters */
+ PyObject* pyobj = NULL;
+ BYTE* input;
+ int inputsize;
+
+ if(!PyArg_ParseTuple(args, "Os#", &pyobj, &input, &inputsize))
+ return NULL;
+
+ encoder = PyCObject_AsVoidPtr(pyobj);
+ if(!encoder) {
+ /* TODO: ERROR */
+ return NULL;
+ }
+
+ mimic_get_property(encoder->codec, "buffer_size", &length);
+
+ output = (BYTE*)malloc(length * 3);
+ if(!output) {
+ PyErr_NoMemory();
+ return NULL;
+ }
+
+ if (!mimic_encode_frame(encoder->codec, input, output, &length,
+ encoder->num_frames % 10 == 0)) {
+ /* TODO: ERROR */
+ free(output);
+ return NULL;
+ }
+
+ encoder->num_frames++;
+
+ mimic_get_property(encoder->codec, "width", &width);
+ mimic_get_property(encoder->codec, "height", &height);
+ PyObject* val = Py_BuildValue("s#ii", output, length, width, height);
+ free(output);
+
+ return val;
+}
+
diff -Nur -x '*.orig' -x '*~' libmimic-1.0.4/python/py_libmimic.h libmimic-1.0.4.new/python/py_libmimic.h
--- libmimic-1.0.4/python/py_libmimic.h 1970-01-01 01:00:00.000000000 +0100
+++ libmimic-1.0.4.new/python/py_libmimic.h 2009-07-09 19:59:15.000000000 +0200
@@ -0,0 +1,59 @@
+/*
+ * This file is part of emesene.
+ *
+ * Emesene is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Emesene is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#ifndef _LIBMIMIC_PYLIBMIMIC_H
+#define _LIBMIMIC_PYLIBMIMIC_H
+
+#include <Python.h>
+#include "mimic.h"
+
+#define HEADER_SIZE 24
+
+typedef unsigned char BYTE;
+typedef unsigned short WORD;
+typedef unsigned int DWORD;
+
+typedef struct MimicDecoder {
+ MimCtx* codec;
+ unsigned char is_init;
+} MimicDecoder;
+
+typedef struct MimicEncoder {
+ MimCtx* codec;
+ unsigned int num_frames;
+} MimicEncoder;
+
+PyMODINIT_FUNC initlibmimic(void);
+
+static PyObject* libmimic_new_decoder(PyObject* self, PyObject* args);
+static PyObject* libmimic_new_encoder(PyObject* self, PyObject* args);
+
+static PyObject* libmimic_decode(PyObject* self, PyObject* args);
+static PyObject* libmimic_encode(PyObject* self, PyObject* args);
+
+/* method table */
+static PyMethodDef LibmimicMethods[] = {
+ {"new_decoder", libmimic_new_decoder, METH_VARARGS, "New decoder"},
+ {"new_encoder", libmimic_new_encoder, METH_VARARGS, "New encoder"},
+ {"decode", libmimic_decode, METH_VARARGS, "Decode a frame"},
+ {"encode", libmimic_encode, METH_VARARGS, "Encode a frame"},
+ {NULL, NULL, 0, NULL} /* Sentinel */
+};
+
+#endif /* _LIBMIMIC_PYLIBMIMIC_H */