changeset 9404:7a43a52b9f60

down3dright filter by kabi (converts between 2 common stereoscopic systems)
author michael
date Tue, 11 Feb 2003 21:44:55 +0000
parents d828cd1c219b
children a4444e7ee56a
files libmpcodecs/Makefile libmpcodecs/vf.c libmpcodecs/vf_down3dright.c
diffstat 3 files changed, 147 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/Makefile	Tue Feb 11 21:19:13 2003 +0000
+++ b/libmpcodecs/Makefile	Tue Feb 11 21:44:55 2003 +0000
@@ -14,7 +14,7 @@
 VIDEO_SRCS_OPT=vd_realvid.c vd_ffmpeg.c vd_dshow.c vd_dmo.c vd_vfw.c vd_vfwex.c vd_odivx.c vd_divx4.c vd_xanim.c vd_xvid.c vd_libdv.c vd_qtvideo.c
 VIDEO_SRCS=dec_video.c vd.c $(VIDEO_SRCS_NAT) $(VIDEO_SRCS_LIB) $(VIDEO_SRCS_OPT)
 
-VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_pp.c vf_scale.c vf_format.c vf_yuy2.c vf_flip.c vf_rgb2bgr.c vf_rotate.c vf_mirror.c vf_palette.c vf_lavc.c vf_dvbscale.c vf_cropdetect.c vf_test.c vf_noise.c vf_yvu9.c vf_rectangle.c vf_lavcdeint.c vf_eq.c vf_eq2.c vf_halfpack.c vf_dint.c vf_1bpp.c vf_bmovl.c vf_2xsai.c vf_unsharp.c vf_swapuv.c vf_il.c vf_boxblur.c vf_sab.c vf_smartblur.c vf_perspective.c vf_field.c vf_denoise3d.c
+VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_pp.c vf_scale.c vf_format.c vf_yuy2.c vf_flip.c vf_rgb2bgr.c vf_rotate.c vf_mirror.c vf_palette.c vf_lavc.c vf_dvbscale.c vf_cropdetect.c vf_test.c vf_noise.c vf_yvu9.c vf_rectangle.c vf_lavcdeint.c vf_eq.c vf_eq2.c vf_halfpack.c vf_dint.c vf_1bpp.c vf_bmovl.c vf_2xsai.c vf_unsharp.c vf_swapuv.c vf_il.c vf_boxblur.c vf_sab.c vf_smartblur.c vf_perspective.c vf_down3dright.c vf_field.c vf_denoise3d.c
 ENCODER_SRCS=ve.c ve_divx4.c ve_lavc.c ve_vfw.c ve_rawrgb.c ve_libdv.c ve_xvid.c ve_qtvideo.c
 
 NATIVE_SRCS=native/RTjpegN.c native/cinepak.c native/fli.c native/minilzo.c native/msvidc.c native/nuppelvideo.c native/qtrle.c native/qtrpza.c native/qtsmc.c native/roqav.c native/xa_gsm.c native/svq1.c
--- a/libmpcodecs/vf.c	Tue Feb 11 21:19:13 2003 +0000
+++ b/libmpcodecs/vf.c	Tue Feb 11 21:44:55 2003 +0000
@@ -52,6 +52,7 @@
 extern vf_info_t vf_info_sab;
 extern vf_info_t vf_info_smartblur;
 extern vf_info_t vf_info_perspective;
+extern vf_info_t vf_info_down3dright;
 extern vf_info_t vf_info_field;
 extern vf_info_t vf_info_denoise3d;
 
@@ -99,6 +100,7 @@
     &vf_info_sab,
     &vf_info_smartblur,
     &vf_info_perspective,
+    &vf_info_down3dright,
     &vf_info_field,
     &vf_info_denoise3d,
     NULL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libmpcodecs/vf_down3dright.c	Tue Feb 11 21:44:55 2003 +0000
