Browse Source

qsv and logging fixes (#637)

* improve pipeline logging

* fix qsv acceleration

* fix qsv parameter order
pull/638/head
Jason Dove 4 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 @@ -226,12 +226,21 @@ public class FFmpegLibraryProcessService : IFFmpegProcessService
{
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);
IList<string> arguments = CommandGenerator.GenerateArguments(inputFiles, pipelineSteps);
_logger.LogDebug(
"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
{

16
ErsatzTV.FFmpeg.Tests/PipelineBuilderTests.cs

@ -64,9 +64,9 @@ public class PipelineGeneratorTests @@ -64,9 +64,9 @@ public class PipelineGeneratorTests
0);
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);
}
@ -120,9 +120,9 @@ public class PipelineGeneratorTests @@ -120,9 +120,9 @@ public class PipelineGeneratorTests
0);
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);
}
@ -139,16 +139,16 @@ public class PipelineGeneratorTests @@ -139,16 +139,16 @@ public class PipelineGeneratorTests
};
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);
}
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)}");
}
}

6
ErsatzTV.FFmpeg/FFmpegPipeline.cs

@ -0,0 +1,6 @@ @@ -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 @@ -11,11 +11,25 @@ public class QsvHardwareAccelerationOption : GlobalOption
FFmpegFormat.P010LE
};
public override IList<string> GlobalOptions => new List<string>
public override IList<string> GlobalOptions
{
"-hwaccel", "qsv",
"-init_hw_device", "qsv=qsv:MFX_IMPL_hw_any"
};
get
{
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
public override FrameState NextState(FrameState currentState)
@ -29,13 +43,9 @@ public class QsvHardwareAccelerationOption : GlobalOption @@ -29,13 +43,9 @@ public class QsvHardwareAccelerationOption : GlobalOption
return result;
}
return currentState with { PixelFormat = new PixelFormatNv12(pixelFormat.Name) };
return result with { PixelFormat = new PixelFormatNv12(pixelFormat.Name) };
}
return currentState with
{
HardwareAccelerationMode = HardwareAccelerationMode.Qsv,
PixelFormat = new PixelFormatNv12(new PixelFormatUnknown().Name)
};
return result with { PixelFormat = new PixelFormatNv12(new PixelFormatUnknown().Name) };
}
}

4
ErsatzTV.FFmpeg/PipelineBuilder.cs

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

Loading…
Cancel
Save