Skip to content

Commit

Permalink
fix: Fix selectAudioLanguage using channelsCount param (#5875)
Browse files Browse the repository at this point in the history
  • Loading branch information
avelad committed Nov 13, 2023
1 parent d6aab6b commit c830a99
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 131 deletions.
21 changes: 18 additions & 3 deletions lib/media/adaptation_set_criteria.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ goog.require('shaka.log');
goog.require('shaka.media.AdaptationSet');
goog.require('shaka.media.Capabilities');
goog.require('shaka.util.LanguageUtils');
goog.require('shaka.util.StreamUtils');


/**
Expand Down Expand Up @@ -136,7 +135,6 @@ shaka.media.PreferenceBasedCriteria = class {
/** @override */
create(variants) {
const Class = shaka.media.PreferenceBasedCriteria;
const StreamUtils = shaka.util.StreamUtils;

let current = [];

Expand Down Expand Up @@ -183,7 +181,7 @@ shaka.media.PreferenceBasedCriteria = class {
}

if (this.channelCount_) {
const byChannel = StreamUtils.filterVariantsByAudioChannelCount(
const byChannel = Class.filterVariantsByAudioChannelCount_(
current, this.channelCount_);
if (byChannel.length) {
current = byChannel;
Expand Down Expand Up @@ -280,6 +278,23 @@ shaka.media.PreferenceBasedCriteria = class {
});
}

/**
* Filter Variants by channelCount.
*
* @param {!Array.<shaka.extern.Variant>} variants
* @param {number} channelCount
* @return {!Array.<shaka.extern.Variant>}
* @private
*/
static filterVariantsByAudioChannelCount_(variants, channelCount) {
return variants.filter((variant) => {
if (variant.audio && variant.audio.channelsCount &&
variant.audio.channelsCount != channelCount) {
return false;
}
return true;
});
}

/**
* Filters variants according to the given hdr level config.
Expand Down
46 changes: 0 additions & 46 deletions lib/util/stream_utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -1448,52 +1448,6 @@ shaka.util.StreamUtils = class {
}


/**
* Filters variants according to the given audio channel count config.
*
* @param {!Array.<shaka.extern.Variant>} variants
* @param {number} preferredAudioChannelCount
* @return {!Array.<!shaka.extern.Variant>}
*/
static filterVariantsByAudioChannelCount(
variants, preferredAudioChannelCount) {
// Group variants by their audio channel counts.
const variantsWithChannelCounts =
variants.filter((v) => v.audio && v.audio.channelsCount);

/** @type {!Map.<number, !Array.<shaka.extern.Variant>>} */
const variantsByChannelCount = new Map();
const capableVariants = [];
for (const variant of variantsWithChannelCounts) {
const count = variant.audio.channelsCount;
goog.asserts.assert(count != null, 'Must have count after filtering!');
if (!variantsByChannelCount.has(count)) {
variantsByChannelCount.set(count, []);
}
variantsByChannelCount.get(count).push(variant);
if (count <= preferredAudioChannelCount) {
capableVariants.push(variant);
}
}

// return all capable channelcounts
if (capableVariants.length) {
return capableVariants;
}

/** @type {!Array.<number>} */
const channelCounts = Array.from(variantsByChannelCount.keys());

// If no variant has audio channel count info, return the original variants.
if (channelCounts.length == 0) {
return variants;
}

// If all variants have more audio channels than the config, choose the
// variants with the fewest audio channels.
return variantsByChannelCount.get(Math.min(...channelCounts));
}

/**
* Chooses streams according to the given config.
* Works both for Stream and Track types due to their similarities.
Expand Down
82 changes: 0 additions & 82 deletions test/util/stream_utils_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -390,88 +390,6 @@ describe('StreamUtils', () => {
});
});

describe('filterVariantsByAudioChannelCount', () => {
it('chooses variants with preferred audio channels count', () => {
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
manifest.addVariant(0, (variant) => {
variant.addAudio(0, (stream) => {
stream.channelsCount = 2;
});
});
manifest.addVariant(1, (variant) => {
variant.addAudio(1, (stream) => {
stream.channelsCount = 6;
});
});
manifest.addVariant(2, (variant) => {
variant.addAudio(2, (stream) => {
stream.channelsCount = 2;
});
});
});

const chosen = StreamUtils.filterVariantsByAudioChannelCount(
manifest.variants, 2);
expect(chosen.length).toBe(2);
expect(chosen[0]).toBe(manifest.variants[0]);
expect(chosen[1]).toBe(manifest.variants[2]);
});

it('chooses variants with largest audio channel count less than config' +
' when no exact audio channel count match is possible', () => {
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
manifest.addVariant(0, (variant) => {
variant.addAudio(0, (stream) => {
stream.channelsCount = 2;
});
});
manifest.addVariant(1, (variant) => {
variant.addAudio(1, (stream) => {
stream.channelsCount = 8;
});
});
manifest.addVariant(2, (variant) => {
variant.addAudio(2, (stream) => {
stream.channelsCount = 2;
});
});
});

const chosen = StreamUtils.filterVariantsByAudioChannelCount(
manifest.variants, 6);
expect(chosen.length).toBe(2);
expect(chosen[0]).toBe(manifest.variants[0]);
expect(chosen[1]).toBe(manifest.variants[2]);
});

it('chooses variants with fewest audio channels when none fit in the ' +
'config', () => {
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
manifest.addVariant(0, (variant) => {
variant.addAudio(0, (stream) => {
stream.channelsCount = 6;
});
});
manifest.addVariant(1, (variant) => {
variant.addAudio(1, (stream) => {
stream.channelsCount = 8;
});
});
manifest.addVariant(2, (variant) => {
variant.addAudio(2, (stream) => {
stream.channelsCount = 6;
});
});
});

const chosen = StreamUtils.filterVariantsByAudioChannelCount(
manifest.variants, 2);
expect(chosen.length).toBe(2);
expect(chosen[0]).toBe(manifest.variants[0]);
expect(chosen[1]).toBe(manifest.variants[2]);
});
});

describe('getDecodingInfosForVariants', () => {
it('for multiplexd content', async () => {
manifest = shaka.test.ManifestGenerator.generate((manifest) => {
Expand Down

0 comments on commit c830a99

Please sign in to comment.