changeset 5262:7c1425197af0

added, supporting only BGR24 (avizlib.dll does the same)
author alex
date Fri, 22 Mar 2002 21:20:50 +0000
parents 9e80ac615570
children da664f9894e8
files libmpcodecs/vd_zlib.c
diffstat 1 files changed, 132 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libmpcodecs/vd_zlib.c	Fri Mar 22 21:20:50 2002 +0000
@@ -0,0 +1,132 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "config.h"
+
+#ifdef HAVE_ZLIB
+#include "mp_msg.h"
+
+#include <zlib.h>
+
+#include "vd_internal.h"
+
+static vd_info_t info = {
+	"zlib decoder (avizlib)",
+	"zlib",
+	VFM_ZLIB,
+	"Alex",
+	"based on vd_ijpg.c",
+	"uses zlib, supports only BGR24 (as AVIzlib)"
+};
+
+LIBVD_EXTERN(zlib)
+
+typedef struct {
+    int width;
+    int height;
+    int depth;
+    z_stream zstrm;
+    mp_image_t *mpi;
+} vd_zlib_ctx;
+
+// to set/get/query special features/parameters
+static int control(sh_video_t *sh, int cmd, void *arg, ...)
+{
+    switch(cmd)
+    {
+	case VDCTRL_QUERY_FORMAT:
+	{
+	    *((int*)arg) = IMGFMT_BGR24;
+	    return(CONTROL_TRUE);
+	}
+    }
+    return(CONTROL_UNKNOWN);
+}
+
+// init driver
+static int init(sh_video_t *sh)
+{
+    int zret;
+    vd_zlib_ctx *ctx;
+    
+    ctx = sh->context = malloc(sizeof(vd_zlib_ctx));
+    if (!ctx)
+	return(0);
+    memset(ctx, 0, sizeof(vd_zlib_ctx));
+
+    ctx->width = sh->bih->biWidth;
+    ctx->height = sh->bih->biHeight;
+    ctx->depth = sh->bih->biBitCount;
+
+    ctx->zstrm.zalloc = (alloc_func)NULL;
+    ctx->zstrm.zfree = (free_func)NULL;
+    ctx->zstrm.opaque = (voidpf)NULL;
+
+    zret = inflateInit(&ctx->zstrm);
+    if (zret != Z_OK)
+    {
+	mp_msg(MSGT_DECVIDEO, MSGL_ERR, "[vd_zlib] inflate init error: %d\n",
+	    zret);
+	return(NULL);
+    }
+
+    if (!mpcodecs_config_vo(sh, ctx->width, ctx->height, IMGFMT_BGR|ctx->depth))
+	return(NULL);
+
+    ctx->mpi = mpcodecs_get_image(sh, MP_IMGTYPE_TEMP, MP_IMGFLAG_ALLOCATED,
+	ctx->width, ctx->height);
+    if (!ctx->mpi)
+	return(NULL);
+
+    return(1);
+}
+
+// uninit driver
+static void uninit(sh_video_t *sh)
+{
+    vd_zlib_ctx *ctx = sh->context;
+
+    inflateEnd(&ctx->zstrm);
+    if (ctx)
+	free(ctx);
+}
+
+//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)
+{
+    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)
+	return(NULL); // skipped frame
+
+    zstrm->next_in = data;
+    zstrm->avail_in = len;
+    zstrm->next_out = ctx->mpi->planes[0];
+    zstrm->avail_out = decomp_size;
+
+    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);
+    
+    zret = inflate(zstrm, Z_NO_FLUSH);
+    if ((zret != Z_OK) && (zret != Z_STREAM_END))
+    {
+	mp_msg(MSGT_DECVIDEO, MSGL_ERR, "[vd_zlib] inflate error: %d\n",
+	    zret);
+	return(NULL);
+    }
+    
+    if (decomp_size != (int)zstrm->total_out)
+    {
+	mp_msg(MSGT_DECVIDEO, MSGL_WARN, "[vd_zlib] decoded size differs (%d != %d)\n",
+	    decomp_size, zstrm->total_out);
+	return(NULL);
+    }
+
+    return(ctx->mpi);
+}
+#endif
\ No newline at end of file