@@ -0,0 +1,144 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include "../config.h"
+#include "../mp_msg.h"
+#include "../cpudetect.h"
+
+#include "img_format.h"
+#include "mp_image.h"
+#include "vf.h"
+
+#include "../libvo/fastmemcpy.h"
+#include "../postproc/rgb2rgb.h"
+
+struct vf_priv_s {
+	int skipline;
+	int scalew;
+	int scaleh;
+};
+
+static void toright(unsigned char *dst[3], unsigned char *src[3],
+		    unsigned int dststride[3], unsigned int srcstride[3],
+		    int w, int h, struct vf_priv_s* p)
+{
+	int k;
+
+	for (k = 0; k < 3; k++) {
+		unsigned char* fromL = src[k];
+		unsigned char* fromR = src[k];
+		unsigned char* to = dst[k];
+		unsigned int src = srcstride[k];
+                unsigned int dst = dststride[k];
+		unsigned int ss;
+		unsigned int dd;
+		int i;
+
+		if (k > 0) {
+			i = h / 4 - p->skipline / 2;
+			ss = src * (h / 4 + p->skipline / 2);
+			dd = w / 4;
+		} else {
+			i = h / 2 - p->skipline;
+                        ss = src * (h / 2 + p->skipline);
+			dd = w / 2;
+		}
+		fromR += ss;
+		for ( ; i > 0; i--) {
+                        int j;
+			unsigned char* t = to;
+			unsigned char* sL = fromL;
+			unsigned char* sR = fromR;
+
+			if (p->scalew == 1) {
+				for (j = dd; j > 0; j--)
+					*t++ = (*sL++ + *sL++) / 2;
+				for (j = dd ; j > 0; j--)
+					*t++ = (*sR++ + *sR++) / 2;
+			} else {
+				for (j = dd * 2 ; j > 0; j--)
+					*t++ = *sL++;
+				for (j = dd * 2 ; j > 0; j--)
+					*t++ = *sR++;
+			}
+			if (p->scaleh == 1) {
+				memcpy(to + dst, to, dst);
+                                to += dst;
+			}
+			to += dst;
+			fromL += src;
+			fromR += src;
+		}
+		//printf("K %d  %d   %d   %d  %d \n", k, w, h,  src, dst);
+	}
+}
+
+static int put_image(struct vf_instance_s* vf, mp_image_t *mpi)
+{
+	mp_image_t *dmpi;
+
+	// hope we'll get DR buffer:
+	dmpi=vf_get_image(vf->next, IMGFMT_YV12,
+			  MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE,
+			  mpi->w * vf->priv->scalew,
+			  mpi->h / vf->priv->scaleh - vf->priv->skipline);
+
+	toright(dmpi->planes, mpi->planes, dmpi->stride,
+		mpi->stride, mpi->w, mpi->h, vf->priv);
+
+	return vf_next_put_image(vf,dmpi);
+}
+
+static int config(struct vf_instance_s* vf,
+		  int width, int height, int d_width, int d_height,
+		  unsigned int flags, unsigned int outfmt)
+{
+	/* FIXME - also support UYVY output? */
+	return vf_next_config(vf, width * vf->priv->scalew,
+			      height / vf->priv->scaleh - vf->priv->skipline, d_width, d_height, flags, IMGFMT_YV12);
+}
+
+
+static int query_format(struct vf_instance_s* vf, unsigned int fmt)
+{
+	/* FIXME - really any YUV 4:2:0 input format should work */
+	switch (fmt) {
+	case IMGFMT_YV12:
+	case IMGFMT_IYUV:
+	case IMGFMT_I420:
+		return vf_next_query_format(vf, IMGFMT_YV12);
+	}
+	return 0;
+}
+
+static void uninit(struct vf_instance_s* vf)
+{
+	free(vf->priv);
+}
+
+static int open(vf_instance_t *vf, char* args)
+{
+	vf->config=config;
+	vf->query_format=query_format;
+	vf->put_image=put_image;
+	vf->uninit=uninit;
+
+	vf->priv = calloc(1, sizeof (struct vf_priv_s));
+	vf->priv->skipline = 0;
+	vf->priv->scalew = 1;
+	vf->priv->scaleh = 2;
+	if (args) sscanf(args, "%d", &vf->priv->skipline);
+
+	return 1;
+}
+
+vf_info_t vf_info_down3dright = {
+	"convert stereo movie from top-bottom to left-right field",
+	"down3dright",
+	"Zdenek Kabelac",
+	"",
+	open
+};
+