//go:build darwin && !cgo package platform import ( "fmt" "runtime" "strings" "gitgud.io/mike/mpv-manager/pkg/log" ) func detectCodecSupportDarwin() ([]string, error) { if runtime.GOOS != "darwin" { return nil, fmt.Errorf("not running on macOS") } log.Info("Using model-based codec detection") return detectCodecSupportDarwinForGPU(detectGPUDarwin()) } func detectCodecSupportDarwinForGPU(info *GPUInfo) ([]string, error) { if info == nil || len(info.Models) == 0 { // Probe failure is uncertainty, not evidence of AV1 support. return []string{"hevc", "avc"}, nil } cpuModel := strings.ToLower(info.Models[0]) return getCodecsForModel(cpuModel) } func getCodecsForModel(cpuModel string) ([]string, error) { // Intel Macs report a GPU name (e.g. "Intel Iris Plus Graphics 655"), not // an Apple chip; they hardware-decode AVC and HEVC only. Check before the // Apple-silicon defaults so they don't falsely claim AV1. if strings.Contains(strings.ToLower(cpuModel), "intel") { return []string{"avc", "hevc"}, nil } modelNum := extractModelNumber(cpuModel) if strings.HasPrefix(modelNum, "m1") { return []string{"hevc", "avc", "prores"}, nil } if strings.HasPrefix(modelNum, "m2") { return []string{"hevc", "avc", "vp9", "prores"}, nil } if strings.HasPrefix(modelNum, "m3") { return []string{"hevc", "avc", "vp9", "av1", "prores"}, nil } if strings.HasPrefix(modelNum, "m4") { return []string{"hevc", "avc", "vp9", "av1", "prores"}, nil } if strings.HasPrefix(modelNum, "m5") { return []string{"hevc", "avc", "vp9", "av1", "prores"}, nil } // Unknown/future model strings fail conservatively. Runtime probing can // add newer codecs when it is available; a model parse failure must not. return []string{"hevc", "avc"}, nil } func extractModelNumber(cpuModel string) string { cpuModel = strings.ToLower(cpuModel) if strings.Contains(cpuModel, "m1") { return "m1" } if strings.Contains(cpuModel, "m2") { return "m2" } if strings.Contains(cpuModel, "m3") { return "m3" } if strings.Contains(cpuModel, "m4") { return "m4" } if strings.Contains(cpuModel, "m5") { return "m5" } return "" }