Search in sources :

Example 16 with MappedTrackInfo

use of com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo in project Telegram-FOSS by Telegram-FOSS-Team.

the class DefaultTrackSelector method selectAudioTrack.

// Audio track selection implementation.
/**
 * Called by {@link #selectAllTracks(MappedTrackInfo, int[][][], int[], Parameters)} to create a
 * {@link TrackSelection} for an audio renderer.
 *
 * @param groups The {@link TrackGroupArray} mapped to the renderer.
 * @param formatSupports The {@link Capabilities} for each mapped track, indexed by renderer,
 *     track group and track (in that order).
 * @param mixedMimeTypeAdaptationSupports The {@link AdaptiveSupport} for mixed MIME type
 *     adaptation for the renderer.
 * @param params The selector's current constraint parameters.
 * @param enableAdaptiveTrackSelection Whether adaptive track selection is allowed.
 * @return The {@link TrackSelection.Definition} and corresponding {@link AudioTrackScore}, or
 *     null if no selection was made.
 * @throws ExoPlaybackException If an error occurs while selecting the tracks.
 */
@SuppressWarnings("unused")
@Nullable
protected Pair<TrackSelection.Definition, AudioTrackScore> selectAudioTrack(TrackGroupArray groups, @Capabilities int[][] formatSupports, @AdaptiveSupport int mixedMimeTypeAdaptationSupports, Parameters params, boolean enableAdaptiveTrackSelection) throws ExoPlaybackException {
    int selectedTrackIndex = C.INDEX_UNSET;
    int selectedGroupIndex = C.INDEX_UNSET;
    AudioTrackScore selectedTrackScore = null;
    for (int groupIndex = 0; groupIndex < groups.length; groupIndex++) {
        TrackGroup trackGroup = groups.get(groupIndex);
        @Capabilities int[] trackFormatSupport = formatSupports[groupIndex];
        for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) {
            if (isSupported(trackFormatSupport[trackIndex], params.exceedRendererCapabilitiesIfNecessary)) {
                Format format = trackGroup.getFormat(trackIndex);
                AudioTrackScore trackScore = new AudioTrackScore(format, params, trackFormatSupport[trackIndex]);
                if (!trackScore.isWithinConstraints && !params.exceedAudioConstraintsIfNecessary) {
                    // Track should not be selected.
                    continue;
                }
                if (selectedTrackScore == null || trackScore.compareTo(selectedTrackScore) > 0) {
                    selectedGroupIndex = groupIndex;
                    selectedTrackIndex = trackIndex;
                    selectedTrackScore = trackScore;
                }
            }
        }
    }
    if (selectedGroupIndex == C.INDEX_UNSET) {
        return null;
    }
    TrackGroup selectedGroup = groups.get(selectedGroupIndex);
    TrackSelection.Definition definition = null;
    if (!params.forceHighestSupportedBitrate && !params.forceLowestBitrate && enableAdaptiveTrackSelection) {
        // If the group of the track with the highest score allows it, try to enable adaptation.
        int[] adaptiveTracks = getAdaptiveAudioTracks(selectedGroup, formatSupports[selectedGroupIndex], params.maxAudioBitrate, params.allowAudioMixedMimeTypeAdaptiveness, params.allowAudioMixedSampleRateAdaptiveness, params.allowAudioMixedChannelCountAdaptiveness);
        if (adaptiveTracks.length > 0) {
            definition = new TrackSelection.Definition(selectedGroup, adaptiveTracks);
        }
    }
    if (definition == null) {
        // We didn't make an adaptive selection, so make a fixed one instead.
        definition = new TrackSelection.Definition(selectedGroup, selectedTrackIndex);
    }
    return Pair.create(definition, Assertions.checkNotNull(selectedTrackScore));
}
Also used : Format(com.google.android.exoplayer2.Format) TrackGroup(com.google.android.exoplayer2.source.TrackGroup) RendererCapabilities(com.google.android.exoplayer2.RendererCapabilities) Capabilities(com.google.android.exoplayer2.RendererCapabilities.Capabilities) Point(android.graphics.Point) Nullable(androidx.annotation.Nullable)

Example 17 with MappedTrackInfo

use of com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo in project Telegram-FOSS by Telegram-FOSS-Team.

the class MappingTrackSelector method selectTracks.

@Override
public final TrackSelectorResult selectTracks(RendererCapabilities[] rendererCapabilities, TrackGroupArray trackGroups, MediaPeriodId periodId, Timeline timeline) throws ExoPlaybackException {
    // Structures into which data will be written during the selection. The extra item at the end
    // of each array is to store data associated with track groups that cannot be associated with
    // any renderer.
    int[] rendererTrackGroupCounts = new int[rendererCapabilities.length + 1];
    TrackGroup[][] rendererTrackGroups = new TrackGroup[rendererCapabilities.length + 1][];
    @Capabilities int[][][] rendererFormatSupports = new int[rendererCapabilities.length + 1][][];
    for (int i = 0; i < rendererTrackGroups.length; i++) {
        rendererTrackGroups[i] = new TrackGroup[trackGroups.length];
        rendererFormatSupports[i] = new int[trackGroups.length][];
    }
    // Determine the extent to which each renderer supports mixed mimeType adaptation.
    @AdaptiveSupport int[] rendererMixedMimeTypeAdaptationSupports = getMixedMimeTypeAdaptationSupports(rendererCapabilities);
    // renderer provides for each track in the group.
    for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) {
        TrackGroup group = trackGroups.get(groupIndex);
        // Associate the group to a preferred renderer.
        boolean preferUnassociatedRenderer = MimeTypes.getTrackType(group.getFormat(0).sampleMimeType) == C.TRACK_TYPE_METADATA;
        int rendererIndex = findRenderer(rendererCapabilities, group, rendererTrackGroupCounts, preferUnassociatedRenderer);
        // Evaluate the support that the renderer provides for each track in the group.
        @Capabilities int[] rendererFormatSupport = rendererIndex == rendererCapabilities.length ? new int[group.length] : getFormatSupport(rendererCapabilities[rendererIndex], group);
        // Stash the results.
        int rendererTrackGroupCount = rendererTrackGroupCounts[rendererIndex];
        rendererTrackGroups[rendererIndex][rendererTrackGroupCount] = group;
        rendererFormatSupports[rendererIndex][rendererTrackGroupCount] = rendererFormatSupport;
        rendererTrackGroupCounts[rendererIndex]++;
    }
    // Create a track group array for each renderer, and trim each rendererFormatSupports entry.
    TrackGroupArray[] rendererTrackGroupArrays = new TrackGroupArray[rendererCapabilities.length];
    int[] rendererTrackTypes = new int[rendererCapabilities.length];
    for (int i = 0; i < rendererCapabilities.length; i++) {
        int rendererTrackGroupCount = rendererTrackGroupCounts[i];
        rendererTrackGroupArrays[i] = new TrackGroupArray(Util.nullSafeArrayCopy(rendererTrackGroups[i], rendererTrackGroupCount));
        rendererFormatSupports[i] = Util.nullSafeArrayCopy(rendererFormatSupports[i], rendererTrackGroupCount);
        rendererTrackTypes[i] = rendererCapabilities[i].getTrackType();
    }
    // Create a track group array for track groups not mapped to a renderer.
    int unmappedTrackGroupCount = rendererTrackGroupCounts[rendererCapabilities.length];
    TrackGroupArray unmappedTrackGroupArray = new TrackGroupArray(Util.nullSafeArrayCopy(rendererTrackGroups[rendererCapabilities.length], unmappedTrackGroupCount));
    // Package up the track information and selections.
    MappedTrackInfo mappedTrackInfo = new MappedTrackInfo(rendererTrackTypes, rendererTrackGroupArrays, rendererMixedMimeTypeAdaptationSupports, rendererFormatSupports, unmappedTrackGroupArray);
    Pair<@NullableType RendererConfiguration[], @NullableType TrackSelection[]> result = selectTracks(mappedTrackInfo, rendererFormatSupports, rendererMixedMimeTypeAdaptationSupports);
    return new TrackSelectorResult(result.first, result.second, mappedTrackInfo);
}
Also used : TrackGroupArray(com.google.android.exoplayer2.source.TrackGroupArray) NullableType(org.checkerframework.checker.nullness.compatqual.NullableType) TrackGroup(com.google.android.exoplayer2.source.TrackGroup) Capabilities(com.google.android.exoplayer2.RendererCapabilities.Capabilities) RendererCapabilities(com.google.android.exoplayer2.RendererCapabilities) AdaptiveSupport(com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport)

Example 18 with MappedTrackInfo

use of com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo in project android-sdk by testpress.

the class ExoPlayerUtil method playLowBitrateTrack.

