Skip to content

Commit

Permalink
core/transcoder: extract perceptual signatures
Browse files Browse the repository at this point in the history
  • Loading branch information
jailuthra committed Aug 30, 2021
1 parent 0a9e499 commit 56cffcd
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 8 deletions.
20 changes: 16 additions & 4 deletions core/transcoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func (lt *LocalTranscoder) Transcode(md *SegTranscodingMetadata) (*TranscodeData
Accel: ffmpeg.Software,
}
profiles := md.Profiles
opts := profilesToTranscodeOptions(lt.workDir, ffmpeg.Software, profiles)
opts := profilesToTranscodeOptions(lt.workDir, ffmpeg.Software, profiles, md.CalcPerceptualHash)
if md.DetectorEnabled {
opts = append(opts, detectorsToTranscodeOptions(lt.workDir, ffmpeg.Software, md.DetectorProfiles)...)
}
Expand Down Expand Up @@ -77,7 +77,7 @@ func (nv *NvidiaTranscoder) Transcode(md *SegTranscodingMetadata) (*TranscodeDat
Device: nv.device,
}
profiles := md.Profiles
out := profilesToTranscodeOptions(WorkDir, ffmpeg.Nvidia, profiles)
out := profilesToTranscodeOptions(WorkDir, ffmpeg.Nvidia, profiles, md.CalcPerceptualHash)
if md.DetectorEnabled {
out = append(out, detectorsToTranscodeOptions(WorkDir, ffmpeg.Nvidia, md.DetectorProfiles)...)
}
Expand Down Expand Up @@ -189,7 +189,18 @@ func resToTranscodeData(res *ffmpeg.TranscodeResults, opts []ffmpeg.TranscodeOpt
glog.Error("Cannot read transcoded output for ", oname)
return nil, err
}
segments = append(segments, &TranscodedSegmentData{Data: o, Pixels: res.Encoded[i].Pixels})
// Extract signature if calculated
var s []byte = nil
if opts[i].CalcSign {
sigfile := oname + ".bin"
s, err = ioutil.ReadFile(sigfile)
if err != nil {
glog.Error("Cannot read perceptual signature at ", sigfile)
return nil, err
}
os.Remove(sigfile)
}
segments = append(segments, &TranscodedSegmentData{Data: o, Pixels: res.Encoded[i].Pixels, PHash: s})
os.Remove(oname)
} else {
detections = append(detections, res.Encoded[i].DetectData)
Expand All @@ -203,14 +214,15 @@ func resToTranscodeData(res *ffmpeg.TranscodeResults, opts []ffmpeg.TranscodeOpt
}, nil
}

func profilesToTranscodeOptions(workDir string, accel ffmpeg.Acceleration, profiles []ffmpeg.VideoProfile) []ffmpeg.TranscodeOptions {
func profilesToTranscodeOptions(workDir string, accel ffmpeg.Acceleration, profiles []ffmpeg.VideoProfile, calcPhash bool) []ffmpeg.TranscodeOptions {
opts := make([]ffmpeg.TranscodeOptions, len(profiles), len(profiles))
for i := range profiles {
o := ffmpeg.TranscodeOptions{
Oname: fmt.Sprintf("%s/out_%s.tempfile", workDir, common.RandName()),
Profile: profiles[i],
Accel: accel,
AudioEncoder: ffmpeg.ComponentOptions{Name: "copy"},
CalcSign: calcPhash,
}
opts[i] = o
}
Expand Down
30 changes: 26 additions & 4 deletions core/transcoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,23 @@ func TestResToTranscodeData(t *testing.T) {
assert.Equal(int64(300), tData.Segments[1].Pixels)
assert.True(fileDNE(file1.Name()))
assert.True(fileDNE(file2.Name()))

// Test signature file
res = &ffmpeg.TranscodeResults{Encoded: make([]ffmpeg.MediaInfo, 1)}
pHash := []byte{4, 2, 0, 6, 9}

file1, err = ioutil.TempFile(tempDir, "foo")
require.Nil(err)
ioutil.WriteFile(file1.Name()+".bin", pHash, 0664)

opts = make([]ffmpeg.TranscodeOptions, 1)
opts[0].Oname = file1.Name()
opts[0].CalcPerceptualHash = true

tData, err = resToTranscodeData(res, opts)
assert.Nil(err)
assert.Equal(tData.Segments[0].PHash, pHash)
assert.True(fileDNE(file1.Name()))
}

func TestProfilesToTranscodeOptions(t *testing.T) {
Expand All @@ -166,12 +183,12 @@ func TestProfilesToTranscodeOptions(t *testing.T) {

// Test 0 profiles
profiles := []ffmpeg.VideoProfile{}
opts := profilesToTranscodeOptions(workDir, ffmpeg.Software, profiles)
opts := profilesToTranscodeOptions(workDir, ffmpeg.Software, profiles, false)
assert.Equal(0, len(opts))

// Test 1 profile
profiles = []ffmpeg.VideoProfile{ffmpeg.P144p30fps16x9}
opts = profilesToTranscodeOptions(workDir, ffmpeg.Software, profiles)
opts = profilesToTranscodeOptions(workDir, ffmpeg.Software, profiles, false)
assert.Equal(1, len(opts))
assert.Equal("foo/out_bar.tempfile", opts[0].Oname)
assert.Equal(ffmpeg.Software, opts[0].Accel)
Expand All @@ -180,7 +197,7 @@ func TestProfilesToTranscodeOptions(t *testing.T) {

// Test > 1 profile
profiles = []ffmpeg.VideoProfile{ffmpeg.P144p30fps16x9, ffmpeg.P240p30fps16x9}
opts = profilesToTranscodeOptions(workDir, ffmpeg.Software, profiles)
opts = profilesToTranscodeOptions(workDir, ffmpeg.Software, profiles, false)
assert.Equal(2, len(opts))

for i, p := range profiles {
Expand All @@ -191,9 +208,14 @@ func TestProfilesToTranscodeOptions(t *testing.T) {
}

// Test different acceleration value
opts = profilesToTranscodeOptions(workDir, ffmpeg.Nvidia, profiles)
opts = profilesToTranscodeOptions(workDir, ffmpeg.Nvidia, profiles, false)
assert.Equal(2, len(opts))

// Test signature calculation
opts = profilesToTranscodeOptions(workDir, ffmpeg.Nvidia, profiles, true)
assert.True(opts[0].CalcPerceptualHash)
assert.True(opts[1].CalcPerceptualHash)

for i, p := range profiles {
assert.Equal("foo/out_bar.tempfile", opts[i].Oname)
assert.Equal(ffmpeg.Nvidia, opts[i].Accel)
Expand Down

0 comments on commit 56cffcd

Please sign in to comment.