[FFmpeg-devel] [PATCH] avfilter: add eval video filter

Michael Niedermayer michael at niedermayer.cc
Sat Nov 2 18:29:29 EET 2019


On Fri, Nov 01, 2019 at 09:38:39PM +0100, Paul B Mahol wrote:
> On 11/1/19, Michael Niedermayer <michael at niedermayer.cc> wrote:
> > On Fri, Nov 01, 2019 at 04:50:38PM +0100, Paul B Mahol wrote:
> >> On 11/1/19, Michael Niedermayer <michael at niedermayer.cc> wrote:
> >> > On Fri, Nov 01, 2019 at 01:09:24PM +0100, Paul B Mahol wrote:
> >> >> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> >> >> ---
> >> >>  doc/filters.texi         |  78 +++++
> >> >>  libavfilter/Makefile     |   1 +
> >> >>  libavfilter/allfilters.c |   1 +
> >> >>  libavfilter/vf_eval.c    | 687
> >> >> +++++++++++++++++++++++++++++++++++++++
> >> >>  4 files changed, 767 insertions(+)
> >> >>  create mode 100644 libavfilter/vf_eval.c
> >> >
> >> > This looks like it duplicates code from vf_geq.c
> >> > also this should be integrated with or in vf_geq.c
> >> >
> >> > IIUC this was written because geq is GPL, but i had already agreed to
> >> > relicense the code in it i wrote to LGPL, so iam not sure why you wrote
> >> > this.
> >> >
> >> > Who disagreed to relicnce their contribution to geq to avoid this extra
> >> > work you did ?
> >> > Or did noone disagree ? then i do not understand why you wrote a
> >> > seperate
> >> > filter
> >>
> >> Do I need to contact all on blame list of vf_geq? or also mplayer devs
> >> that touched geq in mplayer?
> >
> > all who touched it MINUS anyone who made a change that is totally not
> > in the current version (there are several developers in mplayer who
> > made auch changes)
> > also in case of mplayer you may need to look at the commit messages
> > some developers did apply patches from others.
> >
> > I took a quick look and these are the people i saw
> > carl, ubitux, ivan, ods15, Alexis Ballier, derek, Marc-Antoine Arnaud,
> > Nicolas George, Stefano and Paul
> > reimar, zuxy and diego
> 
> I do not think I can contact ods15.

His change was this below (the others seems obviously not in the ffmpeg geq code)
i didnt check the one below before because its big.
But if we cannot contact him, then this should be checked

Does any of this prevail in the ffmpeg geq code ?
(if so tell me what and ill rewrite that)

Thanks

commit dd09bf52982fef6b29acfbcd5fa5c7cb46994c3b
Author: ods15 <ods15 at b3059339-0415-0410-9bf9-f77b7e298cf2>
Date:   Fri Oct 27 19:40:48 2006 +0000

    update vf_geq to new ff_eval API
    
    
    git-svn-id: svn://git.mplayerhq.hu/mplayer/trunk@20471 b3059339-0415-0410-9bf9-f77b7e298cf2

diff --git a/libmpcodecs/vf_geq.c b/libmpcodecs/vf_geq.c
index da33eac71..e8b8c0918 100644
--- a/libmpcodecs/vf_geq.c
+++ b/libmpcodecs/vf_geq.c
@@ -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 @@ double ff_eval(char *s, double *const_value, const char **const_name,
 
 
 struct vf_priv_s {
-       char eq[3][2000];
+        AVEvalExpr * e[3];
         int framenum;
         mp_image_t *mpi;
 };
@@ -120,25 +114,6 @@ static double cr(struct vf_instance_s* vf, double x, double y){
 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 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
             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 @@ static int put_image(struct vf_instance_s* vf, mp_image_t *mpi, double pts){
                 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 void uninit(struct vf_instance_s* vf){
 
 //===========================================================================//
 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,10 +178,45 @@ static int open(vf_instance_t *vf, char* args){
     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 (!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);
 
-    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);
+    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;
 }



-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

In fact, the RIAA has been known to suggest that students drop out
of college or go to community college in order to be able to afford
settlements. -- The RIAA
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20191102/f5777d4d/attachment.sig>


More information about the ffmpeg-devel mailing list