diff --git a/encore-common/src/main/kotlin/se/svt/oss/encore/service/mediaanalyzer/MediaAnalyzerService.kt b/encore-common/src/main/kotlin/se/svt/oss/encore/service/mediaanalyzer/MediaAnalyzerService.kt index c52aef9..0515872 100644 --- a/encore-common/src/main/kotlin/se/svt/oss/encore/service/mediaanalyzer/MediaAnalyzerService.kt +++ b/encore-common/src/main/kotlin/se/svt/oss/encore/service/mediaanalyzer/MediaAnalyzerService.kt @@ -30,6 +30,7 @@ import se.svt.oss.mediaanalyzer.mediainfo.MediaInfo import se.svt.oss.mediaanalyzer.mediainfo.OtherTrack import se.svt.oss.mediaanalyzer.mediainfo.TextTrack import se.svt.oss.mediaanalyzer.mediainfo.VideoTrack +import java.util.concurrent.ConcurrentHashMap private val log = KotlinLogging.logger {} @@ -52,15 +53,18 @@ private val log = KotlinLogging.logger {} ) class MediaAnalyzerService(private val mediaAnalyzer: MediaAnalyzer) { + val ffprobeValidParams = getValidFfprobeParams() + fun analyzeInput(input: Input) { log.debug { "Analyzing input $input" } val probeInterlaced = input is VideoIn && input.probeInterlaced val useFirstAudioStreams = (input as? AudioIn)?.channelLayout?.channels?.size + val ffprobeInputParams = LinkedHashMap(input.params.filterKeys { ffprobeValidParams.contains(it) }) input.analyzed = mediaAnalyzer.analyze( file = input.uri, probeInterlaced = probeInterlaced, - ffprobeInputParams = input.params, + ffprobeInputParams = ffprobeInputParams, ).let { val selectedVideoStream = (input as? VideoIn)?.videoStream val selectedAudioStream = (input as? AudioIn)?.audioStream @@ -75,3 +79,22 @@ class MediaAnalyzerService(private val mediaAnalyzer: MediaAnalyzer) { } } } + +fun getValidFfprobeParams(): Set { + val process = ProcessBuilder("ffprobe", "-h") + .redirectErrorStream(true) + .start() + val output = process.inputStream.bufferedReader().use { it.readText() } + val exitCode = process.waitFor() + if (exitCode != 0) { + log.error { "Failed to get valid ffprobe parameters, ffprobe failed with exit code: $exitCode" } + return emptySet() + } + val result = ConcurrentHashMap.newKeySet() + output.lines().filter { it.startsWith(" -") || it.startsWith("-") } + .forEach { line -> + val param = line.substringAfter("-").substringBefore(" ") + result.add(param) + } + return result +}