@@ -10,6 +10,7 @@ import DOMHelpers from "../domhelpers"
1010import Utils from "../utils/playbackutils"
1111import convertTimeRangesToArray from "../utils/mse/convert-timeranges-to-array"
1212import { ManifestType } from "../models/manifesttypes"
13+ import setPropertyPath from "../utils/setpropertypath"
1314
1415const DEFAULT_SETTINGS = {
1516 liveDelay : 0 ,
@@ -85,6 +86,10 @@ function MSEStrategy(
8586 [ MediaKinds . AUDIO ] : undefined ,
8687 [ MediaKinds . VIDEO ] : undefined ,
8788 } ,
89+ playbackQuality : {
90+ [ MediaKinds . AUDIO ] : undefined ,
91+ [ MediaKinds . VIDEO ] : undefined ,
92+ } ,
8893 playbackBitrate : undefined ,
8994 bufferLength : undefined ,
9095 latency : undefined ,
@@ -330,6 +335,8 @@ function MSEStrategy(
330335 mediaPlayer . setMediaDuration ( Number . MAX_SAFE_INTEGER )
331336 }
332337
338+ DebugTool . info ( "Stream initialised" )
339+
333340 if ( mediaPlayer . getActiveStream ( ) ?. getHasVideoTrack ( ) ) {
334341 dispatchDownloadQualityChangeForKind ( MediaKinds . VIDEO )
335342 dispatchMaxQualityChangeForKind ( MediaKinds . VIDEO )
@@ -378,6 +385,43 @@ function MSEStrategy(
378385 const switchToPart = ` to ${ qualityIndex } (${ ( bitrateInBps / 1000 ) . toFixed ( 0 ) } kbps)`
379386
380387 DebugTool . info ( `${ abrChangePart } ${ switchFromPart } ${ switchToPart } ` )
388+
389+ Plugins . interface . onDownloadQualityChange ( {
390+ type : "downloadqualitychange" ,
391+ detail : {
392+ mediaType : kind ,
393+ currentBitrateInBps : bitrateInBps ,
394+ currentQualityIndex : qualityIndex ,
395+ previousBitrateInBps : prevBitrateInBps ,
396+ previousQualityIndex : prevQualityIndex ,
397+ } ,
398+ } )
399+ }
400+
401+ function dispatchPlaybackQualityChangeForKind ( kind , { qualityIndex } = { } ) {
402+ const { qualityIndex : previousQualityIndex , bitrateInBps : previousBitrateInBps } =
403+ playerMetadata . playbackQuality [ kind ] ?? { }
404+
405+ if ( previousQualityIndex === qualityIndex ) {
406+ return
407+ }
408+
409+ const bitrateInBps = playbackBitrateForRepresentationIndex ( qualityIndex , kind )
410+
411+ playerMetadata . playbackQuality [ kind ] = { bitrateInBps, qualityIndex }
412+
413+ DebugTool . dynamicMetric ( `${ kind } -playback-quality` , [ qualityIndex , bitrateInBps ] )
414+
415+ Plugins . interface . onPlaybackQualityChange ( {
416+ type : "playbackqualitychange" ,
417+ detail : {
418+ mediaType : kind ,
419+ previousBitrateInBps,
420+ previousQualityIndex,
421+ currentBitrateInBps : bitrateInBps ,
422+ currentQualityIndex : qualityIndex ,
423+ } ,
424+ } )
381425 }
382426
383427 function dispatchMaxQualityChangeForKind ( kind ) {
@@ -428,23 +472,16 @@ function MSEStrategy(
428472 }
429473
430474 function onQualityChangeRendered ( event ) {
431- if (
432- event . newQuality !== undefined &&
433- ( event . mediaType === MediaKinds . AUDIO || event . mediaType === MediaKinds . VIDEO )
434- ) {
435- const { mediaType, newQuality } = event
436-
437- DebugTool . dynamicMetric ( `${ mediaType } -playback-quality` , [
438- newQuality ,
439- playbackBitrateForRepresentationIndex ( newQuality , mediaType ) ,
440- ] )
475+ const { mediaType, newQuality } = event
441476
477+ if ( newQuality !== undefined && ( mediaType === MediaKinds . AUDIO || mediaType === MediaKinds . VIDEO ) ) {
478+ dispatchPlaybackQualityChangeForKind ( mediaType , { qualityIndex : newQuality } )
442479 dispatchMaxQualityChangeForKind ( mediaType )
443480 }
444481
445482 emitPlayerInfo ( )
446483
447- Plugins . interface . onQualityChangedRendered ( event )
484+ Plugins . interface . onQualityChangeRendered ( event )
448485 }
449486
450487 /**
@@ -1021,17 +1058,22 @@ function MSEStrategy(
10211058 * Set constrained audio or video bitrate
10221059 */
10231060 function setBitrateConstraint ( mediaKind , minBitrateKbps , maxBitrateKbps ) {
1061+ if ( mediaKind !== MediaKinds . AUDIO && mediaKind !== MediaKinds . VIDEO ) {
1062+ throw new TypeError ( `Bitrate constraint not supported for this media kind. (got ${ mediaKind } )` )
1063+ }
1064+
1065+ if ( mediaPlayer == null ) {
1066+ setPropertyPath ( playerSettings , [ "streaming" , "abr" , "minBitrate" , mediaKind ] , minBitrateKbps )
1067+ setPropertyPath ( playerSettings , [ "streaming" , "abr" , "maxBitrate" , mediaKind ] , maxBitrateKbps )
1068+
1069+ return
1070+ }
1071+
10241072 mediaPlayer . updateSettings ( {
10251073 streaming : {
10261074 abr : {
1027- minBitrate : {
1028- audio : mediaKind === MediaKinds . AUDIO ? minBitratKbps : - 1 ,
1029- video : mediaKind === MediaKinds . VIDEO ? minBitrateKbps : - 1 ,
1030- } ,
1031- maxBitrate : {
1032- audio : mediaKind === MediaKinds . AUDIO ? maxBitrateKbps : - 1 ,
1033- video : mediaKind === MediaKinds . VIDEO ? maxBitrateKbps : - 1 ,
1034- } ,
1075+ minBitrate : { [ mediaKind ] : minBitrateKbps } ,
1076+ maxBitrate : { [ mediaKind ] : maxBitrateKbps } ,
10351077 } ,
10361078 } ,
10371079 } )
0 commit comments