mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge pull request #3343 from dmitrylyzo/transcode-resolution
Limit transcoding profiles with maximum resolution
This commit is contained in:
commit
a993a80c91
2 changed files with 45 additions and 3 deletions
|
@ -39,6 +39,25 @@ function getDeviceProfile(item) {
|
||||||
profile = profileBuilder(builderOpts);
|
profile = profileBuilder(builderOpts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const maxTranscodingVideoWidth = appHost.screen()?.maxAllowedWidth;
|
||||||
|
|
||||||
|
if (maxTranscodingVideoWidth) {
|
||||||
|
profile.TranscodingProfiles.forEach((transcodingProfile) => {
|
||||||
|
if (transcodingProfile.Type === 'Video') {
|
||||||
|
transcodingProfile.Conditions = (transcodingProfile.Conditions || []).filter((condition) => {
|
||||||
|
return condition.Property !== 'Width';
|
||||||
|
});
|
||||||
|
|
||||||
|
transcodingProfile.Conditions.push({
|
||||||
|
Condition: 'LessThanEqual',
|
||||||
|
Property: 'Width',
|
||||||
|
Value: maxTranscodingVideoWidth.toString(),
|
||||||
|
IsRequired: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
resolve(profile);
|
resolve(profile);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -382,6 +401,27 @@ export const appHost = {
|
||||||
const att = scalable ? 'width=device-width, initial-scale=1, minimum-scale=1, user-scalable=yes' : 'width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no';
|
const att = scalable ? 'width=device-width, initial-scale=1, minimum-scale=1, user-scalable=yes' : 'width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no';
|
||||||
document.querySelector('meta[name=viewport]').setAttribute('content', att);
|
document.querySelector('meta[name=viewport]').setAttribute('content', att);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
screen: () => {
|
||||||
|
let hostScreen = null;
|
||||||
|
|
||||||
|
const appHostImpl = window.NativeShell?.AppHost;
|
||||||
|
|
||||||
|
if (appHostImpl?.screen) {
|
||||||
|
hostScreen = appHostImpl.screen();
|
||||||
|
} else if (window.screen && !browser.tv) {
|
||||||
|
hostScreen = {
|
||||||
|
width: Math.floor(window.screen.width * window.devicePixelRatio),
|
||||||
|
height: Math.floor(window.screen.height * window.devicePixelRatio)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hostScreen) {
|
||||||
|
// Use larger dimension to account for screen orientation changes
|
||||||
|
hostScreen.maxAllowedWidth = Math.max(hostScreen.width, hostScreen.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hostScreen;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { appHost } from '../components/apphost';
|
||||||
import globalize from '../scripts/globalize';
|
import globalize from '../scripts/globalize';
|
||||||
|
|
||||||
export function getVideoQualityOptions(options) {
|
export function getVideoQualityOptions(options) {
|
||||||
|
@ -11,6 +12,7 @@ export function getVideoQualityOptions(options) {
|
||||||
videoWidth = videoHeight * (16 / 9);
|
videoWidth = videoHeight * (16 / 9);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const hostScreenWidth = appHost.screen()?.maxAllowedWidth || 4096;
|
||||||
const maxAllowedWidth = videoWidth || 4096;
|
const maxAllowedWidth = videoWidth || 4096;
|
||||||
|
|
||||||
const qualityOptions = [];
|
const qualityOptions = [];
|
||||||
|
@ -26,19 +28,19 @@ export function getVideoQualityOptions(options) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Quality options are indexed by bitrate. If you must duplicate them, make sure each of them are unique (by making the last digit a 1)
|
// Quality options are indexed by bitrate. If you must duplicate them, make sure each of them are unique (by making the last digit a 1)
|
||||||
if (maxAllowedWidth >= 3800) {
|
if (maxAllowedWidth >= 3800 && hostScreenWidth >= 1930) {
|
||||||
qualityOptions.push({ name: '4K - 120 Mbps', maxHeight: 2160, bitrate: 120000000 });
|
qualityOptions.push({ name: '4K - 120 Mbps', maxHeight: 2160, bitrate: 120000000 });
|
||||||
qualityOptions.push({ name: '4K - 80 Mbps', maxHeight: 2160, bitrate: 80000000 });
|
qualityOptions.push({ name: '4K - 80 Mbps', maxHeight: 2160, bitrate: 80000000 });
|
||||||
}
|
}
|
||||||
// Some 1080- videos are reported as 1912?
|
// Some 1080- videos are reported as 1912?
|
||||||
if (maxAllowedWidth >= 1900) {
|
if (maxAllowedWidth >= 1900 && hostScreenWidth >= 1290) {
|
||||||
qualityOptions.push({ name: '1080p - 60 Mbps', maxHeight: 1080, bitrate: 60000000 });
|
qualityOptions.push({ name: '1080p - 60 Mbps', maxHeight: 1080, bitrate: 60000000 });
|
||||||
qualityOptions.push({ name: '1080p - 40 Mbps', maxHeight: 1080, bitrate: 40000000 });
|
qualityOptions.push({ name: '1080p - 40 Mbps', maxHeight: 1080, bitrate: 40000000 });
|
||||||
qualityOptions.push({ name: '1080p - 20 Mbps', maxHeight: 1080, bitrate: 20000000 });
|
qualityOptions.push({ name: '1080p - 20 Mbps', maxHeight: 1080, bitrate: 20000000 });
|
||||||
qualityOptions.push({ name: '1080p - 15 Mbps', maxHeight: 1080, bitrate: 15000000 });
|
qualityOptions.push({ name: '1080p - 15 Mbps', maxHeight: 1080, bitrate: 15000000 });
|
||||||
qualityOptions.push({ name: '1080p - 10 Mbps', maxHeight: 1080, bitrate: 10000000 });
|
qualityOptions.push({ name: '1080p - 10 Mbps', maxHeight: 1080, bitrate: 10000000 });
|
||||||
}
|
}
|
||||||
if (maxAllowedWidth >= 1260) {
|
if (maxAllowedWidth >= 1260 && hostScreenWidth >= 650) {
|
||||||
qualityOptions.push({ name: '720p - 8 Mbps', maxHeight: 720, bitrate: 8000000 });
|
qualityOptions.push({ name: '720p - 8 Mbps', maxHeight: 720, bitrate: 8000000 });
|
||||||
qualityOptions.push({ name: '720p - 6 Mbps', maxHeight: 720, bitrate: 6000000 });
|
qualityOptions.push({ name: '720p - 6 Mbps', maxHeight: 720, bitrate: 6000000 });
|
||||||
qualityOptions.push({ name: '720p - 4 Mbps', maxHeight: 720, bitrate: 4000000 });
|
qualityOptions.push({ name: '720p - 4 Mbps', maxHeight: 720, bitrate: 4000000 });
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue