changeset 5512:4ccfa77d8e86

postprocessing filter (fixme: -pp 0)
author arpi
date Sun, 07 Apr 2002 03:20:41 +0000
parents 7a24a067f0af
children 73696051e3ce
files libmpcodecs/Makefile libmpcodecs/vf.c libmpcodecs/vf_pp.c
diffstat 3 files changed, 81 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/Makefile	Sun Apr 07 02:12:15 2002 +0000
+++ b/libmpcodecs/Makefile	Sun Apr 07 03:20:41 2002 +0000
@@ -5,7 +5,7 @@
 
 AUDIO_SRCS=dec_audio.c ad.c ad_a52.c ad_acm.c ad_alaw.c ad_dk3adpcm.c ad_dshow.c ad_dvdpcm.c ad_ffmpeg.c ad_hwac3.c ad_imaadpcm.c ad_mp3.c ad_msadpcm.c ad_pcm.c ad_roqaudio.c ad_msgsm.c ad_faad.c ad_vorbis.c ad_libmad.c
 VIDEO_SRCS=dec_video.c vd.c vd_null.c vd_cinepak.c vd_qtrpza.c vd_ffmpeg.c vd_dshow.c vd_vfw.c vd_odivx.c vd_divx4.c vd_raw.c vd_xanim.c vd_msvidc.c vd_fli.c vd_qtrle.c vd_qtsmc.c vd_roqvideo.c vd_cyuv.c vd_nuv.c vd_libmpeg2.c vd_msrle.c vd_huffyuv.c vd_zlib.c vd_mpegpes.c
-VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c
+VFILTER_SRCS=vf.c vf_vo.c vf_crop.c vf_expand.c vf_pp.c
 
 ifeq ($(PNG),yes)
 VIDEO_SRCS += vd_mpng.c
--- a/libmpcodecs/vf.c	Sun Apr 07 02:12:15 2002 +0000
+++ b/libmpcodecs/vf.c	Sun Apr 07 03:20:41 2002 +0000
@@ -12,6 +12,7 @@
 extern vf_info_t vf_info_vo;
 extern vf_info_t vf_info_crop;
 extern vf_info_t vf_info_expand;
+extern vf_info_t vf_info_pp;
 
 char** vo_plugin_args=(char**) NULL;
 
@@ -19,6 +20,7 @@
 static vf_info_t* filter_list[]={
     &vf_info_crop,
     &vf_info_expand,
+    &vf_info_pp,
 //    &vf_info_zoom,
 //    &vf_info_osd,
     &vf_info_vo,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libmpcodecs/vf_pp.c	Sun Apr 07 03:20:41 2002 +0000
@@ -0,0 +1,78 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../config.h"
+#include "../mp_msg.h"
+
+#include "../mp_image.h"
+#include "vf.h"
+
+#include "../postproc/postprocess.h"
+
+struct vf_priv_s {
+    unsigned int pp;
+    mp_image_t *dmpi;
+};
+
+//===========================================================================//
+
+static void get_image(struct vf_instance_s* vf, mp_image_t *mpi){
+    if(vf->priv->pp&0xFFFF) return; // non-local filters enabled
+    if(vf->priv->pp && mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change
+    // ok, we can do pp in-place (or pp disabled):
+    vf->priv->dmpi=vf_get_image(vf->next,mpi->imgfmt,
+        mpi->type, mpi->flags, mpi->w, mpi->h);
+    mpi->planes[0]=vf->priv->dmpi->planes[0];
+    mpi->stride[0]=vf->priv->dmpi->stride[0];
+    mpi->width=vf->priv->dmpi->width;
+    if(mpi->flags&MP_IMGFLAG_PLANAR){
+        mpi->planes[1]=vf->priv->dmpi->planes[1];
+        mpi->planes[2]=vf->priv->dmpi->planes[2];
+	mpi->stride[1]=vf->priv->dmpi->stride[1];
+	mpi->stride[2]=vf->priv->dmpi->stride[2];
+    }
+    mpi->flags|=MP_IMGFLAG_DIRECT;
+}
+
+static void put_image(struct vf_instance_s* vf, mp_image_t *mpi){
+    if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
+	// no DR, so get a new image! hope we'll get DR buffer:
+	vf->priv->dmpi=vf_get_image(vf->next,mpi->imgfmt,
+	    MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ALIGNED_STRIDE,
+	    mpi->w,mpi->h);
+    }
+    
+    if(vf->priv->pp || !(mpi->flags&MP_IMGFLAG_DIRECT)){
+	// do the postprocessing! (or copy if no DR)
+	postprocess(mpi->planes,mpi->stride[0],
+		    vf->priv->dmpi->planes,vf->priv->dmpi->stride[0],
+		    mpi->w,mpi->h,
+		    mpi->qscale, mpi->qstride,
+		    vf->priv->pp);
+    }
+    
+    vf_next_put_image(vf,vf->priv->dmpi);
+}
+
+//===========================================================================//
+
+extern int divx_quality;
+
+static int open(vf_instance_t *vf, char* args){
+    vf->get_image=get_image;
+    vf->put_image=put_image;
+    vf->priv=malloc(sizeof(struct vf_priv_s));
+    vf->priv->pp=divx_quality;
+    return 1;
+}
+
+vf_info_t vf_info_pp = {
+    "postprocessing",
+    "pp",
+    "A'rpi",
+    "",
+    open
+};
+
+//===========================================================================//