Browse Source

qsv and logging fixes (#637)

* improve pipeline logging

* fix qsv acceleration

* fix qsv parameter order
pull/638/head
Jason Dove 5 years ago committed by GitHub
parent
commit
a7922beaed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      ErsatzTV.Core/FFmpeg/FFmpegLibraryProcessService.cs
  2. 16
      ErsatzTV.FFmpeg.Tests/PipelineBuilderTests.cs
  3. 6
      ErsatzTV.FFmpeg/FFmpegPipeline.cs
  4. 30
      ErsatzTV.FFmpeg/Option/HardwareAcceleration/QsvHardwareAccelerationOption.cs
  5. 4
      ErsatzTV.FFmpeg/PipelineBuilder.cs

17
ErsatzTV.Core/FFmpeg/FFmpegLibraryProcessService.cs

@ -226,12 +226,21 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService
{ {
var pipelineBuilder = new PipelineBuilder(inputFiles, FileSystemLayout.FFmpegReportsFolder, _logger); var pipelineBuilder = new PipelineBuilder(inputFiles, FileSystemLayout.FFmpegReportsFolder, _logger);
IList<IPipelineStep> pipelineSteps = pipelineBuilder.Build(desiredState); FFmpegPipeline pipeline = pipelineBuilder.Build(desiredState);
_logger.LogDebug("FFmpeg pipeline {PipelineSteps}", pipelineSteps.Map(ps => ps.GetType().Name)); IEnumerable<string> loggedSteps = pipeline.PipelineSteps.Map(ps => ps.GetType().Name);
IEnumerable<string> loggedVideoFilters = pipeline.VideoFilterSteps.Map(vf => vf.GetType().Name);
IEnumerable<string> loggedAudioFilters = pipeline.AudioFilterSteps.Map(af => af.GetType().Name);
IList<EnvironmentVariable> environmentVariables = CommandGenerator.GenerateEnvironmentVariables(pipelineSteps); _logger.LogDebug(
IList<string> arguments = CommandGenerator.GenerateArguments(inputFiles, pipelineSteps); "FFmpeg pipeline {PipelineSteps}, {AudioFilters}, {VideoFilters}",
loggedSteps,
loggedAudioFilters,
loggedVideoFilters
);
IList<EnvironmentVariable> environmentVariables = CommandGenerator.GenerateEnvironmentVariables(pipeline.PipelineSteps);
IList<string> arguments = CommandGenerator.GenerateArguments(inputFiles, pipeline.PipelineSteps);
var startInfo = new ProcessStartInfo var startInfo = new ProcessStartInfo
{ {

16
ErsatzTV.FFmpeg.Tests/PipelineBuilderTests.cs

@ -64,9 +64,9 @@ public class PipelineGeneratorTests
0); 0);
var builder = new PipelineBuilder(inputFiles, "", _logger); var builder = new PipelineBuilder(inputFiles, "", _logger);
IList<IPipelineStep> result = builder.Build(desiredState); FFmpegPipeline result = builder.Build(desiredState);
result.Should().HaveCountGreaterThan(0); result.PipelineSteps.Should().HaveCountGreaterThan(0);
PrintCommand(inputFiles, result); PrintCommand(inputFiles, result);
} }
@ -120,9 +120,9 @@ public class PipelineGeneratorTests
0); 0);
var builder = new PipelineBuilder(inputFiles, "", _logger); var builder = new PipelineBuilder(inputFiles, "", _logger);
IList<IPipelineStep> result = builder.Build(desiredState); FFmpegPipeline result = builder.Build(desiredState);
result.Should().HaveCountGreaterThan(0); result.PipelineSteps.Should().HaveCountGreaterThan(0);
PrintCommand(inputFiles, result); PrintCommand(inputFiles, result);
} }
@ -139,16 +139,16 @@ public class PipelineGeneratorTests
}; };
var builder = new PipelineBuilder(inputFiles, "", _logger); var builder = new PipelineBuilder(inputFiles, "", _logger);
IList<IPipelineStep> result = builder.Build(desiredState); FFmpegPipeline result = builder.Build(desiredState);
result.Should().HaveCountGreaterThan(0); result.PipelineSteps.Should().HaveCountGreaterThan(0);
PrintCommand(inputFiles, result); PrintCommand(inputFiles, result);
} }
private static void PrintCommand(IEnumerable<InputFile> inputFiles, IList<IPipelineStep> pipeline) private static void PrintCommand(IEnumerable<InputFile> inputFiles, FFmpegPipeline pipeline)
{ {
IList<string> arguments = CommandGenerator.GenerateArguments(inputFiles, pipeline); IList<string> arguments = CommandGenerator.GenerateArguments(inputFiles, pipeline.PipelineSteps);
Console.WriteLine($"Generated command: ffmpeg {string.Join(" ", arguments)}"); Console.WriteLine($"Generated command: ffmpeg {string.Join(" ", arguments)}");
} }
} }

6
ErsatzTV.FFmpeg/FFmpegPipeline.cs

@ -0,0 +1,6 @@
namespace ErsatzTV.FFmpeg;
public record FFmpegPipeline(
IList<IPipelineStep> PipelineSteps,
IList<IPipelineFilterStep> VideoFilterSteps,
IList<IPipelineFilterStep> AudioFilterSteps);

30
ErsatzTV.FFmpeg/Option/HardwareAcceleration/QsvHardwareAccelerationOption.cs

@ -11,11 +11,25 @@ public class QsvHardwareAccelerationOption : GlobalOption
FFmpegFormat.P010LE FFmpegFormat.P010LE
}; };
public override IList<string> GlobalOptions => new List<string> public override IList<string> GlobalOptions
{ {
"-hwaccel", "qsv", get
"-init_hw_device", "qsv=qsv:MFX_IMPL_hw_any" {
}; string[] initDevices = OperatingSystem.IsWindows()
? new[] { "-init_hw_device", "qsv=hw:hw,child_device_type=dxva2", "-filter_hw_device", "hw" }
: new[] { "-init_hw_device", "qsv=hw", "-filter_hw_device", "hw" };
var result = new List<string>
{
"-hwaccel", "qsv",
"-hwaccel_output_format", "qsv"
};
result.AddRange(initDevices);
return result;
}
}
// qsv encoders want nv12 // qsv encoders want nv12
public override FrameState NextState(FrameState currentState) public override FrameState NextState(FrameState currentState)
@ -29,13 +43,9 @@ public class QsvHardwareAccelerationOption : GlobalOption
return result; return result;
} }
return currentState with { PixelFormat = new PixelFormatNv12(pixelFormat.Name) }; return result with { PixelFormat = new PixelFormatNv12(pixelFormat.Name) };
} }
return currentState with return result with { PixelFormat = new PixelFormatNv12(new PixelFormatUnknown().Name) };
{
HardwareAccelerationMode = HardwareAccelerationMode.Qsv,
PixelFormat = new PixelFormatNv12(new PixelFormatUnknown().Name)
};
} }
} }

4
ErsatzTV.FFmpeg/PipelineBuilder.cs

@ -44,7 +44,7 @@ public class PipelineBuilder
_logger = logger; _logger = logger;
} }
public IList<IPipelineStep> Build(FrameState desiredState) public FFmpegPipeline Build(FrameState desiredState)
{ {
var allVideoStreams = _inputFiles.SelectMany(f => f.Streams) var allVideoStreams = _inputFiles.SelectMany(f => f.Streams)
.Filter(s => s.Kind == StreamKind.Video) .Filter(s => s.Kind == StreamKind.Video)
@ -499,7 +499,7 @@ public class PipelineBuilder
} }
} }
return _pipelineSteps; return new FFmpegPipeline(_pipelineSteps, _videoFilterSteps, _audioFilterSteps);
} }
private static bool IsDesiredVideoState(FrameState currentState, FrameState desiredState) private static bool IsDesiredVideoState(FrameState currentState, FrameState desiredState)

Loading…
Cancel
Save