[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
Sun Jun 16 02:16:54 EEST 2019
On Sun, Jun 16, 2019 at 6:41 AM Michael Niedermayer <michael at niedermayer.cc>
wrote:
> On Sat, Jun 15, 2019 at 06:39:38AM +0800, Lance Wang wrote:
> > 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.
>
> Nothing stops the compiler from moving any floating
> point operations, registers, ... around
> putting mmx + emms in a function with floating point is asking for
> problems, its better not to do this
> worse such problem would only show up on 32bit mmx systems, so if an issue
> occured it would be specific to older systems, thats never good for finding
> and fixing issues quickly
>
>
OK, I'll update the first patch for review, the other two patch will be
ignored and stop update anyway.
thx
>
> [...]
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> No great genius has ever existed without some touch of madness. --
> Aristotle
> _______________________________________________
> 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