347 lines
11 KiB
Diff
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 */
|