Skip to content

Commit

Permalink
Enforce maxOffset similar to pg_acoustid
Browse files Browse the repository at this point in the history
  • Loading branch information
lalinsky committed Feb 13, 2024
1 parent 1ea54b5 commit 14468be
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 8 deletions.
17 changes: 11 additions & 6 deletions pkg/chromaprint/match.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,13 +144,15 @@ var ErrInvalidFingerprintVersion = errors.New("invalid fingerprint version")
type FingerprintMatcher struct {
NumQueryBits int
NumAlignBits int
MaxOffset int
MaxOffsetCandidates int
}

func NewFingerprintMatcher() *FingerprintMatcher {
return &FingerprintMatcher{
NumAlignBits: 14,
MaxOffsetCandidates: 3,
MaxOffset: 80,
MaxOffsetCandidates: 1,
}
}

Expand All @@ -170,7 +172,7 @@ func (fm *FingerprintMatcher) Compare(master *common_pb.Fingerprint, query *comm
return 0, errors.New("query fingerprint too long")
}

offsetHits := AlignFingerprints(master, query, fm.NumAlignBits, 1)
offsetHits := AlignFingerprints(master, query, fm.NumAlignBits, fm.MaxOffsetCandidates, fm.MaxOffset)
if len(offsetHits) == 0 {
return 0, nil
}
Expand Down Expand Up @@ -206,7 +208,7 @@ func (fm *FingerprintMatcher) Match(master *common_pb.Fingerprint, query *common
QueryLength: len(query.Hashes),
}

offsetHits := AlignFingerprints(master, query, fm.NumAlignBits, fm.MaxOffsetCandidates)
offsetHits := AlignFingerprints(master, query, fm.NumAlignBits, fm.MaxOffsetCandidates, fm.MaxOffset)
for _, hit := range offsetHits {
sections, err := matchAlignedFingerprints(master, query, hit.Offset)
if err != nil {
Expand Down Expand Up @@ -294,7 +296,7 @@ type OffsetHit struct {
Count float64
}

func AlignFingerprints(master *common_pb.Fingerprint, query *common_pb.Fingerprint, numBits int, limit int) []OffsetHit {
func AlignFingerprints(master *common_pb.Fingerprint, query *common_pb.Fingerprint, numBits int, limit int, maxOffset int) []OffsetHit {
mask := hashBitMask(numBits)

type HashOffset struct {
Expand Down Expand Up @@ -325,8 +327,11 @@ func AlignFingerprints(master *common_pb.Fingerprint, query *common_pb.Fingerpri
break
}
for j := i; j < len(queryHashes) && queryHashes[j].Hash == mo.Hash; j++ {
offset := mo.Offset - queryHashes[j].Offset + len(queryHashes)
counts[offset] += 1
offset := mo.Offset - queryHashes[j].Offset
if maxOffset == 0 || (-maxOffset <= offset && offset <= maxOffset) {
offset += len(queryHashes)
counts[offset] += 1
}
}
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/chromaprint/match_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func TestMatchFingerprints_PartialMatch(t *testing.T) {
result, err := MatchFingerprints(master, query)
if assert.NoError(t, err) {
assert.NotEmpty(t, result.Sections)
assert.Equal(t, "13.000046s", result.MatchingDuration().String())
assert.Equal(t, "12.50481s", result.MatchingDuration().String())
}
}

Expand Down Expand Up @@ -95,6 +95,6 @@ func TestCompareFingerprints_PartialMatch(t *testing.T) {
query := loadTestFingerprint(t, "radio1_2_ad_and_calibre_sunshine")
score, err := CompareFingerprints(master, query)
if assert.NoError(t, err) {
assert.InDelta(t, 0.7, score, 0.1)
assert.InDelta(t, 0.45, score, 0.1)
}
}

0 comments on commit 14468be

Please sign in to comment.