feat(stream): burn bitmap (PGS/DVB) subtitles into the video via overlay
Bitmap subs can't be served as WebVTT, so the user picks one and the daemon
re-encodes with it overlaid. HLSSessionConfig.BurnSubtitleIndex (*int, nil=no
burn) flows into the cache key + a -filter_complex graph:
[0✌️0]<vchain>[base];[0:s:N][base]scale2ref[sub][base2];[base2][sub]overlay[vout]
Overlay after the tonemap (SDR subs keep brightness); scale2ref fits the PGS
canvas to the output. Invalid/text/out-of-range index -> clean-encode fallback.
IsTextSubtitle now includes "text" (parity with the web classifier).
This commit is contained in:
parent
8207d1d2a9
commit
665ec0a34f
9 changed files with 196 additions and 49 deletions
|
|
@ -21,18 +21,21 @@ func newTestCache(t *testing.T, sizeGB int) *HLSCache {
|
|||
|
||||
func TestKeyForStable(t *testing.T) {
|
||||
c := newTestCache(t, 1)
|
||||
k1 := c.KeyFor("/a/b/movie.mkv", "1080p", 0)
|
||||
k2 := c.KeyFor("/a/b/movie.mkv", "1080p", 0)
|
||||
k1 := c.KeyFor("/a/b/movie.mkv", "1080p", 0, -1)
|
||||
k2 := c.KeyFor("/a/b/movie.mkv", "1080p", 0, -1)
|
||||
if k1 != k2 {
|
||||
t.Fatalf("expected stable keys, got %q vs %q", k1, k2)
|
||||
}
|
||||
if c.KeyFor("/a/b/movie.mkv", "720p", 0) == k1 {
|
||||
if c.KeyFor("/a/b/movie.mkv", "720p", 0, -1) == k1 {
|
||||
t.Fatal("quality should change key")
|
||||
}
|
||||
if c.KeyFor("/a/b/movie.mkv", "1080p", 1) == k1 {
|
||||
if c.KeyFor("/a/b/movie.mkv", "1080p", 1, -1) == k1 {
|
||||
t.Fatal("audio index should change key")
|
||||
}
|
||||
if c.KeyFor("/x/y/other.mkv", "1080p", 0) == k1 {
|
||||
if c.KeyFor("/a/b/movie.mkv", "1080p", 0, 2) == k1 {
|
||||
t.Fatal("burn subtitle index should change key")
|
||||
}
|
||||
if c.KeyFor("/x/y/other.mkv", "1080p", 0, -1) == k1 {
|
||||
t.Fatal("path should change key")
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue