74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
import { toEven } from '@peertube/peertube-core-utils'
|
|
import { VideoResolution, VideoResolutionType } from '@peertube/peertube-models'
|
|
import { CONFIG } from '@server/initializers/config.js'
|
|
|
|
export function buildOriginalFileResolution (inputResolution: number) {
|
|
if (CONFIG.TRANSCODING.ALWAYS_TRANSCODE_ORIGINAL_RESOLUTION === true) {
|
|
return toEven(inputResolution)
|
|
}
|
|
|
|
const resolutions = computeResolutionsToTranscode({
|
|
input: inputResolution,
|
|
type: 'vod',
|
|
includeInput: false,
|
|
strictLower: false,
|
|
// We don't really care about the audio resolution in this context
|
|
hasAudio: true
|
|
})
|
|
|
|
if (resolutions.length === 0) {
|
|
return toEven(inputResolution)
|
|
}
|
|
|
|
return Math.max(...resolutions)
|
|
}
|
|
|
|
export function computeResolutionsToTranscode (options: {
|
|
input: number
|
|
type: 'vod' | 'live'
|
|
includeInput: boolean
|
|
strictLower: boolean
|
|
hasAudio: boolean
|
|
}) {
|
|
const { input, type, includeInput, strictLower, hasAudio } = options
|
|
|
|
const configResolutions = type === 'vod'
|
|
? CONFIG.TRANSCODING.RESOLUTIONS
|
|
: CONFIG.LIVE.TRANSCODING.RESOLUTIONS
|
|
|
|
const resolutionsEnabled = new Set<number>()
|
|
|
|
// Put in the order we want to proceed jobs
|
|
const availableResolutions: VideoResolutionType[] = [
|
|
VideoResolution.H_NOVIDEO,
|
|
VideoResolution.H_480P,
|
|
VideoResolution.H_360P,
|
|
VideoResolution.H_720P,
|
|
VideoResolution.H_240P,
|
|
VideoResolution.H_144P,
|
|
VideoResolution.H_1080P,
|
|
VideoResolution.H_1440P,
|
|
VideoResolution.H_4K
|
|
]
|
|
|
|
for (const resolution of availableResolutions) {
|
|
// Resolution not enabled
|
|
if (configResolutions[resolution + 'p'] !== true) continue
|
|
// Too big resolution for input file
|
|
if (input < resolution) continue
|
|
// We only want lower resolutions than input file
|
|
if (strictLower && input === resolution) continue
|
|
// Audio resolutio but no audio in the video
|
|
if (resolution === VideoResolution.H_NOVIDEO && !hasAudio) continue
|
|
|
|
resolutionsEnabled.add(resolution)
|
|
}
|
|
|
|
if (includeInput) {
|
|
// Always use an even resolution to avoid issues with ffmpeg
|
|
resolutionsEnabled.add(toEven(input))
|
|
}
|
|
|
|
return Array.from(resolutionsEnabled)
|
|
}
|