Skip to content

Commit

Permalink
Use ListHelper to get secondary audio streams for video-only streams
Browse files Browse the repository at this point in the history
Instead of searching for the first audio stream matching a compatible media
format, this change makes SecondaryStreamHelper.getAudioStreamFor use methods
isLimitingDataUsage, getAudioFormatComparator and getAudioIndexByHighestRank of
ListHelper to get an audio stream which can be muxed into a video-only stream,
if available.

This allows users to download videos with the highest audio quality available
if no resolution limit on mobile data usage has been set.

The order of formats used to search a compatible audio stream has been kept.
  • Loading branch information
AudricV committed Sep 24, 2023
1 parent cdb79ef commit 77bbbc8
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -267,8 +267,8 @@ private void updateSecondaryStreams() {
if (!videoStreams.get(i).isVideoOnly()) {
continue;
}
final AudioStream audioStream = SecondaryStreamHelper
.getAudioStreamFor(audioStreams.getStreamsList(), videoStreams.get(i));
final AudioStream audioStream = SecondaryStreamHelper.getAudioStreamFor(
context, audioStreams.getStreamsList(), videoStreams.get(i));

if (audioStream != null) {
secondaryStreams.append(i, new SecondaryStreamHelper<>(audioStreams, audioStream));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.schabi.newpipe.util;

import android.content.Context;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

Expand All @@ -9,6 +11,7 @@
import org.schabi.newpipe.extractor.stream.VideoStream;
import org.schabi.newpipe.util.StreamItemAdapter.StreamInfoWrapper;

import java.util.Comparator;
import java.util.List;

public class SecondaryStreamHelper<T extends Stream> {
Expand All @@ -27,12 +30,14 @@ public SecondaryStreamHelper(@NonNull final StreamInfoWrapper<T> streams,
/**
* Find the correct audio stream for the desired video stream.
*
* @param context Android context
* @param audioStreams list of audio streams
* @param videoStream desired video ONLY stream
* @return selected audio stream or null if a candidate was not found
*/
@Nullable
public static AudioStream getAudioStreamFor(@NonNull final List<AudioStream> audioStreams,
public static AudioStream getAudioStreamFor(@NonNull final Context context,
@NonNull final List<AudioStream> audioStreams,
@NonNull final VideoStream videoStream) {
final MediaFormat mediaFormat = videoStream.getFormat();
if (mediaFormat == null) {
Expand All @@ -41,33 +46,36 @@ public static AudioStream getAudioStreamFor(@NonNull final List<AudioStream> aud

switch (mediaFormat) {
case WEBM:
case MPEG_4:// ¿is mpeg-4 DASH?
case MPEG_4: // Is MPEG-4 DASH?
break;
default:
return null;
}

final boolean m4v = (mediaFormat == MediaFormat.MPEG_4);
final boolean m4v = mediaFormat == MediaFormat.MPEG_4;
final boolean isLimitingDataUsage = ListHelper.isLimitingDataUsage(context);

Comparator<AudioStream> comparator = ListHelper.getAudioFormatComparator(
m4v ? MediaFormat.M4A : MediaFormat.WEBMA, isLimitingDataUsage);
int preferredAudioStreamIndex = ListHelper.getAudioIndexByHighestRank(
audioStreams, comparator);

for (final AudioStream audio : audioStreams) {
if (audio.getFormat() == (m4v ? MediaFormat.M4A : MediaFormat.WEBMA)) {
return audio;
if (preferredAudioStreamIndex == -1) {
if (m4v) {
return null;
}
}

if (m4v) {
return null;
}
comparator = ListHelper.getAudioFormatComparator(
MediaFormat.WEBMA_OPUS, isLimitingDataUsage);
preferredAudioStreamIndex = ListHelper.getAudioIndexByHighestRank(
audioStreams, comparator);

// retry, but this time in reverse order
for (int i = audioStreams.size() - 1; i >= 0; i--) {
final AudioStream audio = audioStreams.get(i);
if (audio.getFormat() == MediaFormat.WEBMA_OPUS) {
return audio;
if (preferredAudioStreamIndex == -1) {
return null;
}
}

return null;
return audioStreams.get(preferredAudioStreamIndex);
}

public T getStream() {
Expand Down

0 comments on commit 77bbbc8

Please sign in to comment.