private void playLowBitrateTrack() {
    MappingTrackSelector.MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
    if (mappedTrackInfo != null) {
        int rendererIndex = getRendererIndex(C.TRACK_TYPE_VIDEO, mappedTrackInfo);
        TrackGroupArray trackGroups = mappedTrackInfo.getTrackGroups(rendererIndex);
        Pair<Integer, Integer> pair = VideoUtils.getLowBitrateTrackIndex(trackGroups);
        DefaultTrackSelector.SelectionOverride override = new DefaultTrackSelector.SelectionOverride(pair.getSecond(), pair.getFirst());
        DefaultTrackSelector.ParametersBuilder parametersBuilder = trackSelector.buildUponParameters();
        parametersBuilder.clearSelectionOverrides(rendererIndex).setSelectionOverride(rendererIndex, mappedTrackInfo.getTrackGroups(rendererIndex), override);
        trackSelector.setParameters(parametersBuilder.build());
    }
}
Also used : MappingTrackSelector(com.google.android.exoplayer2.trackselection.MappingTrackSelector) TrackGroupArray(com.google.android.exoplayer2.source.TrackGroupArray) DefaultTrackSelector(com.google.android.exoplayer2.trackselection.DefaultTrackSelector)

Example 19 with MappedTrackInfo

use of com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo in project SmartTubeNext by yuliskov.

the class TrackSelectorManager method initTrackGroups.

private void initTrackGroups(int rendererIndex, MappedTrackInfo trackInfo, Parameters parameters) {
    if (trackInfo == null) {
        Log.e(TAG, "Can't perform track selection. Mapped track info isn't initialized yet!");
        return;
    }
    if (parameters == null) {
        Log.e(TAG, "Can't perform track selection. Track parameters isn't initialized yet!");
        return;
    }
    TrackGroupArray trackGroups = trackInfo.getTrackGroups(rendererIndex);
    initTrackGroups(rendererIndex, trackGroups, parameters);
}
Also used : TrackGroupArray(com.google.android.exoplayer2.source.TrackGroupArray)

Example 20 with MappedTrackInfo

use of com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo in project drchannels by clhols.

the class TrackSelectionDialog method init.

private void init(int titleId, MappedTrackInfo mappedTrackInfo, DefaultTrackSelector.Parameters initialParameters, boolean allowAdaptiveSelections, boolean allowMultipleOverrides, DialogInterface.OnClickListener onClickListener, DialogInterface.OnDismissListener onDismissListener) {
    this.titleId = titleId;
    this.onClickListener = onClickListener;
    this.onDismissListener = onDismissListener;
    for (int i = 0; i < mappedTrackInfo.getRendererCount(); i++) {
        if (showTabForRenderer(mappedTrackInfo, i)) {
            int trackType = mappedTrackInfo.getRendererType(/* rendererIndex= */
            i);
            TrackGroupArray trackGroupArray = mappedTrackInfo.getTrackGroups(i);
            TrackSelectionViewFragment tabFragment = new TrackSelectionViewFragment();
            tabFragment.init(mappedTrackInfo, /* rendererIndex= */
            i, initialParameters.getRendererDisabled(/* rendererIndex= */
            i), initialParameters.getSelectionOverride(/* rendererIndex= */
            i, trackGroupArray), allowAdaptiveSelections, allowMultipleOverrides);
            tabFragments.put(i, tabFragment);
            tabTrackTypes.add(trackType);
        }
    }
}
Also used : TrackGroupArray(com.google.android.exoplayer2.source.TrackGroupArray)

Aggregations

TrackGroupArray (com.google.android.exoplayer2.source.TrackGroupArray)29 MappedTrackInfo (com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo)22 TrackGroup (com.google.android.exoplayer2.source.TrackGroup)21 Point (android.graphics.Point)15 RendererCapabilities (com.google.android.exoplayer2.RendererCapabilities)13 Nullable (androidx.annotation.Nullable)12 Capabilities (com.google.android.exoplayer2.RendererCapabilities.Capabilities)12 DefaultTrackSelector (com.google.android.exoplayer2.trackselection.DefaultTrackSelector)12 Format (com.google.android.exoplayer2.Format)8 SelectionOverride (com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride)8 RendererConfiguration (com.google.android.exoplayer2.RendererConfiguration)7 TrackSelection (com.google.android.exoplayer2.trackselection.TrackSelection)6 List (java.util.List)6 NullableType (org.checkerframework.checker.nullness.compatqual.NullableType)6 SuppressLint (android.annotation.SuppressLint)5 CheckedTextView (android.widget.CheckedTextView)5 ArrayList (java.util.ArrayList)5 Metadata (com.google.android.exoplayer2.metadata.Metadata)4 Pair (android.util.Pair)3 AdaptiveSupport (com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport)3