diff mbox series

[FFmpeg-devel] libavfilter/signature_lookup: fix jaccard distance

Message ID 20240529120607.517822-1-gerion.entrup@flump.de
State New
Headers show
Series [FFmpeg-devel] libavfilter/signature_lookup: fix jaccard distance | expand

Checks

Context Check Description
yinshiyou/configure_loongarch64 warning Failed to apply patch
andriy/configure_x86 warning Failed to apply patch

Commit Message

Gerion Entrup May 29, 2024, 12:06 p.m. UTC
Actually, the jaccard distance is defined as D = 1 - intersect / union.
Additionally, the distance value is compared against a constant that
must be between 0 and 1, which is not the case here. Both facts together
has led to the fact, that the function always returned a matching course
signature. To leave the constant intact and to avoid floating point
computation, this commit multiplies with 1 << 16 making the constant
effectively 9000 / (1<<16) =~ 0.14.

Reported-by: Sachin Tilloo <sachin.tilloo@gmail.com>
Reviewed-by: Sachin Tilloo <sachin.tilloo@gmail.com>
Tested-by: Sachin Tilloo <sachin.tilloo@gmail.com>
---
 libavfilter/signature_lookup.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Michael Niedermayer May 31, 2024, 8:17 p.m. UTC | #1
On Wed, May 29, 2024 at 02:06:07PM +0200, Gerion Entrup wrote:
> Actually, the jaccard distance is defined as D = 1 - intersect / union.
> Additionally, the distance value is compared against a constant that
> must be between 0 and 1, which is not the case here. Both facts together
> has led to the fact, that the function always returned a matching course
> signature. To leave the constant intact and to avoid floating point
> computation, this commit multiplies with 1 << 16 making the constant
> effectively 9000 / (1<<16) =~ 0.14.
> 
> Reported-by: Sachin Tilloo <sachin.tilloo@gmail.com>
> Reviewed-by: Sachin Tilloo <sachin.tilloo@gmail.com>
> Tested-by: Sachin Tilloo <sachin.tilloo@gmail.com>
> ---
>  libavfilter/signature_lookup.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/libavfilter/signature_lookup.c b/libavfilter/signature_lookup.c
> index b39a3e225b..b90b63f3f2 100644
> --- a/libavfilter/signature_lookup.c
> +++ b/libavfilter/signature_lookup.c
> @@ -127,9 +127,10 @@ static int get_jaccarddist(SignatureContext *sc, CoarseSignature *first, CoarseS
>  {
>      int jaccarddist, i, composdist = 0, cwthcount = 0;
>      for (i = 0; i < 5; i++) {
> -        if ((jaccarddist = intersection_word(first->data[i], second->data[i])) > 0) {
> +        if ((jaccarddist = (1 << 16) * intersection_word(first->data[i], second->data[i])) > 0) {
>              jaccarddist /= FFMAX(union_word(first->data[i], second->data[i]), 1);
>          }
> +        jaccarddist = (1 << 16) - jaccarddist;
>          if (jaccarddist >= sc->thworddist) {
>              if (++cwthcount > 2) {
>                  /* more than half (5/2) of distances are too wide */

this seems not to apply, maybe iam missing something ?

Applying: libavfilter/signature_lookup: fix jaccard distance
Using index info to reconstruct a base tree...
M	libavfilter/signature_lookup.c
Falling back to patching base and 3-way merge...
Auto-merging libavfilter/signature_lookup.c
CONFLICT (content): Merge conflict in libavfilter/signature_lookup.c
error: Failed to merge in the changes.



[...]
diff mbox series

Patch

diff --git a/libavfilter/signature_lookup.c b/libavfilter/signature_lookup.c
index b39a3e225b..b90b63f3f2 100644
--- a/libavfilter/signature_lookup.c
+++ b/libavfilter/signature_lookup.c
@@ -127,9 +127,10 @@  static int get_jaccarddist(SignatureContext *sc, CoarseSignature *first, CoarseS
 {
     int jaccarddist, i, composdist = 0, cwthcount = 0;
     for (i = 0; i < 5; i++) {
-        if ((jaccarddist = intersection_word(first->data[i], second->data[i])) > 0) {
+        if ((jaccarddist = (1 << 16) * intersection_word(first->data[i], second->data[i])) > 0) {
             jaccarddist /= FFMAX(union_word(first->data[i], second->data[i]), 1);
         }
+        jaccarddist = (1 << 16) - jaccarddist;
         if (jaccarddist >= sc->thworddist) {
             if (++cwthcount > 2) {
                 /* more than half (5/2) of distances are too wide */