[MPlayer-dev-eng] [PATCH] update vf_geq to new eval API

Oded Shimon ods15 at ods15.dyndns.org
Fri Oct 27 19:56:23 CEST 2006


On Fri, Oct 27, 2006 at 07:45:43PM +0200, Michael Niedermayer wrote:
> Hi
> 
> On Fri, Oct 27, 2006 at 07:18:23PM +0200, Oded Shimon wrote:
> > OK to commit?
> 
> commit what?

oops :)

> > Also, I looked into ratecontrol.c, and i'm not sure where I should put the 
> > parsing, store the pointer, and where to uninit. ff_rate_control_init(), 
> > RateControlContext, and ff_rate_control_uninit?
> 
> without looking at the code ... yes 

I'll make a patch soon..

- ods15
-------------- next part --------------
Index: libmpcodecs/vf_geq.c
===================================================================
--- libmpcodecs/vf_geq.c	(revision 20467)
+++ libmpcodecs/vf_geq.c	(working copy)
@@ -27,18 +27,12 @@
 #include "mp_msg.h"
 #include "cpudetect.h"
 
-#if 1
-double ff_eval(char *s, double *const_value, const char **const_name,
-               double (**func1)(void *, double), const char **func1_name,
-               double (**func2)(void *, double, double), char **func2_name,
-               void *opaque);
-#endif
-
 // Needed to bring in lrintf.
 #define HAVE_AV_CONFIG_H
 
 #include "libavcodec/avcodec.h"
 #include "libavcodec/dsputil.h"
+#include "libavcodec/eval.h"
 #include "libavutil/common.h"
 
 /* FIXME: common.h defines printf away when HAVE_AV_CONFIG
@@ -57,7 +51,7 @@
 
 
 struct vf_priv_s {
-	char eq[3][2000];
+        AVEvalExpr * e[3];
         int framenum;
         mp_image_t *mpi;
 };
@@ -120,25 +114,6 @@
 static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
 	mp_image_t *dmpi;
         int x,y, plane;
-        static const char *const_names[]={
-            "PI",
-            "E",
-            "X",
-            "Y",
-            "W",
-            "H",
-            "N",
-            "SW",
-            "SH",
-            NULL
-        };
-        static const char *func2_names[]={
-            "lum",
-            "cb",
-            "cr",
-            "p",
-            NULL
-        };
 
 	if(!(mpi->flags&MP_IMGFLAG_DIRECT)){
 		// no DR, so get a new image! hope we'll get DR buffer:
@@ -157,13 +132,6 @@
             int h= mpi->h >> (plane ? mpi->chroma_y_shift : 0);
             uint8_t *dst  = dmpi->planes[plane];
             int dst_stride= dmpi->stride[plane];
-            double (*func2[])(void *, double, double)={
-                lum,
-                cb,
-                cr,
-                plane==0 ? lum : (plane==1 ? cb : cr),
-                NULL
-            };
             double const_values[]={
                 M_PI,
                 M_E,
@@ -176,11 +144,12 @@
                 h/(double)mpi->h,
                 0
             };
+            if (!vf->priv->e[plane]) continue;
             for(y=0; y<h; y++){
                 const_values[3]=y;
                 for(x=0; x<w; x++){
                     const_values[2]=x;
-                    dst[x+y* dst_stride]= ff_eval(vf->priv->eq[plane], const_values, const_names, NULL, NULL, func2, func2_names, vf);
+                    dst[x+y* dst_stride]= ff_parse_eval(vf->priv->e[plane], const_values, vf);
                 }
             }
         }
@@ -199,6 +168,9 @@
 
 //===========================================================================//
 static int open(vf_instance_t *vf, char* args){
+    char eq[3][2000] = { { 0 }, { 0 }, { 0 } };
+    int plane;
+
     vf->config=config;
     vf->put_image=put_image;
 //    vf->get_image=get_image;
@@ -206,11 +178,46 @@
     vf->priv=av_malloc(sizeof(struct vf_priv_s));
     memset(vf->priv, 0, sizeof(struct vf_priv_s));
 
-    if (args) sscanf(args, "%1999s:%1999s:%1999s", vf->priv->eq[0], vf->priv->eq[1], vf->priv->eq[2]);
+    if (args) sscanf(args, "%1999s:%1999s:%1999s", eq[0], eq[1], eq[2]);
 
-    if(!vf->priv->eq[1][0]) strncpy(vf->priv->eq[1], vf->priv->eq[0], sizeof(vf->priv->eq[0])-1);
-    if(!vf->priv->eq[2][0]) strncpy(vf->priv->eq[2], vf->priv->eq[1], sizeof(vf->priv->eq[0])-1);
+    if (!eq[1][0]) strncpy(eq[1], eq[0], sizeof(eq[0])-1);
+    if (!eq[2][0]) strncpy(eq[2], eq[1], sizeof(eq[0])-1);
 
+    for(plane=0; plane<3; plane++){
+        static const char *const_names[]={
+            "PI",
+            "E",
+            "X",
+            "Y",
+            "W",
+            "H",
+            "N",
+            "SW",
+            "SH",
+            NULL
+        };
+        static const char *func2_names[]={
+            "lum",
+            "cb",
+            "cr",
+            "p",
+            NULL
+        };
+        double (*func2[])(void *, double, double)={
+            lum,
+            cb,
+            cr,
+            plane==0 ? lum : (plane==1 ? cb : cr),
+            NULL
+        };
+        char * a;
+        vf->priv->e[plane] = ff_parse(eq[plane], const_names, NULL, NULL, func2, func2_names, &a);
+
+        if (!vf->priv->e[plane]) {
+            mp_msg(MSGT_VFILTER, MSGL_ERR, "geq: error loading equation `%s': %s\n", eq[plane], a);
+        }
+    }
+
     return 1;
 }
 


More information about the MPlayer-dev-eng mailing list