Source: lib/device/webos.js

  1. /*! @license
  2. * Shaka Player
  3. * Copyright 2025 Google LLC
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. goog.provide('shaka.device.WebOS');
  7. goog.require('shaka.config.CrossBoundaryStrategy');
  8. goog.require('shaka.device.AbstractDevice');
  9. goog.require('shaka.device.DeviceFactory');
  10. goog.require('shaka.device.IDevice');
  11. goog.require('shaka.log');
  12. /**
  13. * @final
  14. */
  15. shaka.device.WebOS = class extends shaka.device.AbstractDevice {
  16. constructor() {
  17. super();
  18. /** @private {?number} */
  19. this.osVersion_ = this.guessWebOSVersion_();
  20. }
  21. /**
  22. * @override
  23. */
  24. getVersion() {
  25. return this.osVersion_;
  26. }
  27. /**
  28. * @override
  29. */
  30. getDeviceName() {
  31. return 'WebOS';
  32. }
  33. /**
  34. * @override
  35. */
  36. getDeviceType() {
  37. return shaka.device.IDevice.DeviceType.TV;
  38. }
  39. /**
  40. * @override
  41. */
  42. getBrowserEngine() {
  43. return shaka.device.IDevice.BrowserEngine.CHROMIUM;
  44. }
  45. /**
  46. * @override
  47. */
  48. supportsMediaCapabilities() {
  49. return false;
  50. }
  51. /**
  52. * @override
  53. */
  54. supportsSequenceMode() {
  55. const version = this.getVersion();
  56. return version !== null ? version > 3 : super.supportsSequenceMode();
  57. }
  58. /**
  59. * @override
  60. */
  61. supportsSmoothCodecSwitching() {
  62. const version = this.getVersion();
  63. return version !== null ?
  64. version > 6 : super.supportsSmoothCodecSwitching();
  65. }
  66. /**
  67. * @override
  68. */
  69. supportsServerCertificate() {
  70. const version = this.getVersion();
  71. return version !== null ? version > 3 : super.supportsServerCertificate();
  72. }
  73. /**
  74. * @override
  75. */
  76. detectMaxHardwareResolution() {
  77. const maxResolution = {width: 1920, height: 1080};
  78. try {
  79. const deviceInfo =
  80. /** @type {{screenWidth: number, screenHeight: number}} */(
  81. JSON.parse(window.PalmSystem.deviceInfo));
  82. // WebOS has always been able to do 1080p. Assume a 1080p limit.
  83. maxResolution.width = Math.max(1920, deviceInfo['screenWidth']);
  84. maxResolution.height = Math.max(1080, deviceInfo['screenHeight']);
  85. } catch (e) {
  86. shaka.log.alwaysWarn('WebOS: Error detecting screen size, default ' +
  87. 'screen size 1920x1080.');
  88. }
  89. return Promise.resolve(maxResolution);
  90. }
  91. /**
  92. * @override
  93. */
  94. adjustConfig(config) {
  95. super.adjustConfig(config);
  96. if (this.getVersion() === 3) {
  97. config.streaming.crossBoundaryStrategy =
  98. shaka.config.CrossBoundaryStrategy.RESET;
  99. }
  100. config.streaming.shouldFixTimestampOffset = true;
  101. // WebOS has long hardware pipeline that respond slowly to seeking.
  102. // Therefore we should not seek when we detect a stall on this platform.
  103. // Instead, default stallSkip to 0 to force the stall detector to pause
  104. // and play instead.
  105. config.streaming.stallSkip = 0;
  106. return config;
  107. }
  108. /**
  109. * @return {?number}
  110. * @private
  111. */
  112. guessWebOSVersion_() {
  113. let browserVersion = null;
  114. const match = navigator.userAgent.match(/Chrome\/(\d+)/);
  115. if (match) {
  116. browserVersion = parseInt(match[1], /* base= */ 10);
  117. }
  118. switch (browserVersion) {
  119. case 38:
  120. return 3;
  121. case 53:
  122. return 4;
  123. case 68:
  124. return 5;
  125. case 79:
  126. return 6;
  127. case 87:
  128. return 22;
  129. case 94:
  130. return 23;
  131. case 108:
  132. return 24;
  133. case 120:
  134. return 25;
  135. default:
  136. return null;
  137. }
  138. }
  139. /**
  140. * @override
  141. */
  142. supportStandardVP9Checking() {
  143. return false;
  144. }
  145. /**
  146. * @return {boolean}
  147. * @private
  148. */
  149. static isWebOS_() {
  150. return navigator.userAgent.includes('Web0S');
  151. }
  152. };
  153. if (shaka.device.WebOS.isWebOS_()) {
  154. shaka.device.DeviceFactory.registerDeviceFactory(
  155. () => new shaka.device.WebOS());
  156. }