Home Reference Source

src/config.ts

  1. /**
  2. * HLS config
  3. */
  4.  
  5. import AbrController from './controller/abr-controller';
  6. import BufferController from './controller/buffer-controller';
  7. import CapLevelController from './controller/cap-level-controller';
  8. import FPSController from './controller/fps-controller';
  9. import XhrLoader from './utils/xhr-loader';
  10. // import FetchLoader from './utils/fetch-loader';
  11.  
  12. import AudioTrackController from './controller/audio-track-controller';
  13. import AudioStreamController from './controller/audio-stream-controller';
  14.  
  15. import * as Cues from './utils/cues';
  16. import TimelineController from './controller/timeline-controller';
  17. import SubtitleTrackController from './controller/subtitle-track-controller';
  18. import { SubtitleStreamController } from './controller/subtitle-stream-controller';
  19. import EMEController from './controller/eme-controller';
  20. import { requestMediaKeySystemAccess, MediaKeyFunc } from './utils/mediakeys-helper';
  21.  
  22. type ABRControllerConfig = {
  23. abrEwmaFastLive: number,
  24. abrEwmaSlowLive: number,
  25. abrEwmaFastVoD: number,
  26. abrEwmaSlowVoD: number,
  27. abrEwmaDefaultEstimate: number,
  28. abrBandWidthFactor: number,
  29. abrBandWidthUpFactor: number,
  30. abrMaxWithRealBitrate: boolean,
  31. maxStarvationDelay: number,
  32. maxLoadingDelay: number,
  33. };
  34.  
  35. export type BufferControllerConfig = {
  36. appendErrorMaxRetry: number,
  37. liveDurationInfinity: boolean,
  38. liveBackBufferLength: number,
  39. };
  40.  
  41. type CapLevelControllerConfig = {
  42. capLevelToPlayerSize: boolean
  43. };
  44.  
  45. export type DRMSystemOptions = {
  46. audioRobustness?: string,
  47. videoRobustness?: string,
  48. }
  49.  
  50. export type EMEControllerConfig = {
  51. licenseXhrSetup?: (xhr: XMLHttpRequest, url: string) => void,
  52. emeEnabled: boolean,
  53. widevineLicenseUrl?: string,
  54. drmSystemOptions: DRMSystemOptions,
  55. requestMediaKeySystemAccessFunc: MediaKeyFunc | null,
  56. };
  57.  
  58. type FragmentLoaderConfig = {
  59. fLoader: any, // TODO(typescript-loader): Once Loader is typed fill this in
  60.  
  61. fragLoadingTimeOut: number,
  62. fragLoadingMaxRetry: number,
  63. fragLoadingRetryDelay: number,
  64. fragLoadingMaxRetryTimeout: number,
  65. };
  66.  
  67. type FPSControllerConfig = {
  68. capLevelOnFPSDrop: boolean,
  69. fpsDroppedMonitoringPeriod: number,
  70. fpsDroppedMonitoringThreshold: number,
  71. };
  72.  
  73. type LevelControllerConfig = {
  74. startLevel?: number
  75. };
  76.  
  77. type MP4RemuxerConfig = {
  78. stretchShortVideoTrack: boolean,
  79. maxAudioFramesDrift: number,
  80. };
  81.  
  82. type PlaylistLoaderConfig = {
  83. pLoader: any, // TODO(typescript-loader): Once Loader is typed fill this in
  84.  
  85. manifestLoadingTimeOut: number,
  86. manifestLoadingMaxRetry: number,
  87. manifestLoadingRetryDelay: number,
  88. manifestLoadingMaxRetryTimeout: number,
  89.  
  90. levelLoadingTimeOut: number,
  91. levelLoadingMaxRetry: number,
  92. levelLoadingRetryDelay: number,
  93. levelLoadingMaxRetryTimeout: number
  94. };
  95.  
  96. type StreamControllerConfig = {
  97. autoStartLoad: boolean,
  98. startPosition: number,
  99. defaultAudioCodec?: string,
  100. initialLiveManifestSize: number,
  101. maxBufferLength: number,
  102. maxBufferSize: number,
  103. maxBufferHole: number,
  104.  
  105. lowBufferWatchdogPeriod: number,
  106. highBufferWatchdogPeriod: number,
  107. nudgeOffset: number,
  108. nudgeMaxRetry: number,
  109. maxFragLookUpTolerance: number,
  110. liveSyncDurationCount: number,
  111. liveMaxLatencyDurationCount: number,
  112. liveSyncDuration?: number,
  113. liveMaxLatencyDuration?: number,
  114. maxMaxBufferLength: number,
  115.  
  116. startFragPrefetch: boolean,
  117. testBandwidth: boolean
  118. };
  119.  
  120. type TimelineControllerConfig = {
  121. cueHandler: Cues.CuesInterface,
  122. enableCEA708Captions: boolean,
  123. enableWebVTT: boolean,
  124. captionsTextTrack1Label: string,
  125. captionsTextTrack1LanguageCode: string,
  126. captionsTextTrack2Label: string,
  127. captionsTextTrack2LanguageCode: string,
  128. captionsTextTrack3Label: string,
  129. captionsTextTrack3LanguageCode: string,
  130. captionsTextTrack4Label: string,
  131. captionsTextTrack4LanguageCode: string,
  132. renderTextTracksNatively: boolean,
  133. };
  134.  
  135. type TSDemuxerConfig = {
  136. forceKeyFrameOnDiscontinuity: boolean,
  137. };
  138.  
  139. export type HlsConfig =
  140. {
  141. debug: boolean,
  142. enableWorker: boolean,
  143. enableSoftwareAES: boolean,
  144. minAutoBitrate: number,
  145. loader: any, // TODO(typescript-xhrloader): Type once XHR is done
  146. xhrSetup?: (xhr: XMLHttpRequest, url: string) => void,
  147.  
  148. // Alt Audio
  149. audioStreamController?: any, // TODO(typescript-audiostreamcontroller): Type once file is done
  150. audioTrackController?: any, // TODO(typescript-audiotrackcontroller): Type once file is done
  151. // Subtitle
  152. subtitleStreamController?: any, // TODO(typescript-subtitlestreamcontroller): Type once file is done
  153. subtitleTrackController?: any, // TODO(typescript-subtitletrackcontroller): Type once file is done
  154. timelineController?: any, // TODO(typescript-timelinecontroller): Type once file is done
  155. // EME
  156. emeController?: typeof EMEController,
  157.  
  158. abrController: any, // TODO(typescript-abrcontroller): Type once file is done
  159. bufferController: typeof BufferController,
  160. capLevelController: any, // TODO(typescript-caplevelcontroller): Type once file is done
  161. fpsController: any, // TODO(typescript-fpscontroller): Type once file is done
  162. } &
  163. ABRControllerConfig &
  164. BufferControllerConfig &
  165. CapLevelControllerConfig &
  166. EMEControllerConfig &
  167. FPSControllerConfig &
  168. FragmentLoaderConfig &
  169. LevelControllerConfig &
  170. MP4RemuxerConfig &
  171. PlaylistLoaderConfig &
  172. StreamControllerConfig &
  173. TimelineControllerConfig &
  174. TSDemuxerConfig;
  175.  
  176. // If possible, keep hlsDefaultConfig shallow
  177. // It is cloned whenever a new Hls instance is created, by keeping the config
  178. // shallow the properties are cloned, and we don't end up manipulating the default
  179. export const hlsDefaultConfig: HlsConfig = {
  180. autoStartLoad: true, // used by stream-controller
  181. startPosition: -1, // used by stream-controller
  182. defaultAudioCodec: void 0, // used by stream-controller
  183. debug: false, // used by logger
  184. capLevelOnFPSDrop: false, // used by fps-controller
  185. capLevelToPlayerSize: false, // used by cap-level-controller
  186. initialLiveManifestSize: 1, // used by stream-controller
  187. maxBufferLength: 30, // used by stream-controller
  188. maxBufferSize: 60 * 1000 * 1000, // used by stream-controller
  189. maxBufferHole: 0.5, // used by stream-controller
  190.  
  191. lowBufferWatchdogPeriod: 0.5, // used by stream-controller
  192. highBufferWatchdogPeriod: 3, // used by stream-controller
  193. nudgeOffset: 0.1, // used by stream-controller
  194. nudgeMaxRetry: 3, // used by stream-controller
  195. maxFragLookUpTolerance: 0.25, // used by stream-controller
  196. liveSyncDurationCount: 3, // used by stream-controller
  197. liveMaxLatencyDurationCount: Infinity, // used by stream-controller
  198. liveSyncDuration: void 0, // used by stream-controller
  199. liveMaxLatencyDuration: void 0, // used by stream-controller
  200. liveDurationInfinity: false, // used by buffer-controller
  201. liveBackBufferLength: Infinity, // used by buffer-controller
  202. maxMaxBufferLength: 600, // used by stream-controller
  203. enableWorker: true, // used by demuxer
  204. enableSoftwareAES: true, // used by decrypter
  205. manifestLoadingTimeOut: 10000, // used by playlist-loader
  206. manifestLoadingMaxRetry: 1, // used by playlist-loader
  207. manifestLoadingRetryDelay: 1000, // used by playlist-loader
  208. manifestLoadingMaxRetryTimeout: 64000, // used by playlist-loader
  209. startLevel: void 0, // used by level-controller
  210. levelLoadingTimeOut: 10000, // used by playlist-loader
  211. levelLoadingMaxRetry: 4, // used by playlist-loader
  212. levelLoadingRetryDelay: 1000, // used by playlist-loader
  213. levelLoadingMaxRetryTimeout: 64000, // used by playlist-loader
  214. fragLoadingTimeOut: 20000, // used by fragment-loader
  215. fragLoadingMaxRetry: 6, // used by fragment-loader
  216. fragLoadingRetryDelay: 1000, // used by fragment-loader
  217. fragLoadingMaxRetryTimeout: 64000, // used by fragment-loader
  218. startFragPrefetch: false, // used by stream-controller
  219. fpsDroppedMonitoringPeriod: 5000, // used by fps-controller
  220. fpsDroppedMonitoringThreshold: 0.2, // used by fps-controller
  221. appendErrorMaxRetry: 3, // used by buffer-controller
  222. loader: XhrLoader,
  223. // loader: FetchLoader,
  224. fLoader: void 0, // used by fragment-loader
  225. pLoader: void 0, // used by playlist-loader
  226. xhrSetup: void 0, // used by xhr-loader
  227. licenseXhrSetup: void 0, // used by eme-controller
  228. // fetchSetup: void 0,
  229. abrController: AbrController,
  230. bufferController: BufferController,
  231. capLevelController: CapLevelController,
  232. fpsController: FPSController,
  233. stretchShortVideoTrack: false, // used by mp4-remuxer
  234. maxAudioFramesDrift: 1, // used by mp4-remuxer
  235. forceKeyFrameOnDiscontinuity: true, // used by ts-demuxer
  236. abrEwmaFastLive: 3, // used by abr-controller
  237. abrEwmaSlowLive: 9, // used by abr-controller
  238. abrEwmaFastVoD: 3, // used by abr-controller
  239. abrEwmaSlowVoD: 9, // used by abr-controller
  240. abrEwmaDefaultEstimate: 5e5, // 500 kbps // used by abr-controller
  241. abrBandWidthFactor: 0.95, // used by abr-controller
  242. abrBandWidthUpFactor: 0.7, // used by abr-controller
  243. abrMaxWithRealBitrate: false, // used by abr-controller
  244. maxStarvationDelay: 4, // used by abr-controller
  245. maxLoadingDelay: 4, // used by abr-controller
  246. minAutoBitrate: 0, // used by hls
  247. emeEnabled: false, // used by eme-controller
  248. widevineLicenseUrl: void 0, // used by eme-controller
  249. drmSystemOptions: {}, // used by eme-controller
  250. requestMediaKeySystemAccessFunc: requestMediaKeySystemAccess, // used by eme-controller
  251. testBandwidth: true,
  252.  
  253. // Dynamic Modules
  254. ...timelineConfig(),
  255. subtitleStreamController: (__USE_SUBTITLES__) ? SubtitleStreamController : void 0,
  256. subtitleTrackController: (__USE_SUBTITLES__) ? SubtitleTrackController : void 0,
  257. timelineController: (__USE_SUBTITLES__) ? TimelineController : void 0,
  258. audioStreamController: (__USE_ALT_AUDIO__) ? AudioStreamController : void 0,
  259. audioTrackController: (__USE_ALT_AUDIO__) ? AudioTrackController : void 0,
  260. emeController: (__USE_EME_DRM__) ? EMEController : void 0
  261. };
  262.  
  263. function timelineConfig (): TimelineControllerConfig {
  264. return {
  265. cueHandler: Cues, // used by timeline-controller
  266. enableCEA708Captions: __USE_SUBTITLES__, // used by timeline-controller
  267. enableWebVTT: __USE_SUBTITLES__, // used by timeline-controller
  268. captionsTextTrack1Label: 'English', // used by timeline-controller
  269. captionsTextTrack1LanguageCode: 'en', // used by timeline-controller
  270. captionsTextTrack2Label: 'Spanish', // used by timeline-controller
  271. captionsTextTrack2LanguageCode: 'es', // used by timeline-controller
  272. captionsTextTrack3Label: 'Unknown CC', // used by timeline-controller
  273. captionsTextTrack3LanguageCode: '', // used by timeline-controller
  274. captionsTextTrack4Label: 'Unknown CC', // used by timeline-controller
  275. captionsTextTrack4LanguageCode: '', // used by timeline-controller
  276. renderTextTracksNatively: true
  277. };
  278. }