Repair inherited Dolby Vision cache metadata
This commit is contained in:
+56
-1
@@ -4,6 +4,8 @@ import os
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
from types import SimpleNamespace
|
||||
from unittest import mock
|
||||
|
||||
|
||||
class CoreTests(unittest.TestCase):
|
||||
@@ -56,11 +58,44 @@ class CoreTests(unittest.TestCase):
|
||||
hdr = manager.ffmpeg_command(
|
||||
Path("show.HDR10.mkv"), Path("out.mkv.partial"), {"color_transfer": "smpte2084"}
|
||||
)
|
||||
self.assertIn("zscale=dither=error_diffusion,format=yuv420p", sdr)
|
||||
self.assertTrue(any("zscale=dither=error_diffusion,format=yuv420p" in value for value in sdr))
|
||||
self.assertIn("-filter_complex", sdr)
|
||||
self.assertIn("[video]", sdr)
|
||||
self.assertNotIn("-vf", sdr)
|
||||
self.assertIn("18", sdr)
|
||||
self.assertTrue(any("tonemap=tonemap=hable" in value for value in hdr))
|
||||
self.assertIn("bt709", hdr)
|
||||
|
||||
def test_probe_detects_dolby_vision_stream_metadata(self):
|
||||
manager = self.module.Manager()
|
||||
result = SimpleNamespace(
|
||||
returncode=0,
|
||||
stderr="",
|
||||
stdout=json.dumps({
|
||||
"streams": [{
|
||||
"codec_name": "h264",
|
||||
"profile": "High",
|
||||
"pix_fmt": "yuv420p",
|
||||
"bits_per_raw_sample": "8",
|
||||
"color_transfer": "bt709",
|
||||
"side_data_list": [{"side_data_type": "DOVI configuration record"}],
|
||||
}],
|
||||
"format": {"duration": "10.0"},
|
||||
}),
|
||||
)
|
||||
with mock.patch.object(self.module.subprocess, "run", return_value=result):
|
||||
details = manager.probe(Path("cached.mkv"))
|
||||
self.assertTrue(details["dolby_vision"])
|
||||
|
||||
def test_validation_rejects_inherited_dolby_vision_metadata(self):
|
||||
manager = self.module.Manager()
|
||||
output = self.root / "cache" / "invalid.mkv"
|
||||
output.write_bytes(b"x" * 1_000_001)
|
||||
details = {"codec": "h264", "bit_depth": 8, "dolby_vision": True, "duration": 10.0}
|
||||
with mock.patch.object(manager, "probe", return_value=details):
|
||||
with self.assertRaisesRegex(RuntimeError, "Dolby Vision"):
|
||||
manager.validate_output(Path("source.mkv"), output, 10.0)
|
||||
|
||||
def test_cache_requires_matching_source_fingerprint(self):
|
||||
m = self.module
|
||||
manager = m.Manager()
|
||||
@@ -79,6 +114,26 @@ class CoreTests(unittest.TestCase):
|
||||
source.write_bytes(b"changed")
|
||||
self.assertFalse(manager.cache_valid(relative))
|
||||
|
||||
def test_lru_touches_only_manifest(self):
|
||||
m = self.module
|
||||
manager = m.Manager()
|
||||
relative = "movies/LRU/LRU.mkv"
|
||||
source = self.root / "source" / relative
|
||||
source.parent.mkdir(parents=True, exist_ok=True)
|
||||
source.write_bytes(b"original")
|
||||
output, manifest = manager.cache_paths(relative)
|
||||
output.write_bytes(b"cached")
|
||||
manifest.write_text(json.dumps({
|
||||
"relative": relative,
|
||||
"source_fingerprint": m.fingerprint(source),
|
||||
"encode_profile": m.ENCODE_PROFILE,
|
||||
}))
|
||||
os.utime(output, (100, 100))
|
||||
os.utime(manifest, (100, 100))
|
||||
manager.touch_cache(relative)
|
||||
self.assertEqual(output.stat().st_mtime, 100)
|
||||
self.assertGreater(manifest.stat().st_mtime, 100)
|
||||
|
||||
def test_smaller_cache_limit_evicts_oldest_content(self):
|
||||
m = self.module
|
||||
manager = m.Manager()
|
||||
|
||||
Reference in New Issue
Block a user