diff --git a/CHANGELOG.md b/CHANGELOG.md index 30b51a33..697fd26d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -162,6 +162,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix QSV transcoding errors when scaling - Fix QSV frame freezing in browser - Fix some stream continuity issues, and some cases where audio sync is lost at transition +- Fix HDR transcoding with AMD VAAPI accel ## [25.2.0] - 2025-06-24 ### Added diff --git a/ErsatzTV.FFmpeg/Filter/TonemapFilter.cs b/ErsatzTV.FFmpeg/Filter/TonemapFilter.cs index 6f80ef03..fff4f5f7 100644 --- a/ErsatzTV.FFmpeg/Filter/TonemapFilter.cs +++ b/ErsatzTV.FFmpeg/Filter/TonemapFilter.cs @@ -26,7 +26,7 @@ public class TonemapFilter : BaseFilter { foreach (IPixelFormat pixelFormat in _currentState.PixelFormat) { - if (pixelFormat is PixelFormatCuda) + if (pixelFormat is PixelFormatCuda or PixelFormatVaapi) { foreach (IPixelFormat pf in AvailablePixelFormats.ForPixelFormat(pixelFormat.Name, null)) { diff --git a/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs b/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs index ebf0ab3a..f6b38fe9 100644 --- a/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs +++ b/ErsatzTV.FFmpeg/Pipeline/PipelineBuilderBase.cs @@ -204,6 +204,10 @@ public abstract class PipelineBuilderBase : IPipelineBuilder SetSceneDetect(videoStream, ffmpegState, desiredState, pipelineSteps); SetFFReport(ffmpegState, pipelineSteps); SetStreamSeek(ffmpegState, videoInputFile, context, pipelineSteps); + if (ffmpegState.IsTroubleshooting) + { + SetTimeLimit(ffmpegState, pipelineSteps); + } (FilterChain filterChain, ffmpegState) = BuildVideoPipeline( videoInputFile, @@ -829,5 +833,8 @@ public abstract class PipelineBuilderBase : IPipelineBuilder } } + private static void SetTimeLimit(FFmpegState ffmpegState, List pipelineSteps) => + pipelineSteps.AddRange(ffmpegState.Finish.Map(finish => new TimeLimitOutputOption(finish))); + private sealed record FilterChainAndState(FilterChain FilterChain, FFmpegState FFmpegState); } diff --git a/ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs b/ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs index 0f0f86bc..e64178ac 100644 --- a/ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs +++ b/ErsatzTV.FFmpeg/Pipeline/VaapiPipelineBuilder.cs @@ -650,8 +650,9 @@ public class VaapiPipelineBuilder : SoftwarePipelineBuilder { foreach (IPixelFormat pixelFormat in desiredState.PixelFormat) { - if (ffmpegState.DecoderHardwareAccelerationMode == HardwareAccelerationMode.Vaapi && - _ffmpegCapabilities.HasFilter(FFmpegKnownFilter.TonemapOpenCL)) + if (ffmpegState.DecoderHardwareAccelerationMode == HardwareAccelerationMode.Vaapi + && ffmpegState.VaapiDriver == "iHD" + && _ffmpegCapabilities.HasFilter(FFmpegKnownFilter.TonemapOpenCL)) { var filter = new TonemapVaapiFilter(ffmpegState); currentState = filter.NextState(currentState);