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
|
|
@ -153,12 +153,12 @@ func (c *HLSCache) ReleaseWriter(key string) {
|
|||
// KeyFor derives a stable cache key for (source, quality, audioIndex). Using
|
||||
// the absolute source path means renaming a file invalidates the cache, which
|
||||
// is correct — segment content is tied to the encoded source.
|
||||
func (c *HLSCache) KeyFor(sourcePath, quality string, audioIndex int) string {
|
||||
func (c *HLSCache) KeyFor(sourcePath, quality string, audioIndex, burnSubtitleIndex int) string {
|
||||
abs, err := filepath.Abs(sourcePath)
|
||||
if err != nil {
|
||||
abs = sourcePath
|
||||
}
|
||||
h := sha256.Sum256([]byte(fmt.Sprintf("%s|%s|%d", abs, quality, audioIndex)))
|
||||
h := sha256.Sum256([]byte(fmt.Sprintf("%s|%s|%d|%d", abs, quality, audioIndex, burnSubtitleIndex)))
|
||||
return hex.EncodeToString(h[:8]) // 16 hex chars — collision-safe enough for per-host cache
|
||||
}
|
||||
|
||||
|
|
@ -167,8 +167,8 @@ func (c *HLSCache) KeyFor(sourcePath, quality string, audioIndex int) string {
|
|||
// the debrid direct URL is re-resolved per play and would never cache-hit, so
|
||||
// we key by the torrent info_hash — the same content always maps to the same
|
||||
// key across plays. NOT run through filepath.Abs (an id/URL is not a path).
|
||||
func (c *HLSCache) KeyForID(id, quality string, audioIndex int) string {
|
||||
h := sha256.Sum256([]byte(fmt.Sprintf("%s|%s|%d", id, quality, audioIndex)))
|
||||
func (c *HLSCache) KeyForID(id, quality string, audioIndex, burnSubtitleIndex int) string {
|
||||
h := sha256.Sum256([]byte(fmt.Sprintf("%s|%s|%d|%d", id, quality, audioIndex, burnSubtitleIndex)))
|
||||
return hex.EncodeToString(h[:8])
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue