[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