]>
Commit | Line | Data |
---|---|---|
0c9668f7 C |
1 | import { VIDEO_TRANSCODING_FPS } from '@server/initializers/constants' |
2 | import { VideoResolution } from '@shared/models' | |
3 | ||
4 | export function computeOutputFPS (options: { | |
5 | inputFPS: number | |
6 | resolution: VideoResolution | |
7 | }) { | |
8 | const { resolution } = options | |
9 | ||
10 | let fps = options.inputFPS | |
11 | ||
12 | if ( | |
13 | // On small/medium resolutions, limit FPS | |
14 | resolution !== undefined && | |
15 | resolution < VIDEO_TRANSCODING_FPS.KEEP_ORIGIN_FPS_RESOLUTION_MIN && | |
16 | fps > VIDEO_TRANSCODING_FPS.AVERAGE | |
17 | ) { | |
18 | // Get closest standard framerate by modulo: downsampling has to be done to a divisor of the nominal fps value | |
19 | fps = getClosestFramerateStandard({ fps, type: 'STANDARD' }) | |
20 | } | |
21 | ||
22 | // Hard FPS limits | |
23 | if (fps > VIDEO_TRANSCODING_FPS.MAX) fps = getClosestFramerateStandard({ fps, type: 'HD_STANDARD' }) | |
24 | ||
25 | if (fps < VIDEO_TRANSCODING_FPS.MIN) { | |
26 | throw new Error(`Cannot compute FPS because ${fps} is lower than our minimum value ${VIDEO_TRANSCODING_FPS.MIN}`) | |
27 | } | |
28 | ||
29 | return fps | |
30 | } | |
31 | ||
32 | // --------------------------------------------------------------------------- | |
33 | // Private | |
34 | // --------------------------------------------------------------------------- | |
35 | ||
36 | function getClosestFramerateStandard (options: { | |
37 | fps: number | |
38 | type: 'HD_STANDARD' | 'STANDARD' | |
39 | }) { | |
40 | const { fps, type } = options | |
41 | ||
42 | return VIDEO_TRANSCODING_FPS[type].slice(0) | |
43 | .sort((a, b) => fps % a - fps % b)[0] | |
44 | } |