diff options
author | alex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-08-31 18:59:47 +0000 |
---|---|---|
committer | alex <alex@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2002-08-31 18:59:47 +0000 |
commit | afb96a8875294271238db06e657d4012e8d565b2 (patch) | |
tree | 7ed45c175b1d2bc04a57a8957e53450634b13ca8 | |
parent | 47886158275251c7d5b74f9d475c003439d36d9b (diff) | |
download | mpv-afb96a8875294271238db06e657d4012e8d565b2.tar.bz2 mpv-afb96a8875294271238db06e657d4012e8d565b2.tar.xz |
made compatible to LCL
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7210 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r-- | libmpcodecs/vd_zlib.c | 69 |
1 files changed, 59 insertions, 10 deletions
diff --git a/libmpcodecs/vd_zlib.c b/libmpcodecs/vd_zlib.c index f6935a06e1..c22be627cc 100644 --- a/libmpcodecs/vd_zlib.c +++ b/libmpcodecs/vd_zlib.c @@ -1,3 +1,9 @@ +/* + AVIzlib decoder + + http://www.pcisys.net/~melanson/codecs/lcl.txt +*/ + #include <stdio.h> #include <stdlib.h> @@ -14,8 +20,8 @@ static vd_info_t info = { "AVIzlib decoder", "zlib", "Alex", - "based on vd_ijpg.c", - "uses zlib, supports only BGR24 (as AVIzlib)" + "Alex", + "based on vd_ijpg.c, uses zlib, supports only BGR24 (as AVIzlib)" }; LIBVD_EXTERN(zlib) @@ -23,10 +29,21 @@ LIBVD_EXTERN(zlib) typedef struct { int width; int height; - int depth; + int imgformat; + int decompsize; z_stream zstrm; } vd_zlib_ctx; +/* BITMAPINFOHEADER LCL Extension */ +typedef struct { + unsigned char filler[sizeof(BITMAPINFOHEADER)]; + unsigned char unknown[4]; + unsigned char imgtype; + unsigned char compression; + unsigned char flags; + unsigned char codec; +} bih_lcl_ext; + // to set/get/query special features/parameters static int control(sh_video_t *sh, int cmd, void *arg, ...) { @@ -35,7 +52,7 @@ static int control(sh_video_t *sh, int cmd, void *arg, ...) { case VDCTRL_QUERY_FORMAT: { - if (*((int*)arg) == (IMGFMT_BGR|ctx->depth)) + if (*((int*)arg) == (ctx->imgformat)) return(CONTROL_TRUE); else return(CONTROL_FALSE); @@ -49,6 +66,7 @@ static int init(sh_video_t *sh) { int zret; vd_zlib_ctx *ctx; + bih_lcl_ext *ext; ctx = sh->context = malloc(sizeof(vd_zlib_ctx)); if (!ctx) @@ -57,7 +75,39 @@ static int init(sh_video_t *sh) ctx->width = sh->bih->biWidth; ctx->height = sh->bih->biHeight; - ctx->depth = sh->bih->biBitCount; + ctx->imgformat = IMGFMT_BGR24; + ctx->decompsize = ctx->width*ctx->height*((24+7)/8); + + if (sh->bih->biSize > sizeof(BITMAPINFOHEADER)) + { + ext = sh->bih; + if (ext->codec != 3) /* 1 == MSZH, 3 == ZLIB */ + return(0); + switch(ext->imgtype) + { + case 2: /* RGB24 */ + ctx->imgformat = IMGFMT_BGR24; + ctx->decompsize = ctx->width*ctx->height*((24+7)/8); + break; + case 0: /* YUV411 */ +// ctx->imgformat = IMGFMT_YVU9; +// ctx->decompsize = ctx->width*(ctx->height+2)/8*9; +// break; + case 1: /* YUV422 */ +// ctx->imgformat = IMGFMT_YUY2; +// ctx->decompsize = ctx->width*(ctx->height+2)/8*16; +// break; + case 5: /* YUV420 */ +// ctx->imgformat = IMGFMT_YV12; +// ctx->decompsize = ctx->width*(ctx->height+2)/8*12; +// break; + case 3: /* YUV411 */ + case 4: /* YUV211 */ + default: + printf("Unknown imgtype\n"); + return(0); + } + } ctx->zstrm.zalloc = (alloc_func)NULL; ctx->zstrm.zfree = (free_func)NULL; @@ -71,7 +121,7 @@ static int init(sh_video_t *sh) return(NULL); } - if (!mpcodecs_config_vo(sh, ctx->width, ctx->height, IMGFMT_BGR|ctx->depth)) + if (!mpcodecs_config_vo(sh, ctx->width, ctx->height, ctx->imgformat)) return(NULL); @@ -96,7 +146,6 @@ static mp_image_t* decode(sh_video_t *sh, void* data, int len, int flags) mp_image_t *mpi; vd_zlib_ctx *ctx = sh->context; int zret; - int decomp_size = ctx->width*ctx->height*((ctx->depth+7)/8); z_stream *zstrm = &ctx->zstrm; if (len <= 0) @@ -108,7 +157,7 @@ static mp_image_t* decode(sh_video_t *sh, void* data, int len, int flags) zstrm->next_in = data; zstrm->avail_in = len; zstrm->next_out = mpi->planes[0]; - zstrm->avail_out = decomp_size; + zstrm->avail_out = ctx->decompsize; mp_dbg(MSGT_DECVIDEO, MSGL_DBG2, "[vd_zlib] input: %p (%d bytes), output: %p (%d bytes)\n", zstrm->next_in, zstrm->avail_in, zstrm->next_out, zstrm->avail_out); @@ -121,10 +170,10 @@ static mp_image_t* decode(sh_video_t *sh, void* data, int len, int flags) return(NULL); } - if (decomp_size != (int)zstrm->total_out) + if (ctx->decompsize != (int)zstrm->total_out) { mp_msg(MSGT_DECVIDEO, MSGL_WARN, "[vd_zlib] decoded size differs (%d != %d)\n", - decomp_size, zstrm->total_out); + ctx->decompsize, zstrm->total_out); return(NULL); } |