aboutsummaryrefslogtreecommitdiffhomepage
path: root/shared/core-utils/videos/bitrate.ts
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2023-07-31 14:34:36 +0200
committerChocobozzz <me@florianbigard.com>2023-08-11 15:02:33 +0200
commit3a4992633ee62d5edfbb484d9c6bcb3cf158489d (patch)
treee4510b39bdac9c318fdb4b47018d08f15368b8f0 /shared/core-utils/videos/bitrate.ts
parent04d1da5621d25d59bd5fa1543b725c497bf5d9a8 (diff)
downloadPeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.tar.gz
PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.tar.zst
PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.zip
Migrate server to ESM
Sorry for the very big commit that may lead to git log issues and merge conflicts, but it's a major step forward: * Server can be faster at startup because imports() are async and we can easily lazy import big modules * Angular doesn't seem to support ES import (with .js extension), so we had to correctly organize peertube into a monorepo: * Use yarn workspace feature * Use typescript reference projects for dependencies * Shared projects have been moved into "packages", each one is now a node module (with a dedicated package.json/tsconfig.json) * server/tools have been moved into apps/ and is now a dedicated app bundled and published on NPM so users don't have to build peertube cli tools manually * server/tests have been moved into packages/ so we don't compile them every time we want to run the server * Use isolatedModule option: * Had to move from const enum to const (https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums) * Had to explictely specify "type" imports when used in decorators * Prefer tsx (that uses esbuild under the hood) instead of ts-node to load typescript files (tests with mocha or scripts): * To reduce test complexity as esbuild doesn't support decorator metadata, we only test server files that do not import server models * We still build tests files into js files for a faster CI * Remove unmaintained peertube CLI import script * Removed some barrels to speed up execution (less imports)
Diffstat (limited to 'shared/core-utils/videos/bitrate.ts')
-rw-r--r--shared/core-utils/videos/bitrate.ts113
1 files changed, 0 insertions, 113 deletions
diff --git a/shared/core-utils/videos/bitrate.ts b/shared/core-utils/videos/bitrate.ts
deleted file mode 100644
index 6be027826..000000000
--- a/shared/core-utils/videos/bitrate.ts
+++ /dev/null
@@ -1,113 +0,0 @@
1import { VideoResolution } from '@shared/models'
2
3type BitPerPixel = { [ id in VideoResolution ]: number }
4
5// https://bitmovin.com/video-bitrate-streaming-hls-dash/
6
7const minLimitBitPerPixel: BitPerPixel = {
8 [VideoResolution.H_NOVIDEO]: 0,
9 [VideoResolution.H_144P]: 0.02,
10 [VideoResolution.H_240P]: 0.02,
11 [VideoResolution.H_360P]: 0.02,
12 [VideoResolution.H_480P]: 0.02,
13 [VideoResolution.H_720P]: 0.02,
14 [VideoResolution.H_1080P]: 0.02,
15 [VideoResolution.H_1440P]: 0.02,
16 [VideoResolution.H_4K]: 0.02
17}
18
19const averageBitPerPixel: BitPerPixel = {
20 [VideoResolution.H_NOVIDEO]: 0,
21 [VideoResolution.H_144P]: 0.19,
22 [VideoResolution.H_240P]: 0.17,
23 [VideoResolution.H_360P]: 0.15,
24 [VideoResolution.H_480P]: 0.12,
25 [VideoResolution.H_720P]: 0.11,
26 [VideoResolution.H_1080P]: 0.10,
27 [VideoResolution.H_1440P]: 0.09,
28 [VideoResolution.H_4K]: 0.08
29}
30
31const maxBitPerPixel: BitPerPixel = {
32 [VideoResolution.H_NOVIDEO]: 0,
33 [VideoResolution.H_144P]: 0.32,
34 [VideoResolution.H_240P]: 0.29,
35 [VideoResolution.H_360P]: 0.26,
36 [VideoResolution.H_480P]: 0.22,
37 [VideoResolution.H_720P]: 0.19,
38 [VideoResolution.H_1080P]: 0.17,
39 [VideoResolution.H_1440P]: 0.16,
40 [VideoResolution.H_4K]: 0.14
41}
42
43function getAverageTheoreticalBitrate (options: {
44 resolution: VideoResolution
45 ratio: number
46 fps: number
47}) {
48 const targetBitrate = calculateBitrate({ ...options, bitPerPixel: averageBitPerPixel })
49 if (!targetBitrate) return 192 * 1000
50
51 return targetBitrate
52}
53
54function getMaxTheoreticalBitrate (options: {
55 resolution: VideoResolution
56 ratio: number
57 fps: number
58}) {
59 const targetBitrate = calculateBitrate({ ...options, bitPerPixel: maxBitPerPixel })
60 if (!targetBitrate) return 256 * 1000
61
62 return targetBitrate
63}
64
65function getMinTheoreticalBitrate (options: {
66 resolution: VideoResolution
67 ratio: number
68 fps: number
69}) {
70 const minLimitBitrate = calculateBitrate({ ...options, bitPerPixel: minLimitBitPerPixel })
71 if (!minLimitBitrate) return 10 * 1000
72
73 return minLimitBitrate
74}
75
76// ---------------------------------------------------------------------------
77
78export {
79 getAverageTheoreticalBitrate,
80 getMaxTheoreticalBitrate,
81 getMinTheoreticalBitrate
82}
83
84// ---------------------------------------------------------------------------
85
86function calculateBitrate (options: {
87 bitPerPixel: BitPerPixel
88 resolution: VideoResolution
89 ratio: number
90 fps: number
91}) {
92 const { bitPerPixel, resolution, ratio, fps } = options
93
94 const resolutionsOrder = [
95 VideoResolution.H_4K,
96 VideoResolution.H_1440P,
97 VideoResolution.H_1080P,
98 VideoResolution.H_720P,
99 VideoResolution.H_480P,
100 VideoResolution.H_360P,
101 VideoResolution.H_240P,
102 VideoResolution.H_144P,
103 VideoResolution.H_NOVIDEO
104 ]
105
106 for (const toTestResolution of resolutionsOrder) {
107 if (toTestResolution <= resolution) {
108 return Math.floor(resolution * resolution * ratio * fps * bitPerPixel[toTestResolution])
109 }
110 }
111
112 throw new Error('Unknown resolution ' + resolution)
113}