Drain stderr and stdout concurrently for encoder validation
Some ffmpeg build might output extremely long traces for its banner that consume all pipe capacity and hangs the process. We have to drain both streams regardless on which one we actually read.
This commit is contained in:
@@ -8,6 +8,7 @@ using System.Linq;
|
||||
using System.Runtime.Versioning;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using MediaBrowser.Controller.MediaEncoding;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
@@ -662,8 +663,15 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
||||
writer.Write(testKey);
|
||||
}
|
||||
|
||||
using var reader = readStdErr ? process.StandardError : process.StandardOutput;
|
||||
return reader.ReadToEnd();
|
||||
// Drain both streams concurrently to prevent pipe hanging, see #17429
|
||||
using var standardOutput = process.StandardOutput;
|
||||
using var standardError = process.StandardError;
|
||||
var standardOutputTask = standardOutput.ReadToEndAsync();
|
||||
var standardErrorTask = standardError.ReadToEndAsync();
|
||||
process.WaitForExit();
|
||||
Task.WaitAll(standardOutputTask, standardErrorTask);
|
||||
|
||||
return (readStdErr ? standardErrorTask : standardOutputTask).GetAwaiter().GetResult();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user