Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

functions.ts 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { CFG_LVL_TO_APP_QUALITY_LVL, VIDEO_QUALITY_LEVELS } from './constants';
  2. /**
  3. * Selects {@code VIDEO_QUALITY_LEVELS} for the given {@link availableHeight} and threshold to quality mapping.
  4. *
  5. * @param {number} availableHeight - The height to which a matching video quality level should be found.
  6. * @param {Map<number, number>} heightToLevel - The threshold to quality level mapping. The keys are sorted in the
  7. * ascending order.
  8. * @returns {number} The matching value from {@code VIDEO_QUALITY_LEVELS}.
  9. */
  10. export function getReceiverVideoQualityLevel(availableHeight: number, heightToLevel: Map<number, number>): number {
  11. let selectedLevel = VIDEO_QUALITY_LEVELS.LOW;
  12. for (const [ levelThreshold, level ] of heightToLevel.entries()) {
  13. if (availableHeight >= levelThreshold) {
  14. selectedLevel = level;
  15. }
  16. }
  17. return selectedLevel;
  18. }
  19. /**
  20. * Converts {@code Object} passed in the config which represents height thresholds to vide quality level mapping to
  21. * a {@code Map}.
  22. *
  23. * @param {Object} minHeightForQualityLvl - The 'config.videoQuality.minHeightForQualityLvl' Object from
  24. * the configuration. See config.js for more details.
  25. * @returns {Map<number, number>|undefined} - A mapping of minimal thumbnail height required for given quality level or
  26. * {@code undefined} if the map contains invalid values.
  27. */
  28. export function validateMinHeightForQualityLvl(minHeightForQualityLvl?: { [key: number]: string; }) {
  29. if (typeof minHeightForQualityLvl !== 'object'
  30. || Object.keys(minHeightForQualityLvl).map(lvl => Number(lvl))
  31. .find(lvl => lvl === null || isNaN(lvl) || lvl < 0)) {
  32. return undefined;
  33. }
  34. const levelsSorted
  35. = Object.keys(minHeightForQualityLvl)
  36. .map(k => Number(k))
  37. .sort((a, b) => a - b);
  38. const map = new Map();
  39. Object.values(VIDEO_QUALITY_LEVELS).sort()
  40. .forEach(value => {
  41. if (value > VIDEO_QUALITY_LEVELS.NONE) {
  42. map.set(value, value);
  43. }
  44. });
  45. for (const level of levelsSorted) {
  46. const configQuality = minHeightForQualityLvl[level];
  47. const appQuality = CFG_LVL_TO_APP_QUALITY_LVL[configQuality as keyof typeof CFG_LVL_TO_APP_QUALITY_LVL];
  48. if (!appQuality) {
  49. return undefined;
  50. }
  51. map.delete(appQuality);
  52. map.set(level, appQuality);
  53. }
  54. return map;
  55. }