diff --git a/lib/screens/video_player_screen.dart b/lib/screens/video_player_screen.dart index b1e48326..2769e844 100644 --- a/lib/screens/video_player_screen.dart +++ b/lib/screens/video_player_screen.dart @@ -298,8 +298,8 @@ class VideoPlayerScreenState extends State await player!.setProperty('audio-exclusive', 'yes'); } - // HDR is controlled via custom hdr-enabled property on iOS/macOS - if (Platform.isIOS || Platform.isMacOS) { + // HDR is controlled via custom hdr-enabled property on iOS/macOS/Windows + if (Platform.isIOS || Platform.isMacOS || Platform.isWindows) { final enableHDR = settingsService.getEnableHDR(); await player!.setProperty('hdr-enabled', enableHDR ? 'yes' : 'no'); } diff --git a/lib/widgets/video_controls/sheets/video_settings_sheet.dart b/lib/widgets/video_controls/sheets/video_settings_sheet.dart index 9734eaba..12e6a94c 100644 --- a/lib/widgets/video_controls/sheets/video_settings_sheet.dart +++ b/lib/widgets/video_controls/sheets/video_settings_sheet.dart @@ -274,8 +274,8 @@ class _VideoSettingsSheetState extends State { onTap: () => _navigateTo(_SettingsView.subtitleSync), ), - // HDR Toggle (iOS and macOS only) - if (Platform.isIOS || Platform.isMacOS) + // HDR Toggle (iOS, macOS, and Windows) + if (Platform.isIOS || Platform.isMacOS || Platform.isWindows) ListTile( leading: Icon( Icons.hdr_strong, diff --git a/windows/runner/mpv/mpv_player.cpp b/windows/runner/mpv/mpv_player.cpp index e6e278c4..d390c12c 100644 --- a/windows/runner/mpv/mpv_player.cpp +++ b/windows/runner/mpv/mpv_player.cpp @@ -77,6 +77,13 @@ bool MpvPlayer::Initialize(HWND container, HWND flutter_window) { mpv_set_option_string(mpv_, "input-vo-keyboard", "no"); mpv_set_option_string(mpv_, "osc", "no"); + // HDR passthrough - let mpv handle color space + mpv_set_option_string(mpv_, "target-colorspace-hint", "yes"); + + // Fallback tone mapping when display doesn't support HDR + mpv_set_option_string(mpv_, "tone-mapping", "auto"); + mpv_set_option_string(mpv_, "hdr-compute-peak", "auto"); + // Enable logging mpv_request_log_messages(mpv_, "v"); @@ -96,6 +103,9 @@ bool MpvPlayer::Initialize(HWND container, HWND flutter_window) { LogToFile("MPV: Initialization successful"); + // Observe video-params/sig-peak for HDR detection + mpv_observe_property(mpv_, 0, "video-params/sig-peak", MPV_FORMAT_DOUBLE); + // Start event loop. StartEventLoop(); LogToFile("MpvPlayer::Initialize - event loop started"); @@ -134,6 +144,14 @@ void MpvPlayer::Command(const std::vector& args) { void MpvPlayer::SetProperty(const std::string& name, const std::string& value) { if (!mpv_) return; + + // Handle custom HDR toggle property (same pattern as iOS/macOS) + if (name == "hdr-enabled") { + bool enabled = (value == "yes" || value == "true" || value == "1"); + SetHDREnabled(enabled); + return; + } + mpv_set_property_string(mpv_, name.c_str(), value.c_str()); } @@ -297,6 +315,14 @@ void MpvPlayer::HandleMpvEvent(mpv_event* event) { break; } + // Handle sig-peak for HDR detection + if (strcmp(prop->name, "video-params/sig-peak") == 0 && + prop->format == MPV_FORMAT_DOUBLE && prop->data) { + double sigPeak = *static_cast(prop->data); + last_sig_peak_ = sigPeak; + UpdateHDRMode(sigPeak); + } + SendPropertyChange(prop->name, &node); break; } @@ -380,4 +406,35 @@ void MpvPlayer::SendEvent(const std::string& name, } } +void MpvPlayer::SetHDREnabled(bool enabled) { + hdr_enabled_ = enabled; + char msg[128]; + snprintf(msg, sizeof(msg), "[MpvPlayer] HDR enabled: %s", enabled ? "true" : "false"); + LogToFile(msg); + + if (mpv_) { + mpv_set_property_string(mpv_, "target-colorspace-hint", enabled ? "yes" : "no"); + } + + UpdateHDRMode(last_sig_peak_); +} + +void MpvPlayer::UpdateHDRMode(double sigPeak) { + bool isHDRContent = sigPeak > 1.0; + + char msg[256]; + snprintf(msg, sizeof(msg), + "[MpvPlayer] HDR mode update (hdrEnabled: %s, sigPeak: %.2f, isHDR: %s)", + hdr_enabled_ ? "true" : "false", + sigPeak, + isHDRContent ? "true" : "false"); + LogToFile(msg); + + // On Windows, mpv handles HDR passthrough automatically when: + // - target-colorspace-hint=yes + // - Windows HDR is enabled in Display Settings + // - Display supports HDR + // No explicit DXGI calls needed - mpv's gpu/d3d11 handles it +} + } // namespace mpv diff --git a/windows/runner/mpv/mpv_player.h b/windows/runner/mpv/mpv_player.h index eabe14dc..5954eb73 100644 --- a/windows/runner/mpv/mpv_player.h +++ b/windows/runner/mpv/mpv_player.h @@ -83,6 +83,14 @@ class MpvPlayer { uint64_t next_reply_userdata_ = 1; std::map observed_properties_; + + // HDR state + bool hdr_enabled_ = true; // User preference + double last_sig_peak_ = 0.0; // Last known sig-peak for HDR content detection + + // HDR methods + void SetHDREnabled(bool enabled); + void UpdateHDRMode(double sigPeak); }; } // namespace mpv