mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-06-03 21:54:49 -04:00
Kill streams that starts reencoding already read files
This commit is contained in:
parent
23feea4acc
commit
5f33172297
@ -5,6 +5,8 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"math"
|
||||||
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"slices"
|
"slices"
|
||||||
"strings"
|
"strings"
|
||||||
@ -105,6 +107,13 @@ func (ts *Stream) run(start int32) error {
|
|||||||
ts.lock.Lock()
|
ts.lock.Lock()
|
||||||
close(ts.segments[segment])
|
close(ts.segments[segment])
|
||||||
ts.heads[encoder_id] = segment
|
ts.heads[encoder_id] = segment
|
||||||
|
|
||||||
|
if int32(len(ts.segments)) == segment+1 {
|
||||||
|
// file finished, ffmped will finish soon on it's own
|
||||||
|
} else if _, ready := <-ts.segments[segment+1]; ready {
|
||||||
|
// ask ffmpeg to stop gracefully (nicer cmd.Process.Kill())
|
||||||
|
cmd.Process.Signal(os.Interrupt)
|
||||||
|
}
|
||||||
ts.lock.Unlock()
|
ts.lock.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,6 +129,11 @@ func (ts *Stream) run(start int32) error {
|
|||||||
} else {
|
} else {
|
||||||
log.Println("ffmpeg finished successfully")
|
log.Println("ffmpeg finished successfully")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ts.lock.Lock()
|
||||||
|
defer ts.lock.Unlock()
|
||||||
|
// we can't delete the head directly because it would invalidate the others encoder_id
|
||||||
|
ts.heads[encoder_id] = -1
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -168,6 +182,12 @@ func (ts *Stream) GetSegment(segment int32, client string) (string, error) {
|
|||||||
func (ts *Stream) getMinEncoderDistance(time float64) float64 {
|
func (ts *Stream) getMinEncoderDistance(time float64) float64 {
|
||||||
ts.lock.RLock()
|
ts.lock.RLock()
|
||||||
defer ts.lock.RUnlock()
|
defer ts.lock.RUnlock()
|
||||||
distances := Map(ts.heads, func(i int32, _ int) float64 { return max(0, ts.file.Keyframes[i]-time) })
|
distances := Map(ts.heads, func(i int32, _ int) float64 {
|
||||||
|
// ignore killed heads or heads after the current time
|
||||||
|
if i < 0 || ts.file.Keyframes[i] > time {
|
||||||
|
return math.Inf(1)
|
||||||
|
}
|
||||||
|
return ts.file.Keyframes[i] - time
|
||||||
|
})
|
||||||
return slices.Min(distances)
|
return slices.Min(distances)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user