mirror of
https://github.com/rosenbjerg/FFMpegCore.git
synced 2024-11-10 08:34:12 +01:00
Fixed process hang on pipe images format mismatch
Former-commit-id: fe646752d3
This commit is contained in:
parent
6602c87022
commit
ba8904429d
5 changed files with 103 additions and 4 deletions
|
@ -21,7 +21,7 @@ public static IEnumerable<IVideoFrame> CreateBitmaps(int count, PixelFormat fmt,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BitmapVideoFrameWrapper CreateVideoFrame(int index, PixelFormat fmt, int w, int h, float scaleNoise, float offset)
|
public static BitmapVideoFrameWrapper CreateVideoFrame(int index, PixelFormat fmt, int w, int h, float scaleNoise, float offset)
|
||||||
{
|
{
|
||||||
var bitmap = new Bitmap(w, h, fmt);
|
var bitmap = new Bitmap(w, h, fmt);
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,92 @@ public void Video_ToMP4_Args_Pipe(System.Drawing.Imaging.PixelFormat pixelFormat
|
||||||
Assert.IsTrue(success);
|
Assert.IsTrue(success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod, Timeout(10000)]
|
||||||
|
public void Video_ToMP4_Args_Pipe_DifferentImageSizes()
|
||||||
|
{
|
||||||
|
using var outputFile = new TemporaryFile($"out{VideoType.Mp4.Extension}");
|
||||||
|
|
||||||
|
var frames = new List<IVideoFrame>
|
||||||
|
{
|
||||||
|
BitmapSource.CreateVideoFrame(0, System.Drawing.Imaging.PixelFormat.Format24bppRgb, 255, 255, 1, 0),
|
||||||
|
BitmapSource.CreateVideoFrame(0, System.Drawing.Imaging.PixelFormat.Format24bppRgb, 256, 256, 1, 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
var videoFramesSource = new RawVideoPipeSource(frames);
|
||||||
|
var ex = Assert.ThrowsException<FFMpegException>(() => FFMpegArguments
|
||||||
|
.FromPipeInput(videoFramesSource)
|
||||||
|
.OutputToFile(outputFile, false, opt => opt
|
||||||
|
.WithVideoCodec(VideoCodec.LibX264))
|
||||||
|
.ProcessSynchronously());
|
||||||
|
|
||||||
|
Assert.IsInstanceOfType(ex.GetBaseException(), typeof(FFMpegStreamFormatException));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[TestMethod, Timeout(10000)]
|
||||||
|
public async Task Video_ToMP4_Args_Pipe_DifferentImageSizes_Async()
|
||||||
|
{
|
||||||
|
using var outputFile = new TemporaryFile($"out{VideoType.Mp4.Extension}");
|
||||||
|
|
||||||
|
var frames = new List<IVideoFrame>
|
||||||
|
{
|
||||||
|
BitmapSource.CreateVideoFrame(0, System.Drawing.Imaging.PixelFormat.Format24bppRgb, 255, 255, 1, 0),
|
||||||
|
BitmapSource.CreateVideoFrame(0, System.Drawing.Imaging.PixelFormat.Format24bppRgb, 256, 256, 1, 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
var videoFramesSource = new RawVideoPipeSource(frames);
|
||||||
|
var ex = await Assert.ThrowsExceptionAsync<FFMpegException>(() => FFMpegArguments
|
||||||
|
.FromPipeInput(videoFramesSource)
|
||||||
|
.OutputToFile(outputFile, false, opt => opt
|
||||||
|
.WithVideoCodec(VideoCodec.LibX264))
|
||||||
|
.ProcessAsynchronously());
|
||||||
|
|
||||||
|
Assert.IsInstanceOfType(ex.GetBaseException(), typeof(FFMpegStreamFormatException));
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod, Timeout(10000)]
|
||||||
|
public void Video_ToMP4_Args_Pipe_DifferentPixelFormats()
|
||||||
|
{
|
||||||
|
using var outputFile = new TemporaryFile($"out{VideoType.Mp4.Extension}");
|
||||||
|
|
||||||
|
var frames = new List<IVideoFrame>
|
||||||
|
{
|
||||||
|
BitmapSource.CreateVideoFrame(0, System.Drawing.Imaging.PixelFormat.Format24bppRgb, 255, 255, 1, 0),
|
||||||
|
BitmapSource.CreateVideoFrame(0, System.Drawing.Imaging.PixelFormat.Format32bppRgb, 255, 255, 1, 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
var videoFramesSource = new RawVideoPipeSource(frames);
|
||||||
|
var ex = Assert.ThrowsException<FFMpegException>(() => FFMpegArguments
|
||||||
|
.FromPipeInput(videoFramesSource)
|
||||||
|
.OutputToFile(outputFile, false, opt => opt
|
||||||
|
.WithVideoCodec(VideoCodec.LibX264))
|
||||||
|
.ProcessSynchronously());
|
||||||
|
|
||||||
|
Assert.IsInstanceOfType(ex.GetBaseException(), typeof(FFMpegStreamFormatException));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[TestMethod, Timeout(10000)]
|
||||||
|
public async Task Video_ToMP4_Args_Pipe_DifferentPixelFormats_Async()
|
||||||
|
{
|
||||||
|
using var outputFile = new TemporaryFile($"out{VideoType.Mp4.Extension}");
|
||||||
|
|
||||||
|
var frames = new List<IVideoFrame>
|
||||||
|
{
|
||||||
|
BitmapSource.CreateVideoFrame(0, System.Drawing.Imaging.PixelFormat.Format24bppRgb, 255, 255, 1, 0),
|
||||||
|
BitmapSource.CreateVideoFrame(0, System.Drawing.Imaging.PixelFormat.Format32bppRgb, 255, 255, 1, 0)
|
||||||
|
};
|
||||||
|
|
||||||
|
var videoFramesSource = new RawVideoPipeSource(frames);
|
||||||
|
var ex = await Assert.ThrowsExceptionAsync<FFMpegException>(() => FFMpegArguments
|
||||||
|
.FromPipeInput(videoFramesSource)
|
||||||
|
.OutputToFile(outputFile, false, opt => opt
|
||||||
|
.WithVideoCodec(VideoCodec.LibX264))
|
||||||
|
.ProcessAsynchronously());
|
||||||
|
|
||||||
|
Assert.IsInstanceOfType(ex.GetBaseException(), typeof(FFMpegStreamFormatException));
|
||||||
|
}
|
||||||
|
|
||||||
[TestMethod, Timeout(10000)]
|
[TestMethod, Timeout(10000)]
|
||||||
public void Video_ToMP4_Args_StreamPipe()
|
public void Video_ToMP4_Args_StreamPipe()
|
||||||
{
|
{
|
||||||
|
@ -114,6 +200,8 @@ await FFMpegArguments
|
||||||
.ProcessAsynchronously();
|
.ProcessAsynchronously();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[TestMethod, Timeout(10000)]
|
[TestMethod, Timeout(10000)]
|
||||||
public void Video_StreamFile_OutputToMemoryStream()
|
public void Video_StreamFile_OutputToMemoryStream()
|
||||||
{
|
{
|
||||||
|
|
|
@ -42,12 +42,15 @@ public async Task During(CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
await ProcessDataAsync(cancellationToken);
|
await ProcessDataAsync(cancellationToken);
|
||||||
Debug.WriteLine($"Disconnecting NamedPipeServerStream on {GetType().Name}");
|
Debug.WriteLine($"Disconnecting NamedPipeServerStream on {GetType().Name}");
|
||||||
Pipe?.Disconnect();
|
|
||||||
}
|
}
|
||||||
catch (TaskCanceledException)
|
catch (TaskCanceledException)
|
||||||
{
|
{
|
||||||
Debug.WriteLine($"ProcessDataAsync on {GetType().Name} cancelled");
|
Debug.WriteLine($"ProcessDataAsync on {GetType().Name} cancelled");
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Pipe?.Disconnect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract Task ProcessDataAsync(CancellationToken token);
|
protected abstract Task ProcessDataAsync(CancellationToken token);
|
||||||
|
|
|
@ -49,4 +49,12 @@ public FFMpegArgumentException(string? message = null, Exception? innerException
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class FFMpegStreamFormatException : FFMpegException
|
||||||
|
{
|
||||||
|
public FFMpegStreamFormatException(FFMpegExceptionType type, string message, Exception? innerException = null)
|
||||||
|
: base(type, message, innerException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -64,7 +64,7 @@ public async Task WriteAsync(System.IO.Stream outputStream, CancellationToken ca
|
||||||
private void CheckFrameAndThrow(IVideoFrame frame)
|
private void CheckFrameAndThrow(IVideoFrame frame)
|
||||||
{
|
{
|
||||||
if (frame.Width != Width || frame.Height != Height || frame.Format != StreamFormat)
|
if (frame.Width != Width || frame.Height != Height || frame.Format != StreamFormat)
|
||||||
throw new FFMpegException(FFMpegExceptionType.Operation, "Video frame is not the same format as created raw video stream\r\n" +
|
throw new FFMpegStreamFormatException(FFMpegExceptionType.Operation, "Video frame is not the same format as created raw video stream\r\n" +
|
||||||
$"Frame format: {frame.Width}x{frame.Height} pix_fmt: {frame.Format}\r\n" +
|
$"Frame format: {frame.Width}x{frame.Height} pix_fmt: {frame.Format}\r\n" +
|
||||||
$"Stream format: {Width}x{Height} pix_fmt: {StreamFormat}");
|
$"Stream format: {Width}x{Height} pix_fmt: {StreamFormat}");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue