Message ID | 20240529120607.517822-1-gerion.entrup@flump.de |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel] libavfilter/signature_lookup: fix jaccard distance | expand |
Context | Check | Description |
---|---|---|
yinshiyou/configure_loongarch64 | warning | Failed to apply patch |
andriy/configure_x86 | warning | Failed to apply patch |
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 --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 */