[FFmpeg-devel] avfilter: add eval video filter

Submitted by Michael Niedermayer on Nov. 2, 2019, 4:29 p.m.

Details

Message ID 20191102162929.GI3340@michaelspb
State New
Headers show

Commit Message

Michael Niedermayer Nov. 2, 2019, 4:29 p.m.
On Fri, Nov 01, 2019 at 09:38:39PM +0100, Paul B Mahol wrote:
> On 11/1/19, Michael Niedermayer <michael@niedermayer.cc> wrote:
> > On Fri, Nov 01, 2019 at 04:50:38PM +0100, Paul B Mahol wrote:
> >> On 11/1/19, Michael Niedermayer <michael@niedermayer.cc> wrote:
> >> > On Fri, Nov 01, 2019 at 01:09:24PM +0100, Paul B Mahol wrote:
> >> >> Signed-off-by: Paul B Mahol <onemda@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@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

Comments

Paul B Mahol Nov. 17, 2019, 10:33 a.m.
I do not feel like going to look at all of this, so I'm for applying
this filter.

On 11/2/19, Michael Niedermayer <michael@niedermayer.cc> wrote:
> On Fri, Nov 01, 2019 at 09:38:39PM +0100, Paul B Mahol wrote:
>> On 11/1/19, Michael Niedermayer <michael@niedermayer.cc> wrote:
>> > On Fri, Nov 01, 2019 at 04:50:38PM +0100, Paul B Mahol wrote:
>> >> On 11/1/19, Michael Niedermayer <michael@niedermayer.cc> wrote:
>> >> > On Fri, Nov 01, 2019 at 01:09:24PM +0100, Paul B Mahol wrote:
>> >> >> Signed-off-by: Paul B Mahol <onemda@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@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
>
Michael Niedermayer Nov. 17, 2019, 7:01 p.m.
On Sun, Nov 17, 2019 at 11:33:13AM +0100, Paul B Mahol wrote:
> I do not feel like going to look at all of this, 

sure
ill do it

but please tell me from whom you already have permission to relicense ?
i do not want to pester people with the same question multiple times.

thx


> so I'm for applying
> this filter.

Patch hide | download patch | download mbox

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;
 }