[FFmpeg-devel] [PATCH v5 2/3] vf_find_rect.c: use the optimized sad function to improve the find performance

Lance Wang lance.lmwang at gmail.com
Sat Jun 15 01:39:38 EEST 2019


On Sat, Jun 15, 2019 at 3:02 AM Michael Niedermayer <michael at niedermayer.cc>
wrote:

> Hi
>
> On Wed, Jun 12, 2019 at 06:57:30PM +0800, lance.lmwang at gmail.com wrote:
> > From: Limin Wang <lance.lmwang at gmail.com>
> >
> > benchmark on x86_64: 6.4 -> 16 with below command:
> > ./ffmpeg  -i 1920x1080.mp4 -vf
> find_rect=./find.tif,cover_rect=./cover.jpg:mode=cover -f null -
> > 6.4 fps -> 16fps
> >
> > Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
> > ---
> >  libavfilter/vf_find_rect.c | 53 +++++++++++++++-----------------------
> >  1 file changed, 21 insertions(+), 32 deletions(-)
> >
> > diff --git a/libavfilter/vf_find_rect.c b/libavfilter/vf_find_rect.c
> > index ee6c3f4b45..ed15885bc2 100644
> > --- a/libavfilter/vf_find_rect.c
> > +++ b/libavfilter/vf_find_rect.c
> > @@ -26,6 +26,7 @@
> >  #include "libavutil/imgutils.h"
> >  #include "libavutil/opt.h"
> >  #include "internal.h"
> > +#include "scene_sad.h"
> >
> >  #include "lavfutils.h"
> >  #include "lswsutils.h"
> > @@ -36,6 +37,8 @@ typedef struct FOCContext {
> >      AVClass *class;
> >      float threshold;
> >      int mipmaps;
> > +    ff_scene_sad_fn sad;
> > +    int bitdepth;
> >      int xmin, ymin, xmax, ymax;
> >      char *obj_filename;
> >      int last_x, last_y;
> > @@ -103,54 +106,40 @@ static AVFrame *downscale(AVFrame *in)
> >      return frame;
> >  }
> >
> > -static float compare(const AVFrame *haystack, const AVFrame *obj, int
> offx, int offy)
> > +static float compare_sad(FOCContext *foc, AVFrame *haystack, AVFrame
> *obj, int offx, int offy)
> >  {
> > -    int x,y;
> > -    int o_sum_v = 0;
> > -    int h_sum_v = 0;
> > -    int64_t oo_sum_v = 0;
> > -    int64_t hh_sum_v = 0;
> > -    int64_t oh_sum_v = 0;
> > -    float c;
> > +    uint64_t sad = 0;
> >      int n = obj->height * obj->width;
> > -    const uint8_t *odat = obj     ->data[0];
> > +    double mafd;
> > +    const uint8_t *odat = obj->data[0];
> >      const uint8_t *hdat = haystack->data[0] + offx + offy *
> haystack->linesize[0];
> > -    int64_t o_sigma, h_sigma;
> > -
> > -    for(y = 0; y < obj->height; y++) {
> > -        for(x = 0; x < obj->width; x++) {
> > -            int o_v = odat[x];
> > -            int h_v = hdat[x];
> > -            o_sum_v += o_v;
> > -            h_sum_v += h_v;
> > -            oo_sum_v += o_v * o_v;
> > -            hh_sum_v += h_v * h_v;
> > -            oh_sum_v += o_v * h_v;
> > -        }
> > -        odat += obj->linesize[0];
> > -        hdat += haystack->linesize[0];
> > -    }
> > -    o_sigma = n*oo_sum_v - o_sum_v*(int64_t)o_sum_v;
> > -    h_sigma = n*hh_sum_v - h_sum_v*(int64_t)h_sum_v;
> >
> > -    if (o_sigma == 0 || h_sigma == 0)
> > -        return 1.0;
> > +    foc->sad(hdat, haystack->linesize[0], odat, obj->linesize[0],
> > +            obj->width, obj->height, &sad);
> > +    emms_c();
> > +    mafd = (double)sad / n / (1ULL << foc->bitdepth);
>
> mixing floating point and MMX in the same function is likely not
> safe
>

The code is changed from vf_freezedetect.c,  it's OK on my testing system.
That's
why we had to use emms_c to avoid it.


>
> also SAD wont recognize objects that are a different contrast or brightness
>
>
I haven't chance to test these condition, that's the issue.  Please ignore
the patch function.




> [...]
>
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> Many that live deserve death. And some that die deserve life. Can you give
> it to them? Then do not be too eager to deal out death in judgement. For
> even the very wise cannot see all ends. -- Gandalf
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list