@@ -58,6 +58,7 @@ goog.require('shaka.util.ManifestParserUtils');
5858goog . require ( 'shaka.util.MediaReadyState' ) ;
5959goog . require ( 'shaka.util.MimeUtils' ) ;
6060goog . require ( 'shaka.util.Mutex' ) ;
61+ goog . require ( 'shaka.util.NumberUtils' ) ;
6162goog . require ( 'shaka.util.ObjectUtils' ) ;
6263goog . require ( 'shaka.util.Platform' ) ;
6364goog . require ( 'shaka.util.PlayerConfiguration' ) ;
@@ -763,7 +764,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
763764 this . externalSrcEqualsThumbnailsStreams_ = [ ] ;
764765
765766 /** @private {number} */
766- this . completionPercent_ = NaN ;
767+ this . completionPercent_ = - 1 ;
767768
768769 /** @private {?shaka.extern.PlayerConfiguration} */
769770 this . config_ = this . defaultConfig_ ( ) ;
@@ -1525,7 +1526,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
15251526
15261527 this . externalSrcEqualsThumbnailsStreams_ = [ ] ;
15271528
1528- this . completionPercent_ = NaN ;
1529+ this . completionPercent_ = - 1 ;
15291530
15301531 if ( this . networkingEngine_ ) {
15311532 this . networkingEngine_ . clearCommonAccessTokenMap ( ) ;
@@ -7036,41 +7037,46 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
70367037 if ( ! this . video_ ) {
70377038 return ;
70387039 }
7039- let hasNewCompletionPercent = false ;
7040- const completionRatio = this . video_ . currentTime / this . video_ . duration ;
7041- if ( ! isNaN ( completionRatio ) ) {
7042- const percent = Math . round ( 100 * completionRatio ) ;
7043- if ( isNaN ( this . completionPercent_ ) ) {
7044- this . completionPercent_ = percent ;
7045- hasNewCompletionPercent = true ;
7046- } else {
7047- const newCompletionPercent = Math . max ( this . completionPercent_ , percent ) ;
7048- if ( this . completionPercent_ != newCompletionPercent ) {
7049- this . completionPercent_ = newCompletionPercent ;
7050- hasNewCompletionPercent = true ;
7051- }
7040+
7041+ const isQuartile = ( quartilePercent , currentPercent ) => {
7042+ const NumberUtils = shaka . util . NumberUtils ;
7043+
7044+ if ( ( NumberUtils . isFloatEqual ( quartilePercent , currentPercent ) ||
7045+ currentPercent > quartilePercent ) &&
7046+ this . completionPercent_ < quartilePercent ) {
7047+ this . completionPercent_ = quartilePercent ;
7048+ return true ;
70527049 }
7050+ return false ;
7051+ } ;
7052+
7053+ const completionRatio = this . video_ . currentTime / this . video_ . duration ;
7054+
7055+ if ( isNaN ( completionRatio ) ) {
7056+ return ;
70537057 }
7054- if ( hasNewCompletionPercent ) {
7055- let event ;
7056- if ( this . completionPercent_ == 0 ) {
7057- event = shaka . Player . makeEvent_ ( shaka . util . FakeEvent . EventName . Started ) ;
7058- } else if ( this . completionPercent_ == 25 ) {
7059- event = shaka . Player . makeEvent_ (
7060- shaka . util . FakeEvent . EventName . FirstQuartile ) ;
7061- } else if ( this . completionPercent_ == 50 ) {
7062- event = shaka . Player . makeEvent_ (
7063- shaka . util . FakeEvent . EventName . Midpoint ) ;
7064- } else if ( this . completionPercent_ == 75 ) {
7065- event = shaka . Player . makeEvent_ (
7066- shaka . util . FakeEvent . EventName . ThirdQuartile ) ;
7067- } else if ( this . completionPercent_ == 100 ) {
7068- event = shaka . Player . makeEvent_ (
7069- shaka . util . FakeEvent . EventName . Complete ) ;
7070- }
7071- if ( event ) {
7072- this . dispatchEvent ( event ) ;
7073- }
7058+
7059+ const percent = completionRatio * 100 ;
7060+
7061+ let event ;
7062+ if ( isQuartile ( 0 , percent ) ) {
7063+ event = shaka . Player . makeEvent_ ( shaka . util . FakeEvent . EventName . Started ) ;
7064+ } else if ( isQuartile ( 25 , percent ) ) {
7065+ event = shaka . Player . makeEvent_ (
7066+ shaka . util . FakeEvent . EventName . FirstQuartile ) ;
7067+ } else if ( isQuartile ( 50 , percent ) ) {
7068+ event = shaka . Player . makeEvent_ (
7069+ shaka . util . FakeEvent . EventName . Midpoint ) ;
7070+ } else if ( isQuartile ( 75 , percent ) ) {
7071+ event = shaka . Player . makeEvent_ (
7072+ shaka . util . FakeEvent . EventName . ThirdQuartile ) ;
7073+ } else if ( isQuartile ( 100 , percent ) ) {
7074+ event = shaka . Player . makeEvent_ (
7075+ shaka . util . FakeEvent . EventName . Complete ) ;
7076+ }
7077+
7078+ if ( event ) {
7079+ this . dispatchEvent ( event ) ;
70747080 }
70757081 }
70767082
0 commit comments