Skip to content

Commit

Permalink
refactor(player): Clean up firing of track change related events.
Browse files Browse the repository at this point in the history
Issue shaka-project#3359

Change-Id: Ieffc0d0053521c9ff6c8feb9b795f3473afe3172
  • Loading branch information
ismena committed Jun 7, 2021
1 parent e1b3deb commit 795860f
Showing 1 changed file with 44 additions and 37 deletions.
81 changes: 44 additions & 37 deletions lib/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,8 @@ goog.requireType('shaka.routing.Payload');
* <code>selectAudioLanguage()</code>, or <code>selectTextLanguage()</code>.
* @property {string} type
* 'adaptation'
* @property {shaka.extern.Track} oldTrack
* @property {shaka.extern.Track} newTrack
* @exportDoc
*/

Expand Down Expand Up @@ -1866,10 +1868,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
// Pick the initial streams to play.
const initialVariant = this.chooseVariant_();
goog.asserts.assert(initialVariant, 'Must choose an initial variant!');
this.addVariantToSwitchHistory_(
initialVariant, /* fromAdaptation= */ true);
this.streamingEngine_.switchVariant(
initialVariant, /* clearBuffer= */ false, /* safeMargin= */ 0);
this.switchVariant_(initialVariant, /* fromAdaptation= */ true,
/* clearBuffer= */ false, /* safeMargin= */ 0);

// Decide if text should be shown automatically.
const initialTextStream = this.chooseTextStream_();
Expand Down Expand Up @@ -1907,8 +1907,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
this.filterManifestByCurrentVariant_();
// Dispatch a 'trackschanged' event now that all initial filtering is done.
this.onTracksChanged_();

// Since the first streams just became active, send an adaptation event.
this.onAdaptation_();
this.onAdaptation_(null,
shaka.util.StreamUtils.variantToTrack(initialVariant));

// Now that we've filtered out variants that aren't compatible with the
// active one, update abr manager with filtered variants.
Expand Down Expand Up @@ -3575,36 +3577,34 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
new shaka.media.PreferenceBasedCriteria(language, role || '',
/* channelCount= */ 0, /* label= */ '');

if (!this.config_.abr.enabled) {
const diff = (a, b) => {
if (!a.video && !b.video) {
return 0;
} else if (!a.video || !b.video) {
return Infinity;
} else {
return Math.abs((a.video.height || 0) - (b.video.height || 0)) +
const diff = (a, b) => {
if (!a.video && !b.video) {
return 0;
} else if (!a.video || !b.video) {
return Infinity;
} else {
return Math.abs((a.video.height || 0) - (b.video.height || 0)) +
Math.abs((a.video.width || 0) - (b.video.width || 0));
}
};
}
};
// Find the variant whose size is closest to the active variant. This
// ensures we stay at about the same resolution when just changing the
// language/role.
const active = this.streamingEngine_.getCurrentVariant();
const set =
const active = this.streamingEngine_.getCurrentVariant();
const set =
this.currentAdaptationSetCriteria_.create(this.manifest_.variants);
let bestVariant = null;
for (const curVariant of set.values()) {
if (!bestVariant ||
let bestVariant = null;
for (const curVariant of set.values()) {
if (!bestVariant ||
diff(bestVariant, active) > diff(curVariant, active)) {
bestVariant = curVariant;
}
}
if (bestVariant) {
const track = shaka.util.StreamUtils.variantToTrack(bestVariant);
this.selectVariantTrack(track, /* clearBuffer= */ true);
return;
bestVariant = curVariant;
}
}
if (bestVariant) {
const track = shaka.util.StreamUtils.variantToTrack(bestVariant);
this.selectVariantTrack(track, /* clearBuffer= */ true);
return;
}

// If we haven't switched yet, just use ABR to find a new track.
this.chooseVariantAndSwitch_();
Expand Down Expand Up @@ -4941,9 +4941,6 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
if (chosenVariant) {
this.switchVariant_(chosenVariant, /* fromAdaptation= */ true,
/* clearBuffers= */ true, /* safeMargin= */ 0);
// Send an adaptation event so that the UI can show the new
// language/tracks.
this.onAdaptation_();
}
}

Expand All @@ -4969,8 +4966,14 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
oldTrack = shaka.util.StreamUtils.variantToTrack(currentVariant);
}
const newTrack = shaka.util.StreamUtils.variantToTrack(variant);
// Dispatch a 'variantchanged' event
this.onVariantChanged_(oldTrack, newTrack);

if (fromAdaptation) {
// Dispatch an 'adaptation' event
this.onAdaptation_(oldTrack, newTrack);
} else {
// Dispatch a 'variantchanged' event
this.onVariantChanged_(oldTrack, newTrack);
}
}

/**
Expand Down Expand Up @@ -5108,19 +5111,23 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
return;
}

this.addVariantToSwitchHistory_(variant, /* fromAdaptation= */ true);
this.streamingEngine_.switchVariant(variant, clearBuffer, safeMargin);
this.onAdaptation_();
this.switchVariant_(variant, /* fromAdaptation= */ true,
clearBuffer, safeMargin);
}

/**
* Dispatches an 'adaptation' event.
* @param {?shaka.extern.Track} from
* @param {shaka.extern.Track} to
* @private
*/
onAdaptation_() {
onAdaptation_(from, to) {
// Delay the 'adaptation' event so that StreamingEngine has time to absorb
// the changes before the user tries to query it.
const event = this.makeEvent_(shaka.Player.EventName.Adaptation);
const event = this.makeEvent_(shaka.Player.EventName.Adaptation, {
oldTrack: from,
newTrack: to,
});
this.delayDispatchEvent_(event);
}

Expand Down

0 comments on commit 795860f

Please sign in to comment.