191 lines
4.8 KiB
Go
191 lines
4.8 KiB
Go
package scanner
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/Silo-Server/silo-server/internal/models"
|
|
)
|
|
|
|
func TestProbePipelinePreservesVideoColorRange(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
colorRange string
|
|
wantColorRange string
|
|
}{
|
|
{name: "limited", colorRange: "tv", wantColorRange: "tv"},
|
|
{name: "full", colorRange: "pc", wantColorRange: "pc"},
|
|
{name: "unspecified", wantColorRange: "unknown"},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
rawJSON := `{"streams":[{"codec_type":"video","codec_name":"h264","color_range":"` + tt.colorRange + `"}]}`
|
|
var raw ffprobeOutput
|
|
if err := json.Unmarshal([]byte(rawJSON), &raw); err != nil {
|
|
t.Fatalf("unmarshal ffprobe output: %v", err)
|
|
}
|
|
|
|
probe := convertProbeData(&raw)
|
|
file := &models.MediaFile{}
|
|
applyProbeData(file, probe, "local")
|
|
|
|
if len(file.VideoTracks) != 1 {
|
|
t.Fatalf("VideoTracks length = %d, want 1", len(file.VideoTracks))
|
|
}
|
|
if got := file.VideoTracks[0].ColorRange; got != tt.wantColorRange {
|
|
t.Fatalf("ColorRange = %q, want %q", got, tt.wantColorRange)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestConvertProbeDataVideoRangeTypes(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
stream ffprobeStream
|
|
wantRange string
|
|
wantRangeType string
|
|
wantProfile int
|
|
wantCompatID int
|
|
wantEL bool
|
|
wantHDR10Plus bool
|
|
}{
|
|
{
|
|
name: "dolby vision profile 7 enhancement layer",
|
|
stream: ffprobeStream{
|
|
CodecType: "video",
|
|
CodecName: "hevc",
|
|
ColorTransfer: "smpte2084",
|
|
SideDataList: []ffprobeSideData{{
|
|
SideDataType: "DOVI configuration record",
|
|
DVProfile: 7,
|
|
DVElPresent: 1,
|
|
}},
|
|
},
|
|
wantRange: "DolbyVision",
|
|
wantRangeType: "DOVIWithEL",
|
|
wantProfile: 7,
|
|
wantEL: true,
|
|
},
|
|
{
|
|
name: "dolby vision profile 7 with hdr10 plus",
|
|
stream: ffprobeStream{
|
|
CodecType: "video",
|
|
CodecName: "hevc",
|
|
SideDataList: []ffprobeSideData{
|
|
{SideDataType: "DOVI configuration record", DVProfile: 7, DVElPresent: 1},
|
|
{SideDataType: "HDR Dynamic Metadata SMPTE2094-40 (HDR10+)"},
|
|
},
|
|
},
|
|
wantRange: "DolbyVision",
|
|
wantRangeType: "DOVIWithELHDR10Plus",
|
|
wantProfile: 7,
|
|
wantEL: true,
|
|
wantHDR10Plus: true,
|
|
},
|
|
{
|
|
name: "dolby vision profile 8 hdr10 base layer",
|
|
stream: ffprobeStream{
|
|
CodecType: "video",
|
|
CodecName: "hevc",
|
|
SideDataList: []ffprobeSideData{{
|
|
SideDataType: "DOVI configuration record",
|
|
DVProfile: 8,
|
|
DVBLCompatID: 1,
|
|
}},
|
|
},
|
|
wantRange: "DolbyVision",
|
|
wantRangeType: "DOVIWithHDR10",
|
|
wantProfile: 8,
|
|
wantCompatID: 1,
|
|
},
|
|
{
|
|
name: "dolby vision profile 8 hlg base layer",
|
|
stream: ffprobeStream{
|
|
CodecType: "video",
|
|
CodecName: "hevc",
|
|
SideDataList: []ffprobeSideData{{
|
|
SideDataType: "DOVI configuration record",
|
|
DVProfile: 8,
|
|
DVBLCompatID: 4,
|
|
}},
|
|
},
|
|
wantRange: "DolbyVision",
|
|
wantRangeType: "DOVIWithHLG",
|
|
wantProfile: 8,
|
|
wantCompatID: 4,
|
|
},
|
|
{
|
|
name: "hdr10 plus",
|
|
stream: ffprobeStream{
|
|
CodecType: "video",
|
|
CodecName: "hevc",
|
|
ColorTransfer: "smpte2084",
|
|
SideDataList: []ffprobeSideData{{SideDataType: "HDR10+ metadata"}},
|
|
},
|
|
wantRange: "HDR",
|
|
wantRangeType: "HDR10Plus",
|
|
wantHDR10Plus: true,
|
|
},
|
|
{
|
|
name: "hlg",
|
|
stream: ffprobeStream{
|
|
CodecType: "video",
|
|
CodecName: "hevc",
|
|
ColorTransfer: "arib-std-b67",
|
|
},
|
|
wantRange: "HDR",
|
|
wantRangeType: "HLG",
|
|
},
|
|
{
|
|
name: "hdr10",
|
|
stream: ffprobeStream{
|
|
CodecType: "video",
|
|
CodecName: "hevc",
|
|
ColorTransfer: "smpte2084",
|
|
},
|
|
wantRange: "HDR",
|
|
wantRangeType: "HDR10",
|
|
},
|
|
{
|
|
name: "sdr",
|
|
stream: ffprobeStream{
|
|
CodecType: "video",
|
|
CodecName: "h264",
|
|
},
|
|
wantRangeType: "SDR",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := convertProbeData(&ffprobeOutput{
|
|
Streams: []ffprobeStream{tt.stream},
|
|
})
|
|
if len(got.VideoTracks) != 1 {
|
|
t.Fatalf("VideoTracks length = %d, want 1", len(got.VideoTracks))
|
|
}
|
|
track := got.VideoTracks[0]
|
|
if track.VideoRange != tt.wantRange {
|
|
t.Fatalf("VideoRange = %q, want %q", track.VideoRange, tt.wantRange)
|
|
}
|
|
if track.VideoRangeType != tt.wantRangeType {
|
|
t.Fatalf("VideoRangeType = %q, want %q", track.VideoRangeType, tt.wantRangeType)
|
|
}
|
|
if track.DVProfile != tt.wantProfile {
|
|
t.Fatalf("DVProfile = %d, want %d", track.DVProfile, tt.wantProfile)
|
|
}
|
|
if track.DVBLCompatID != tt.wantCompatID {
|
|
t.Fatalf("DVBLCompatID = %d, want %d", track.DVBLCompatID, tt.wantCompatID)
|
|
}
|
|
if track.DVELPresent != tt.wantEL {
|
|
t.Fatalf("DVELPresent = %v, want %v", track.DVELPresent, tt.wantEL)
|
|
}
|
|
if track.HDR10Plus != tt.wantHDR10Plus {
|
|
t.Fatalf("HDR10Plus = %v, want %v", track.HDR10Plus, tt.wantHDR10Plus)
|
|
}
|
|
})
|
|
}
|
|
}
|