Skip to content

Instantly share code, notes, and snippets.

@keima
Created May 16, 2025 03:21
Show Gist options
  • Save keima/e079ba24b21e69a60c3ecde4aa2a9c18 to your computer and use it in GitHub Desktop.
Save keima/e079ba24b21e69a60c3ecde4aa2a9c18 to your computer and use it in GitHub Desktop.
function createVfParameter(stream) {
let deinterlace = false, hdrToSDR = false, resize = false;
// deinterlace
if (stream.field_order !== 'progressive') {
deinterlace = true
}
// HDR to SDR
if (
stream.color_transfer === 'smpte2084'
&& stream.color_primaries === 'bt2020'
&& stream.color_range === 'tv'
) {
hdrToSDR = true
}
// convert to 720p
if (stream.height > 720) {
resize = true
}
const useVf = deinterlace || hdrToSDR || resize
const vfParameter = useVf ? [
'hwupload=extra_hw_frames=10',
'format=qsv',
resize && 'scale_qsv=-1:720',
deinterlace && 'vpp_qsv=deinterlace=2',
...(hdrToSDR ? [
'hwdownload,format=nv12',
'zscale=t=linear:npl=100,format=yuv420p',
] : []),
].filter(Boolean).join(',') : []
return {useVf, vfParameter}
}
module.exports = async (args) => {
// const checkFfmpegCommandInit = require("../../../../FlowHelpers/1.0.0/interfaces/flowUtils")
// checkFfmpegCommandInit(args)
let shouldAppendQsvParameter = false
args.variables.ffmpegCommand.streams.forEach((stream) => {
if (stream.codec_type === 'video') {
const { useVf, vfParameter } = createVfParameter(stream)
if (useVf && vfParameter.length > 0) {
stream.outputArgs.push('-vf', vfParameter)
shouldAppendQsvParameter = true
}
}
})
if (shouldAppendQsvParameter) {
// -init_hw_device qsv=qsv:hw -hwaccel qsv -filter_hw_device qsv
args.variables.ffmpegCommand.overallInputArguments.push(
"-init_hw_device", "qsv=qsv:hw",
"-hwaccel", "qsv",
"-hwaccel_output_format", "qsv", // HWデコード
"-filter_hw_device", "qsv",
)
}
return {
outputFileObj: args.inputFileObj,
outputNumber: 1,
variables: args.variables,
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment