@@ -35,6 +35,7 @@ goog.require('shaka.media.TimeRangesUtils');
35
35
goog . require ( 'shaka.net.NetworkingEngine' ) ;
36
36
goog . require ( 'shaka.net.NetworkingUtils' ) ;
37
37
goog . require ( 'shaka.text.Cue' ) ;
38
+ goog . require ( 'shaka.text.NativeTextDisplayer' ) ;
38
39
goog . require ( 'shaka.text.SimpleTextDisplayer' ) ;
39
40
goog . require ( 'shaka.text.StubTextDisplayer' ) ;
40
41
goog . require ( 'shaka.text.TextEngine' ) ;
@@ -2575,15 +2576,21 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2575
2576
this . loadEventManager_ . listen ( mediaElement , 'ended' , updateStateHistory ) ;
2576
2577
this . loadEventManager_ . listen ( mediaElement , 'ratechange' , onRateChange ) ;
2577
2578
if ( mediaElement . remote ) {
2578
- this . loadEventManager_ . listen ( mediaElement . remote , 'connect' ,
2579
- ( ) => this . onTracksChanged_ ( ) ) ;
2579
+ this . loadEventManager_ . listen ( mediaElement . remote , 'connect' , ( ) => {
2580
+ if ( this . streamingEngine_ &&
2581
+ mediaElement . remote . state == 'connected' ) {
2582
+ this . onTextChanged_ ( ) ;
2583
+ }
2584
+ this . onTracksChanged_ ( ) ;
2585
+ } ) ;
2580
2586
this . loadEventManager_ . listen ( mediaElement . remote , 'connecting' ,
2581
2587
( ) => this . onTracksChanged_ ( ) ) ;
2582
2588
this . loadEventManager_ . listen ( mediaElement . remote , 'disconnect' ,
2583
2589
async ( ) => {
2584
2590
if ( this . streamingEngine_ &&
2585
2591
mediaElement . remote . state == 'disconnected' ) {
2586
2592
await this . streamingEngine_ . resetMediaSource ( ) ;
2593
+ this . onTextChanged_ ( ) ;
2587
2594
}
2588
2595
this . onTracksChanged_ ( ) ;
2589
2596
} ) ;
@@ -2606,6 +2613,13 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2606
2613
}
2607
2614
2608
2615
if ( mediaElement . textTracks ) {
2616
+ const trackChange = ( ) => {
2617
+ if ( this . loadMode_ === shaka . Player . LoadMode . SRC_EQUALS &&
2618
+ this . textDisplayer_ instanceof shaka . text . NativeTextDisplayer ) {
2619
+ this . onTextChanged_ ( ) ;
2620
+ }
2621
+ this . onTracksChanged_ ( ) ;
2622
+ } ;
2609
2623
this . loadEventManager_ . listen (
2610
2624
mediaElement . textTracks , 'addtrack' , ( e ) => {
2611
2625
const trackEvent = /** @type {!TrackEvent } */ ( e ) ;
@@ -2624,15 +2638,15 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2624
2638
break ;
2625
2639
2626
2640
default :
2627
- this . onTracksChanged_ ( ) ;
2641
+ trackChange ( ) ;
2628
2642
break ;
2629
2643
}
2630
2644
}
2631
2645
} ) ;
2632
2646
this . loadEventManager_ . listen ( mediaElement . textTracks , 'removetrack' ,
2633
- ( ) => this . onTracksChanged_ ( ) ) ;
2647
+ trackChange ) ;
2634
2648
this . loadEventManager_ . listen ( mediaElement . textTracks , 'change' ,
2635
- ( ) => this . onTracksChanged_ ( ) ) ;
2649
+ trackChange ) ;
2636
2650
2637
2651
if ( this . config_ . streaming . crossBoundaryStrategy !==
2638
2652
shaka . config . CrossBoundaryStrategy . KEEP ) {
@@ -3121,55 +3135,43 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3121
3135
3122
3136
if ( mediaElement . textTracks ) {
3123
3137
this . createTextDisplayer_ ( ) ;
3124
- const setShowingMode = ( ) => {
3125
- const track = this . getFilteredTextTracks_ ( )
3126
- . find ( ( t ) => t . mode !== 'disabled' ) ;
3127
- if ( track ) {
3128
- track . mode = 'showing' ;
3129
- }
3130
- const generatedTrack = this . getGeneratedTextTrack_ ( ) ;
3131
- if ( generatedTrack ) {
3132
- generatedTrack . mode = 'hidden' ;
3133
- }
3134
- } ;
3135
- const setHiddenMode = ( ) => {
3136
- const track = this . getFilteredTextTracks_ ( )
3137
- . find ( ( t ) => t . mode !== 'disabled' ) ;
3138
- if ( track ) {
3139
- track . mode = 'hidden' ;
3140
- }
3141
- const generatedTrack = this . getGeneratedTextTrack_ ( ) ;
3142
- const isTextVisible = this . textDisplayer_ . isTextVisible ( ) ;
3143
- if ( generatedTrack && isTextVisible ) {
3144
- generatedTrack . mode = 'showing' ;
3138
+ const setMode = ( showing ) => {
3139
+ if ( ! ( this . textDisplayer_ instanceof shaka . text . NativeTextDisplayer ) ) {
3140
+ const track = this . getFilteredTextTracks_ ( )
3141
+ . find ( ( t ) => t . mode !== 'disabled' ) ;
3142
+ if ( track ) {
3143
+ track . mode = showing ? 'showing' : 'hidden' ;
3144
+ }
3145
+ if ( this . textDisplayer_ instanceof shaka . text . SimpleTextDisplayer ) {
3146
+ const generatedTrack = this . getGeneratedTextTrack_ ( ) ;
3147
+ if ( generatedTrack ) {
3148
+ generatedTrack . mode =
3149
+ ! showing && this . textDisplayer_ . isTextVisible ( ) ?
3150
+ 'showing' : 'hidden' ;
3151
+ }
3152
+ }
3145
3153
}
3146
3154
} ;
3147
3155
this . loadEventManager_ . listen ( mediaElement , 'enterpictureinpicture' ,
3148
- ( ) => setShowingMode ( ) ) ;
3156
+ ( ) => setMode ( true ) ) ;
3149
3157
this . loadEventManager_ . listen ( mediaElement , 'leavepictureinpicture' ,
3150
- ( ) => setHiddenMode ( ) ) ;
3158
+ ( ) => setMode ( false ) ) ;
3151
3159
if ( mediaElement . remote ) {
3152
3160
this . loadEventManager_ . listen ( mediaElement . remote , 'connect' ,
3153
- ( ) => setHiddenMode ( ) ) ;
3161
+ ( ) => setMode ( false ) ) ;
3154
3162
this . loadEventManager_ . listen ( mediaElement . remote , 'connecting' ,
3155
- ( ) => setHiddenMode ( ) ) ;
3163
+ ( ) => setMode ( false ) ) ;
3156
3164
this . loadEventManager_ . listen ( mediaElement . remote , 'disconnect' ,
3157
- ( ) => setHiddenMode ( ) ) ;
3165
+ ( ) => setMode ( false ) ) ;
3158
3166
} else if ( 'webkitCurrentPlaybackTargetIsWireless' in mediaElement ) {
3159
3167
this . loadEventManager_ . listen ( mediaElement ,
3160
3168
'webkitcurrentplaybacktargetiswirelesschanged' ,
3161
- ( ) => setHiddenMode ( ) ) ;
3169
+ ( ) => setMode ( false ) ) ;
3162
3170
}
3163
3171
const video = /** @type {HTMLVideoElement } */ ( mediaElement ) ;
3164
3172
if ( video . webkitSupportsFullscreen ) {
3165
3173
this . loadEventManager_ . listen ( video , 'webkitpresentationmodechanged' ,
3166
- ( ) => {
3167
- if ( video . webkitPresentationMode != 'inline' ) {
3168
- setShowingMode ( ) ;
3169
- } else {
3170
- setHiddenMode ( ) ;
3171
- }
3172
- } ) ;
3174
+ ( ) => setMode ( video . webkitPresentationMode !== 'inline' ) ) ;
3173
3175
}
3174
3176
}
3175
3177
// Add all media element listeners.
@@ -3273,27 +3275,33 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3273
3275
this . textDisplayer_ . setTextVisibility ( true ) ;
3274
3276
}
3275
3277
3276
- if ( textTracks . length ) {
3277
- if ( this . textDisplayer_ . enableTextDisplayer ) {
3278
- this . textDisplayer_ . enableTextDisplayer ( ) ;
3279
- } else {
3280
- shaka . Deprecate . deprecateFeature ( 5 ,
3281
- 'Text displayer w/ enableTextDisplayer' ,
3282
- 'Text displayer should have a "enableTextDisplayer" method!' ) ;
3278
+ if (
3279
+ ! ( this . textDisplayer_ instanceof shaka . text . NativeTextDisplayer )
3280
+ ) {
3281
+ if ( textTracks . length ) {
3282
+ if ( this . textDisplayer_ . enableTextDisplayer ) {
3283
+ this . textDisplayer_ . enableTextDisplayer ( ) ;
3284
+ } else {
3285
+ shaka . Deprecate . deprecateFeature (
3286
+ 5 ,
3287
+ 'Text displayer w/ enableTextDisplayer' ,
3288
+ 'Text displayer should have a "enableTextDisplayer" method' ,
3289
+ ) ;
3290
+ }
3283
3291
}
3284
- }
3285
3292
3286
- let enabledNativeTrack = false ;
3287
- for ( const track of textTracks ) {
3288
- if ( track . mode !== 'disabled' ) {
3289
- if ( ! enabledNativeTrack ) {
3290
- this . enableNativeTrack_ ( track ) ;
3291
- enabledNativeTrack = true ;
3292
- } else {
3293
- track . mode = 'disabled' ;
3294
- shaka . log . alwaysWarn (
3295
- 'Found more than one enabled text track, disabling it' ,
3296
- track ) ;
3293
+ let enabledNativeTrack = false ;
3294
+ for ( const track of textTracks ) {
3295
+ if ( track . mode !== 'disabled' ) {
3296
+ if ( ! enabledNativeTrack ) {
3297
+ this . enableNativeTrack_ ( track ) ;
3298
+ enabledNativeTrack = true ;
3299
+ } else {
3300
+ track . mode = 'disabled' ;
3301
+ shaka . log . alwaysWarn (
3302
+ 'Found more than one enabled text track, disabling it' ,
3303
+ track ) ;
3304
+ }
3297
3305
}
3298
3306
}
3299
3307
}
@@ -5222,20 +5230,24 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
5222
5230
* @export
5223
5231
*/
5224
5232
getTextTracks ( ) {
5225
- if ( this . manifest_ && ! this . isRemotePlayback ( ) ) {
5226
- const currentTextStream = this . streamingEngine_ ?
5233
+ if ( this . manifest_ ) {
5234
+ if ( this . isRemotePlayback ( ) ) {
5235
+ return [ ] ;
5236
+ } else {
5237
+ const currentTextStream = this . streamingEngine_ ?
5227
5238
this . streamingEngine_ . getCurrentTextStream ( ) : null ;
5228
- const tracks = [ ] ;
5239
+ const tracks = [ ] ;
5229
5240
5230
- // Convert all selectable text streams to tracks.
5231
- for ( const text of this . manifest_ . textStreams ) {
5232
- const track = shaka . util . StreamUtils . textStreamToTrack ( text ) ;
5233
- track . active = text == currentTextStream ;
5241
+ // Convert all selectable text streams to tracks.
5242
+ for ( const text of this . manifest_ . textStreams ) {
5243
+ const track = shaka . util . StreamUtils . textStreamToTrack ( text ) ;
5244
+ track . active = text == currentTextStream ;
5234
5245
5235
- tracks . push ( track ) ;
5236
- }
5246
+ tracks . push ( track ) ;
5247
+ }
5237
5248
5238
- return tracks ;
5249
+ return tracks ;
5250
+ }
5239
5251
} else if ( this . video_ && this . video_ . src && this . video_ . textTracks ) {
5240
5252
const textTracks = this . getFilteredTextTracks_ ( ) ;
5241
5253
const StreamUtils = shaka . util . StreamUtils ;
@@ -5501,22 +5513,33 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
5501
5513
const selectSrcEqualsMode = ( ) => {
5502
5514
if ( this . video_ && this . video_ . textTracks ) {
5503
5515
const textTracks = this . getFilteredTextTracks_ ( ) ;
5504
- const oldTrack = textTracks . find ( ( textTrack ) =>
5505
- textTrack . mode !== 'disabled' ) ;
5506
5516
const newTrack = textTracks . find ( ( textTrack ) =>
5507
5517
shaka . util . StreamUtils . html5TrackId ( textTrack ) === track . id ) ;
5508
5518
if ( ! newTrack ) {
5509
5519
shaka . log . error ( 'No track with id' , track . id ) ;
5510
5520
return ;
5511
5521
}
5512
- if ( oldTrack !== newTrack ) {
5513
- if ( oldTrack ) {
5514
- oldTrack . mode = 'disabled' ;
5515
- this . loadEventManager_ . unlisten ( oldTrack , 'cuechange' ) ;
5516
- this . textDisplayer_ . remove ( 0 , Infinity ) ;
5522
+ if ( this . textDisplayer_ instanceof shaka . text . NativeTextDisplayer ) {
5523
+ for ( const texTrack of textTracks ) {
5524
+ const mode = texTrack === newTrack ?
5525
+ this . isTextVisible_ ? 'showing' : 'hidden' :
5526
+ 'disabled' ;
5527
+ if ( texTrack . mode !== mode ) {
5528
+ texTrack . mode = mode ;
5529
+ }
5517
5530
}
5518
- if ( newTrack ) {
5519
- this . enableNativeTrack_ ( newTrack ) ;
5531
+ } else {
5532
+ const oldTrack = textTracks . find ( ( textTrack ) =>
5533
+ textTrack . mode !== 'disabled' ) ;
5534
+ if ( oldTrack !== newTrack ) {
5535
+ if ( oldTrack ) {
5536
+ oldTrack . mode = 'disabled' ;
5537
+ this . loadEventManager_ . unlisten ( oldTrack , 'cuechange' ) ;
5538
+ this . textDisplayer_ . remove ( 0 , Infinity ) ;
5539
+ }
5540
+ if ( newTrack ) {
5541
+ this . enableNativeTrack_ ( newTrack ) ;
5542
+ }
5520
5543
}
5521
5544
}
5522
5545
this . onTextChanged_ ( ) ;
@@ -7388,17 +7411,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
7388
7411
// TextDisplay factory must capture a reference to "this".
7389
7412
config . textDisplayFactory = ( ) => {
7390
7413
// On iOS where the Fullscreen API is not available we prefer
7391
- // SimpleTextDisplayer because it works with the Fullscreen API of the
7414
+ // NativeTextDisplayer because it works with the Fullscreen API of the
7392
7415
// video element itself.
7393
7416
const Platform = shaka . util . Platform ;
7394
7417
if ( this . videoContainer_ &&
7395
7418
( ! Platform . isApple ( ) || document . fullscreenEnabled ) ) {
7396
7419
return new shaka . text . UITextDisplayer (
7397
7420
this . video_ , this . videoContainer_ ) ;
7398
7421
} else {
7399
- if ( 'addTextTrack' in this . video_ ) {
7400
- return new shaka . text . SimpleTextDisplayer (
7401
- this . video_ , shaka . Player . TextTrackLabel ) ;
7422
+ if ( 'track' in document . createElement ( 'track' ) ) {
7423
+ return new shaka . text . NativeTextDisplayer ( this ) ;
7402
7424
} else {
7403
7425
shaka . log . warning ( 'Text tracks are not supported by the ' +
7404
7426
'browser, disabling.' ) ;
0 commit comments