mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Add an option in DownloadHelper to log debug information
Add a debugLoggingEnabled parameter in DownloadHelper constructor and forMediaItem overloads. For backward compatibility, this is disabled by default. Currently the debug logging is for track selection results only. PiperOrigin-RevId: 730881600
This commit is contained in:
parent
a3f281dff8
commit
d58740367b
@ -18,6 +18,7 @@ package androidx.media3.exoplayer.offline;
|
|||||||
import static androidx.media3.common.util.Assertions.checkNotNull;
|
import static androidx.media3.common.util.Assertions.checkNotNull;
|
||||||
import static androidx.media3.common.util.Assertions.checkState;
|
import static androidx.media3.common.util.Assertions.checkState;
|
||||||
import static androidx.media3.common.util.Util.castNonNull;
|
import static androidx.media3.common.util.Util.castNonNull;
|
||||||
|
import static androidx.media3.common.util.Util.getFormatSupportString;
|
||||||
import static java.lang.Math.min;
|
import static java.lang.Math.min;
|
||||||
import static java.lang.annotation.ElementType.TYPE_USE;
|
import static java.lang.annotation.ElementType.TYPE_USE;
|
||||||
import static java.lang.annotation.RetentionPolicy.SOURCE;
|
import static java.lang.annotation.RetentionPolicy.SOURCE;
|
||||||
@ -30,6 +31,7 @@ import android.util.SparseIntArray;
|
|||||||
import androidx.annotation.IntDef;
|
import androidx.annotation.IntDef;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.media3.common.C;
|
import androidx.media3.common.C;
|
||||||
|
import androidx.media3.common.Format;
|
||||||
import androidx.media3.common.MediaItem;
|
import androidx.media3.common.MediaItem;
|
||||||
import androidx.media3.common.StreamKey;
|
import androidx.media3.common.StreamKey;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
@ -75,6 +77,7 @@ import androidx.media3.exoplayer.upstream.BandwidthMeter;
|
|||||||
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
import androidx.media3.exoplayer.upstream.DefaultAllocator;
|
||||||
import androidx.media3.extractor.ExtractorsFactory;
|
import androidx.media3.extractor.ExtractorsFactory;
|
||||||
import androidx.media3.extractor.SeekMap;
|
import androidx.media3.extractor.SeekMap;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.annotation.Documented;
|
import java.lang.annotation.Documented;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
@ -199,12 +202,34 @@ public final class DownloadHelper {
|
|||||||
*/
|
*/
|
||||||
public static DownloadHelper forMediaItem(
|
public static DownloadHelper forMediaItem(
|
||||||
Context context, MediaItem mediaItem, DataSource.Factory dataSourceFactory) {
|
Context context, MediaItem mediaItem, DataSource.Factory dataSourceFactory) {
|
||||||
|
return forMediaItem(context, mediaItem, dataSourceFactory, /* debugLoggingEnabled= */ false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for the given media item.
|
||||||
|
*
|
||||||
|
* @param context The context.
|
||||||
|
* @param mediaItem A {@link MediaItem}.
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
|
||||||
|
* streams or the {@link SeekMap} for progressive streams. In the latter case, this has to be
|
||||||
|
* a {@link CacheDataSource.Factory} for the {@link Cache} into which downloads will be
|
||||||
|
* written.
|
||||||
|
* @param debugLoggingEnabled Whether to log debug information.
|
||||||
|
* @throws IllegalStateException If the corresponding module is missing for DASH, HLS or
|
||||||
|
* SmoothStreaming media items.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forMediaItem(
|
||||||
|
Context context,
|
||||||
|
MediaItem mediaItem,
|
||||||
|
DataSource.Factory dataSourceFactory,
|
||||||
|
boolean debugLoggingEnabled) {
|
||||||
return forMediaItem(
|
return forMediaItem(
|
||||||
mediaItem,
|
mediaItem,
|
||||||
getDefaultTrackSelectorParameters(context),
|
getDefaultTrackSelectorParameters(context),
|
||||||
/* renderersFactory= */ null,
|
/* renderersFactory= */ null,
|
||||||
dataSourceFactory,
|
dataSourceFactory,
|
||||||
/* drmSessionManager= */ null);
|
/* drmSessionManager= */ null,
|
||||||
|
debugLoggingEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -228,12 +253,40 @@ public final class DownloadHelper {
|
|||||||
MediaItem mediaItem,
|
MediaItem mediaItem,
|
||||||
@Nullable RenderersFactory renderersFactory,
|
@Nullable RenderersFactory renderersFactory,
|
||||||
@Nullable DataSource.Factory dataSourceFactory) {
|
@Nullable DataSource.Factory dataSourceFactory) {
|
||||||
|
return forMediaItem(
|
||||||
|
context, mediaItem, renderersFactory, dataSourceFactory, /* debugLoggingEnabled= */ false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for the given media item.
|
||||||
|
*
|
||||||
|
* @param context The context.
|
||||||
|
* @param mediaItem A {@link MediaItem}.
|
||||||
|
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||||
|
* selected.
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
|
||||||
|
* streams or the {@link SeekMap} for progressive streams. This argument is required for
|
||||||
|
* adaptive streams or when requesting partial downloads for progressive streams. In the
|
||||||
|
* latter case, this has to be a {@link CacheDataSource.Factory} for the {@link Cache} into
|
||||||
|
* which downloads will be written.
|
||||||
|
* @param debugLoggingEnabled Whether to log debug information.
|
||||||
|
* @throws IllegalStateException If the corresponding module is missing for DASH, HLS or
|
||||||
|
* SmoothStreaming media items.
|
||||||
|
* @throws IllegalArgumentException If the {@code dataSourceFactory} is null for adaptive streams.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forMediaItem(
|
||||||
|
Context context,
|
||||||
|
MediaItem mediaItem,
|
||||||
|
@Nullable RenderersFactory renderersFactory,
|
||||||
|
@Nullable DataSource.Factory dataSourceFactory,
|
||||||
|
boolean debugLoggingEnabled) {
|
||||||
return forMediaItem(
|
return forMediaItem(
|
||||||
mediaItem,
|
mediaItem,
|
||||||
DEFAULT_TRACK_SELECTOR_PARAMETERS,
|
DEFAULT_TRACK_SELECTOR_PARAMETERS,
|
||||||
renderersFactory,
|
renderersFactory,
|
||||||
dataSourceFactory,
|
dataSourceFactory,
|
||||||
/* drmSessionManager= */ null);
|
/* drmSessionManager= */ null,
|
||||||
|
debugLoggingEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -263,7 +316,40 @@ public final class DownloadHelper {
|
|||||||
trackSelectionParameters,
|
trackSelectionParameters,
|
||||||
renderersFactory,
|
renderersFactory,
|
||||||
dataSourceFactory,
|
dataSourceFactory,
|
||||||
/* drmSessionManager= */ null);
|
/* debugLoggingEnabled= */ false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for the given media item.
|
||||||
|
*
|
||||||
|
* @param mediaItem A {@link MediaItem}.
|
||||||
|
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||||
|
* selected.
|
||||||
|
* @param trackSelectionParameters {@link TrackSelectionParameters} for selecting tracks for
|
||||||
|
* downloading.
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
|
||||||
|
* streams or the {@link SeekMap} for progressive streams. This argument is required for
|
||||||
|
* adaptive streams or when requesting partial downloads for progressive streams. In the
|
||||||
|
* latter case, this has to be a {@link CacheDataSource.Factory} for the {@link Cache} into
|
||||||
|
* which downloads will be written.
|
||||||
|
* @param debugLoggingEnabled Whether to log debug information.
|
||||||
|
* @throws IllegalStateException If the corresponding module is missing for DASH, HLS or
|
||||||
|
* SmoothStreaming media items.
|
||||||
|
* @throws IllegalArgumentException If the {@code dataSourceFactory} is null for adaptive streams.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forMediaItem(
|
||||||
|
MediaItem mediaItem,
|
||||||
|
TrackSelectionParameters trackSelectionParameters,
|
||||||
|
@Nullable RenderersFactory renderersFactory,
|
||||||
|
@Nullable DataSource.Factory dataSourceFactory,
|
||||||
|
boolean debugLoggingEnabled) {
|
||||||
|
return forMediaItem(
|
||||||
|
mediaItem,
|
||||||
|
trackSelectionParameters,
|
||||||
|
renderersFactory,
|
||||||
|
dataSourceFactory,
|
||||||
|
/* drmSessionManager= */ null,
|
||||||
|
debugLoggingEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -291,6 +377,42 @@ public final class DownloadHelper {
|
|||||||
@Nullable RenderersFactory renderersFactory,
|
@Nullable RenderersFactory renderersFactory,
|
||||||
@Nullable DataSource.Factory dataSourceFactory,
|
@Nullable DataSource.Factory dataSourceFactory,
|
||||||
@Nullable DrmSessionManager drmSessionManager) {
|
@Nullable DrmSessionManager drmSessionManager) {
|
||||||
|
return forMediaItem(
|
||||||
|
mediaItem,
|
||||||
|
trackSelectionParameters,
|
||||||
|
renderersFactory,
|
||||||
|
dataSourceFactory,
|
||||||
|
drmSessionManager,
|
||||||
|
/* debugLoggingEnabled= */ false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a {@link DownloadHelper} for the given media item.
|
||||||
|
*
|
||||||
|
* @param mediaItem A {@link MediaItem}.
|
||||||
|
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||||
|
* selected.
|
||||||
|
* @param trackSelectionParameters {@link TrackSelectionParameters} for selecting tracks for
|
||||||
|
* downloading.
|
||||||
|
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
|
||||||
|
* streams or the {@link SeekMap} for progressive streams. This argument is required for
|
||||||
|
* adaptive streams or when requesting partial downloads for progressive streams. In the
|
||||||
|
* latter case, this has to be a {@link CacheDataSource.Factory} for the {@link Cache} into
|
||||||
|
* which downloads will be written.
|
||||||
|
* @param drmSessionManager An optional {@link DrmSessionManager}. Used to help determine which
|
||||||
|
* tracks can be selected.
|
||||||
|
* @param debugLoggingEnabled Whether to log debug information.
|
||||||
|
* @throws IllegalStateException If the corresponding module is missing for DASH, HLS or
|
||||||
|
* SmoothStreaming media items.
|
||||||
|
* @throws IllegalArgumentException If the {@code dataSourceFactory} is null for adaptive streams.
|
||||||
|
*/
|
||||||
|
public static DownloadHelper forMediaItem(
|
||||||
|
MediaItem mediaItem,
|
||||||
|
TrackSelectionParameters trackSelectionParameters,
|
||||||
|
@Nullable RenderersFactory renderersFactory,
|
||||||
|
@Nullable DataSource.Factory dataSourceFactory,
|
||||||
|
@Nullable DrmSessionManager drmSessionManager,
|
||||||
|
boolean debugLoggingEnabled) {
|
||||||
boolean isProgressive = isProgressive(checkNotNull(mediaItem.localConfiguration));
|
boolean isProgressive = isProgressive(checkNotNull(mediaItem.localConfiguration));
|
||||||
Assertions.checkArgument(isProgressive || dataSourceFactory != null);
|
Assertions.checkArgument(isProgressive || dataSourceFactory != null);
|
||||||
return new DownloadHelper(
|
return new DownloadHelper(
|
||||||
@ -303,7 +425,8 @@ public final class DownloadHelper {
|
|||||||
renderersFactory != null
|
renderersFactory != null
|
||||||
? new DefaultRendererCapabilitiesList.Factory(renderersFactory)
|
? new DefaultRendererCapabilitiesList.Factory(renderersFactory)
|
||||||
.createRendererCapabilitiesList()
|
.createRendererCapabilitiesList()
|
||||||
: new UnreleaseableRendererCapabilitiesList(new RendererCapabilities[0]));
|
: new UnreleaseableRendererCapabilitiesList(new RendererCapabilities[0]),
|
||||||
|
debugLoggingEnabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -340,6 +463,7 @@ public final class DownloadHelper {
|
|||||||
private final @Mode int mode;
|
private final @Mode int mode;
|
||||||
private final DefaultTrackSelector trackSelector;
|
private final DefaultTrackSelector trackSelector;
|
||||||
private final RendererCapabilitiesList rendererCapabilities;
|
private final RendererCapabilitiesList rendererCapabilities;
|
||||||
|
private final boolean debugLoggingEnabled;
|
||||||
private final SparseIntArray scratchSet;
|
private final SparseIntArray scratchSet;
|
||||||
private final Handler callbackHandler;
|
private final Handler callbackHandler;
|
||||||
private final Timeline.Window window;
|
private final Timeline.Window window;
|
||||||
@ -370,6 +494,32 @@ public final class DownloadHelper {
|
|||||||
@Nullable MediaSource mediaSource,
|
@Nullable MediaSource mediaSource,
|
||||||
TrackSelectionParameters trackSelectionParameters,
|
TrackSelectionParameters trackSelectionParameters,
|
||||||
RendererCapabilitiesList rendererCapabilities) {
|
RendererCapabilitiesList rendererCapabilities) {
|
||||||
|
this(
|
||||||
|
mediaItem,
|
||||||
|
mediaSource,
|
||||||
|
trackSelectionParameters,
|
||||||
|
rendererCapabilities,
|
||||||
|
/* debugLoggingEnabled= */ false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates download helper.
|
||||||
|
*
|
||||||
|
* @param mediaItem The media item.
|
||||||
|
* @param mediaSource A {@link MediaSource} for which tracks are selected, or null if no track
|
||||||
|
* selection needs to be made.
|
||||||
|
* @param trackSelectionParameters {@link TrackSelectionParameters} for selecting tracks for
|
||||||
|
* downloading.
|
||||||
|
* @param rendererCapabilities The {@link RendererCapabilitiesList} of the renderers for which
|
||||||
|
* tracks are selected.
|
||||||
|
* @param debugLoggingEnabled Whether to log debug information.
|
||||||
|
*/
|
||||||
|
public DownloadHelper(
|
||||||
|
MediaItem mediaItem,
|
||||||
|
@Nullable MediaSource mediaSource,
|
||||||
|
TrackSelectionParameters trackSelectionParameters,
|
||||||
|
RendererCapabilitiesList rendererCapabilities,
|
||||||
|
boolean debugLoggingEnabled) {
|
||||||
this.localConfiguration = checkNotNull(mediaItem.localConfiguration);
|
this.localConfiguration = checkNotNull(mediaItem.localConfiguration);
|
||||||
this.mediaSource = mediaSource;
|
this.mediaSource = mediaSource;
|
||||||
this.mode =
|
this.mode =
|
||||||
@ -381,6 +531,7 @@ public final class DownloadHelper {
|
|||||||
this.trackSelector =
|
this.trackSelector =
|
||||||
new DefaultTrackSelector(trackSelectionParameters, new DownloadTrackSelection.Factory());
|
new DefaultTrackSelector(trackSelectionParameters, new DownloadTrackSelection.Factory());
|
||||||
this.rendererCapabilities = rendererCapabilities;
|
this.rendererCapabilities = rendererCapabilities;
|
||||||
|
this.debugLoggingEnabled = debugLoggingEnabled;
|
||||||
this.scratchSet = new SparseIntArray();
|
this.scratchSet = new SparseIntArray();
|
||||||
trackSelector.init(/* listener= */ () -> {}, new FakeBandwidthMeter());
|
trackSelector.init(/* listener= */ () -> {}, new FakeBandwidthMeter());
|
||||||
callbackHandler = Util.createHandlerForCurrentOrMainLooper();
|
callbackHandler = Util.createHandlerForCurrentOrMainLooper();
|
||||||
@ -980,6 +1131,9 @@ public final class DownloadHelper {
|
|||||||
existingSelectionList.add(newSelection);
|
existingSelectionList.add(newSelection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (debugLoggingEnabled) {
|
||||||
|
logTrackSelectorResult(periodIndex, trackSelectorResult);
|
||||||
|
}
|
||||||
return trackSelectorResult;
|
return trackSelectorResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1003,6 +1157,32 @@ public final class DownloadHelper {
|
|||||||
== C.CONTENT_TYPE_OTHER;
|
== C.CONTENT_TYPE_OTHER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void logTrackSelectorResult(
|
||||||
|
int periodIndex, TrackSelectorResult trackSelectorResult) {
|
||||||
|
Log.d(TAG, "Track selections changed, period index: " + periodIndex + ", tracks [");
|
||||||
|
ImmutableList<Tracks.Group> trackGroups = trackSelectorResult.tracks.getGroups();
|
||||||
|
for (int groupIndex = 0; groupIndex < trackGroups.size(); groupIndex++) {
|
||||||
|
Tracks.Group trackGroup = trackGroups.get(groupIndex);
|
||||||
|
Log.d(TAG, " group [");
|
||||||
|
for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) {
|
||||||
|
String status = trackGroup.isTrackSelected(trackIndex) ? "[X]" : "[ ]";
|
||||||
|
String formatSupport = getFormatSupportString(trackGroup.getTrackSupport(trackIndex));
|
||||||
|
Log.d(
|
||||||
|
TAG,
|
||||||
|
" "
|
||||||
|
+ status
|
||||||
|
+ " Track:"
|
||||||
|
+ trackIndex
|
||||||
|
+ ", "
|
||||||
|
+ Format.toLogString(trackGroup.getTrackFormat(trackIndex))
|
||||||
|
+ ", supported="
|
||||||
|
+ formatSupport);
|
||||||
|
}
|
||||||
|
Log.d(TAG, " ]");
|
||||||
|
}
|
||||||
|
Log.d(TAG, "]");
|
||||||
|
}
|
||||||
|
|
||||||
private static final class MediaPreparer
|
private static final class MediaPreparer
|
||||||
implements MediaSourceCaller,
|
implements MediaSourceCaller,
|
||||||
ProgressiveMediaSource.Listener,
|
ProgressiveMediaSource.Listener,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user