In 2017 the industry quietly stopped shipping 3D Blu-ray players and TVs. The discs and collections remained, but the software capable of playing MVC (Multiview Video Coding, H.264 Annex H) largely disappeared.When you rip a 3D Blu-ray to MKV or keep the original M2TS/SSIF structure, you get a single H.264 stream containing two interleaved camera views. The second view is encoded as differences relative to the first. *FFmpeg (and therefore VLC, MPC-HC, and most “universal” players) decodes only the base view and silently discards the dependent view.* You get a flat 2D image with no warning. The depth information is in the file — it just never gets reconstructed.SyLC is a free, open-source player that solves this from scratch:- Full MVC decoding of both views (base + dependent) using an extended version of the excellent single-TU edge264 decoder. - Real-time C++ demuxer (zero-copy ring buffer) for MKV, SSIF, M2TS and BDMV/ISO. - Native Direct3D 11 HDR rendering pipeline (scRGB / RGBA16F) with a single-pass GPU shader that performs YUV→RGB conversion + stereo frame-packing. - Video slaved to libmpv’s audio clock with interactive A/V trim and drift correction. - Frame-packed output for real 3D TVs, projectors and HMDs, plus an embedded 2D preview.Under the hood (technical details)MVC decoding challenges Extending edge264 for Annex H required: - Handling NAL type 20 (MVC slices) and Subset SPS (NAL 15). - Separate DPB (decoded picture buffer) management per view to respect `max_dec_frame_buffering` independently for each eye. - Inter-view reference handling and proper SPS/PPS/Subset-SPS inheritance and caching. - View re-association via POC to prevent drift between the two eyes. - Careful priming (10–15 AUs) after seek or startup to avoid black frames or buffer overflows. - Synchronous decoding (`n_threads=0`) for MVC state-machine stability.Real-time pipeline threading MVC decode can have significant spikes on I-frames. The solution was to completely decouple decoding from presentation: - Dedicated presenter thread with bounded queue (72 frames ≈ 3 s at 24 fps) and back-pressure. - GIL tuning and careful use of C/C++ extensions (ctypes to edge264, pybind11/.pyd demuxer, libmpv) so the Python UI stays responsive. - Result on dense scenes: stable 24 fps with zero dropped frames where a naïve loop would hitch every GOP.Blu-ray seek robustness Real optical media is unforgiving. SyLC uses `.clpi` EP_map + extent tables for proportional byte-accurate seeks, IDR (or recovery point) alignment, and special handling to avoid excessive head movement (pause MPV readahead during decoder scan, etc.). A robust `RobustSeekQueue` with debounce/cooldown/timeout prevents re-entrant seeks and UI freezes.HDR rendering Decoded YUV planes go straight to the GPU. The D3D11 path bypasses Python/Qt per-frame copies for lower latency. A single shader does colour conversion + frame-packing into an scRGB (RGBA16F) swapchain. HDR10/PQ is preserved end-to-end with no SDR round-trip or tone-mapping.Other components - PGS subtitle streaming (especially useful for MKV/SSIF, avoids long pre-extraction). - Built-in Blu-ray ISO imaging from within the player. - Self-contained Nuitka builds (x64 and native ARM64).How to try itWindows x64 (easiest) is available as a portable folder. Drop an MVC MKV, SSIF folder, or ISO and it should just work. Keyboard controls include `[ ]` for live A/V sync trim.Feedback I’m particularly interested in: - Specific 3D Blu-ray titles or rips that were previously unplayable or had sync/banding issues. - Long-playback A/V drift behaviour. - Performance and latency on different GPUs (especially with the native renderer). - ARM64 experience. - Any edge cases in the MVC decoder or demuxer.All code is open (edge264 extensions, C++ demuxer, Python orchestration, shaders).Thanks for reading. Happy to answer any technical questions in the comments.