summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rwxr-xr-xconfigure31
-rw-r--r--etc/codecs.conf9
-rw-r--r--libmpcodecs/Makefile4
-rw-r--r--libmpcodecs/vd.c4
-rw-r--r--libmpcodecs/vd_lzo.c148
6 files changed, 197 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index ed3f5d1f2e..97e7d9d838 100644
--- a/Makefile
+++ b/Makefile
@@ -45,7 +45,7 @@ AO_LIBS = libao2/libao2.a
A_LIBS = $(ALSA_LIB) $(ARTS_LIB) $(NAS_LIB) $(MAD_LIB) $(VORBIS_LIB) $(FAAD_LIB) $(SGIAUDIO_LIB)
CODEC_LIBS = libmpcodecs/libmpcodecs.a mp3lib/libMP3.a liba52/liba52.a libmpeg2/libmpeg2.a $(AV_LIB) $(FAME_LIB)
-COMMON_LIBS = $(CODEC_LIBS) libaf/libaf.a libmpdemux/libmpdemux.a input/libinput.a postproc/libpostproc.a linux/libosdep.a $(LIB_LOADER) $(FREETYPE_LIB) $(A_LIBS) $(CSS_LIB) $(XVID_LIB) $(DECORE_LIB) $(TERMCAP_LIB) $(STREAMING_LIB) $(Z_LIB) $(GTK_LIBS) $(PNG_LIB) $(JPEG_LIB) $(GIF_LIB) $(CDPARANOIA_LIB) $(ARCH_LIB) -lm
+COMMON_LIBS = $(CODEC_LIBS) libaf/libaf.a libmpdemux/libmpdemux.a input/libinput.a postproc/libpostproc.a linux/libosdep.a $(LIB_LOADER) $(FREETYPE_LIB) $(A_LIBS) $(CSS_LIB) $(XVID_LIB) $(DECORE_LIB) $(TERMCAP_LIB) $(STREAMING_LIB) $(Z_LIB) $(GTK_LIBS) $(PNG_LIB) $(JPEG_LIB) $(LZO_LIB) $(GIF_LIB) $(CDPARANOIA_LIB) $(ARCH_LIB) -lm
ifeq ($(VIDIX),yes)
MISC_LIBS += -Llibdha -ldha vidix/libvidix.a
endif
diff --git a/configure b/configure
index 2429779b1b..38256cd60f 100755
--- a/configure
+++ b/configure
@@ -155,6 +155,7 @@ Codecs:
--enable-gif enable gif89a output support [autodetect]
--enable-png enable png input/output support [autodetect]
--enable-jpeg enable jpeg input/output support [autodetect]
+ --enable-lzo enable lzo input support [autodetect]
--disable-win32 disable Win32 DLL support [autodetect]
--disable-dshow disable Win32/DirectShow support [autodetect]
--disable-xanim disable XAnim DLL support [autodetect]
@@ -949,6 +950,7 @@ _iconv=auto
_rtc=auto
_ossaudio=auto
_arts=auto
+_lzo=auto
_mad=auto
_vorbis=auto
_faad=auto
@@ -1073,6 +1075,8 @@ for ac_option do
--disable-arts) _arts=no ;;
--enable-mad) _mad=yes ;;
--disable-mad) _mad=no ;;
+ --enable-lzo) _lzo=yes ;;
+ --disable-lzo) _lzo=no ;;
--enable-vorbis) _vorbis=yes ;;
--disable-vorbis) _vorbis=no ;;
--enable-faad) _faad=yes ;;
@@ -3395,6 +3399,28 @@ else
fi
+echocheck "lzo support"
+if test "$_lzo" = auto ; then
+ _lzo=no
+ cat > $TMPC << EOF
+#include <lzo1x.h>
+int main(void) { lzo_init();return 0; }
+EOF
+ cc_check -llzo && _lzo=yes
+fi
+if test "$_lzo" = yes ; then
+ _def_lzo='#define USE_LZO 1'
+ _ld_lzo='-llzo'
+ _codecmodules="lzo $_codecmodules"
+ _mkf_lzo="yes"
+else
+ _def_lzo='#undef USE_LZO'
+ _nocodecmodules="lzo $_nocodecmodules"
+ _mkf_lzo="no"
+fi
+echores "$_lzo"
+
+
echocheck "mad support"
if test "$_mad" = auto ; then
_mad=no
@@ -4455,6 +4481,8 @@ CDPARANOIA_INC = $_inc_cdparanoia
CDPARANOIA_LIB = $_ld_cdparanoia
FREETYPE_INC = $_inc_freetype
FREETYPE_LIB = $_ld_freetype
+LZO= $_mkf_lzo
+LZO_LIB= $_ld_lzo
# --- Some stuff for autoconfigure ----
$_target_arch
@@ -4797,6 +4825,9 @@ $_def_gif_4
/* enable FreeType support */
$_def_freetype
+/* liblzo support */
+$_def_lzo
+
/* libmad support */
$_def_mad
diff --git a/etc/codecs.conf b/etc/codecs.conf
index 8b0ff9706e..504ec8abe7 100644
--- a/etc/codecs.conf
+++ b/etc/codecs.conf
@@ -122,6 +122,15 @@ videocodec roqvideo
driver roqvideo
out YV12
+videocodec lzo
+ info "LZO compressed"
+ status working
+ fourcc LZO1
+ driver lzo
+ dll "liblzo"
+ out YV12,I420
+ out BGR24 flip
+
; prefer native codecs over win32?
; the win32 codecs probably are (better) optimized and support direct
; rendering, so this may be not the best idea...
diff --git a/libmpcodecs/Makefile b/libmpcodecs/Makefile
index 3380523809..6433b39c2a 100644
--- a/libmpcodecs/Makefile
+++ b/libmpcodecs/Makefile
@@ -22,6 +22,10 @@ ifeq ($(JPEG),yes)
VIDEO_SRCS += vd_ijpg.c
endif
+ifeq ($(LZO),yes)
+VIDEO_SRCS += vd_lzo.c
+endif
+
SRCS=$(AUDIO_SRCS) $(VIDEO_SRCS) $(VFILTER_SRCS) $(NATIVE_SRCS) img_format.c
OBJS=$(SRCS:.c=.o)
diff --git a/libmpcodecs/vd.c b/libmpcodecs/vd.c
index 56f804261d..96376c02da 100644
--- a/libmpcodecs/vd.c
+++ b/libmpcodecs/vd.c
@@ -55,6 +55,7 @@ extern vd_functions_t mpcodecs_vd_svq1;
extern vd_functions_t mpcodecs_vd_xvid;
extern vd_functions_t mpcodecs_vd_libdv;
extern vd_functions_t mpcodecs_vd_lcl;
+extern vd_functions_t mpcodecs_vd_lzo;
vd_functions_t* mpcodecs_vd_drivers[] = {
&mpcodecs_vd_null,
@@ -76,6 +77,9 @@ vd_functions_t* mpcodecs_vd_drivers[] = {
&mpcodecs_vd_divx4,
#endif
#endif
+#ifdef USE_LZO
+ &mpcodecs_vd_lzo,
+#endif
&mpcodecs_vd_raw,
&mpcodecs_vd_msrle,
&mpcodecs_vd_msvidc,
diff --git a/libmpcodecs/vd_lzo.c b/libmpcodecs/vd_lzo.c
new file mode 100644
index 0000000000..b8b4bd2337
--- /dev/null
+++ b/libmpcodecs/vd_lzo.c
@@ -0,0 +1,148 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "config.h"
+#include "mp_msg.h"
+
+#include "vd_internal.h"
+
+#include <lzo1x.h>
+
+#define MOD_NAME "DecLZO"
+
+static vd_info_t info = {
+ "LZO compressed Video",
+ "lzo",
+ "Tilmann Bitterberg",
+ "Transcode development team <http://www.theorie.physik.uni-goettingen.de/~ostreich/transcode/>",
+ "based on liblzo: http://www.oberhumer.com/opensource/lzo/"
+};
+
+LIBVD_EXTERN(lzo)
+
+
+static lzo_byte *wrkmem=NULL;
+static int codec = -1;
+
+// to set/get/query special features/parameters
+static int control (sh_video_t *sh, int cmd, void* arg, ...)
+{
+
+ //printf("[%s] Query!! (%s)\n", MOD_NAME, (codec==IMGFMT_BGR24)?"BGR":"none");
+ //printf("[%s] Query!! (%s)\n", MOD_NAME, (codec==IMGFMT_YV12)?"YV12":"none");
+ switch(cmd){
+ case VDCTRL_QUERY_FORMAT:
+ if( (*((int*)arg)) == IMGFMT_BGR24 && codec == IMGFMT_BGR24) return CONTROL_TRUE;
+ if( (*((int*)arg)) == IMGFMT_YV12 && codec == IMGFMT_YV12) return CONTROL_TRUE;
+ return CONTROL_FALSE;
+ }
+ return CONTROL_UNKNOWN;
+}
+
+
+// init driver
+static int init(sh_video_t *sh)
+{
+
+ if (lzo_init() != LZO_E_OK) {
+ mp_msg (MSGT_DECVIDEO, MSGL_WARN, "[%s] lzo_init() failed\n", MOD_NAME);
+ return 0;
+ }
+
+ if (!wrkmem) wrkmem = (lzo_bytep) lzo_malloc(LZO1X_1_MEM_COMPRESS);
+
+ if (wrkmem == NULL) {
+ mp_msg (MSGT_DECVIDEO, MSGL_ERR, "[%s] Cannot alloc work memory\n", MOD_NAME);
+ return 0;
+ }
+
+ return 1;
+}
+
+// uninit driver
+static void uninit(sh_video_t *sh)
+{
+ if (wrkmem) { lzo_free(wrkmem); wrkmem = NULL;}
+}
+
+//mp_image_t* mpcodecs_get_image(sh_video_t *sh, int mp_imgtype, int mp_imgflag, int w, int h);
+
+// decode a frame
+static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags)
+{
+ static int init_done = 0;
+ int r;
+ int cb = 1;
+ int cr = 2;
+ mp_image_t* mpi;
+ int w, h;
+
+ if (len <= 0) {
+ return NULL; // skipped frame
+ }
+
+
+ if (!init_done) {
+ lzo_byte *tmp=NULL;
+
+ // decompress one frame to see if its
+ // either YV12 or RGB24
+ if (!tmp) tmp = lzo_malloc(sh->bih->biSizeImage);
+
+ mp_msg (MSGT_DECVIDEO, MSGL_V, "[%s] 2 depth %d, format %d data %p len (%d) (%d)\n",
+ MOD_NAME, sh->bih->biBitCount, sh->format, data, len, sh->bih->biSizeImage
+ );
+
+ /* decompress the frame */
+ r = lzo1x_decompress (data, len, tmp, &w, wrkmem);
+
+ if (r != LZO_E_OK) {
+ /* this should NEVER happen */
+ mp_msg (MSGT_DECVIDEO, MSGL_ERR,
+ "[%s] internal error - decompression failed: %d\n", MOD_NAME, r);
+ return NULL;
+ }
+
+ if (w == (sh->bih->biSizeImage)) {
+ codec = IMGFMT_BGR24;
+ mp_msg (MSGT_DECVIDEO, MSGL_V, "[%s] codec choosen is BGR24\n", MOD_NAME);
+ } else if (w == (sh->bih->biSizeImage)/2) {
+ codec = IMGFMT_YV12;
+ mp_msg (MSGT_DECVIDEO, MSGL_V, "[%s] codec choosen is YV12\n", MOD_NAME);
+ } else {
+ codec = -1;
+ mp_msg(MSGT_DECVIDEO,MSGL_ERR,"[%s] Unsupported out_fmt\n", MOD_NAME);
+ return NULL;
+ }
+
+ mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,codec);
+ init_done++;
+ free(tmp);
+ }
+
+ mpi = mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, 0,
+ sh->disp_w, sh->disp_h);
+
+
+ if (!mpi) {
+ mp_msg (MSGT_DECVIDEO, MSGL_ERR, "[%s] mpcodecs_get_image failed\n", MOD_NAME);
+ return NULL;
+ }
+
+ r = lzo1x_decompress (data, len, mpi->planes[0], &w, wrkmem);
+ if (r != LZO_E_OK) {
+ /* this should NEVER happen */
+ mp_msg (MSGT_DECVIDEO, MSGL_ERR,
+ "[%s] internal error - decompression failed: %d\n", MOD_NAME, r);
+ return NULL;
+ }
+
+ mp_msg (MSGT_DECVIDEO, MSGL_DBG2,
+ "[%s] decompressed %lu bytes into %lu bytes\n", MOD_NAME,
+ (long) len, (long)w);
+
+ return mpi;
+}
+
+/* vim: sw=4
+ */