mirror of
https://github.com/androidx/media.git
synced 2025-05-12 18:19:50 +08:00
Improve sniffer error reporting.
- Make UnrecognizedInputFormatException public so the app can more easily handle it when it is propagated to onPlayerError. - Format the description using the simple class names for the extractors. - Don't retry loading after it's thrown, but just throw immediately.
This commit is contained in:
parent
4c1fb0c977
commit
b44de0d250
@ -32,6 +32,7 @@ import com.google.android.exoplayer.upstream.DefaultAllocator;
|
|||||||
import com.google.android.exoplayer.upstream.Loader;
|
import com.google.android.exoplayer.upstream.Loader;
|
||||||
import com.google.android.exoplayer.upstream.Loader.Loadable;
|
import com.google.android.exoplayer.upstream.Loader.Loadable;
|
||||||
import com.google.android.exoplayer.util.Assertions;
|
import com.google.android.exoplayer.util.Assertions;
|
||||||
|
import com.google.android.exoplayer.util.Util;
|
||||||
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
@ -40,7 +41,6 @@ import android.util.SparseArray;
|
|||||||
import java.io.EOFException;
|
import java.io.EOFException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -70,6 +70,18 @@ import java.util.List;
|
|||||||
public class ExtractorSampleSource implements SampleSource, SampleSourceReader, ExtractorOutput,
|
public class ExtractorSampleSource implements SampleSource, SampleSourceReader, ExtractorOutput,
|
||||||
Loader.Callback {
|
Loader.Callback {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown if the input format could not recognized.
|
||||||
|
*/
|
||||||
|
public static final class UnrecognizedInputFormatException extends ParserException {
|
||||||
|
|
||||||
|
public UnrecognizedInputFormatException(Extractor[] extractors) {
|
||||||
|
super("None of the available extractors ("
|
||||||
|
+ Util.getCommaDelimitedSimpleClassNames(extractors) + ") could read the stream.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default minimum number of times to retry loading prior to failing for on-demand streams.
|
* The default minimum number of times to retry loading prior to failing for on-demand streams.
|
||||||
*/
|
*/
|
||||||
@ -401,6 +413,9 @@ public class ExtractorSampleSource implements SampleSource, SampleSourceReader,
|
|||||||
if (currentLoadableException == null) {
|
if (currentLoadableException == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (isCurrentLoadableExceptionFatal()) {
|
||||||
|
throw currentLoadableException;
|
||||||
|
}
|
||||||
int minLoadableRetryCountForMedia;
|
int minLoadableRetryCountForMedia;
|
||||||
if (minLoadableRetryCount != MIN_RETRY_COUNT_DEFAULT_FOR_MEDIA) {
|
if (minLoadableRetryCount != MIN_RETRY_COUNT_DEFAULT_FOR_MEDIA) {
|
||||||
minLoadableRetryCountForMedia = minLoadableRetryCount;
|
minLoadableRetryCountForMedia = minLoadableRetryCount;
|
||||||
@ -545,6 +560,9 @@ public class ExtractorSampleSource implements SampleSource, SampleSourceReader,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (currentLoadableException != null) {
|
if (currentLoadableException != null) {
|
||||||
|
if (isCurrentLoadableExceptionFatal()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
Assertions.checkState(loadable != null);
|
Assertions.checkState(loadable != null);
|
||||||
long elapsedMillis = SystemClock.elapsedRealtime() - currentLoadableExceptionTimestamp;
|
long elapsedMillis = SystemClock.elapsedRealtime() - currentLoadableExceptionTimestamp;
|
||||||
if (elapsedMillis >= getRetryDelayMillis(currentLoadableExceptionCount)) {
|
if (elapsedMillis >= getRetryDelayMillis(currentLoadableExceptionCount)) {
|
||||||
@ -642,6 +660,10 @@ public class ExtractorSampleSource implements SampleSource, SampleSourceReader,
|
|||||||
return pendingResetPositionUs != NO_RESET_PENDING;
|
return pendingResetPositionUs != NO_RESET_PENDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isCurrentLoadableExceptionFatal() {
|
||||||
|
return currentLoadableException instanceof UnrecognizedInputFormatException;
|
||||||
|
}
|
||||||
|
|
||||||
private long getRetryDelayMillis(long errorCount) {
|
private long getRetryDelayMillis(long errorCount) {
|
||||||
return Math.min((errorCount - 1) * 1000, 5000);
|
return Math.min((errorCount - 1) * 1000, 5000);
|
||||||
}
|
}
|
||||||
@ -791,15 +813,4 @@ public class ExtractorSampleSource implements SampleSource, SampleSourceReader,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Thrown if the input format could not recognized by {@link Extractor#sniff(ExtractorInput)}.
|
|
||||||
*/
|
|
||||||
private static final class UnrecognizedInputFormatException extends ParserException {
|
|
||||||
|
|
||||||
public UnrecognizedInputFormatException(Extractor[] extractors) {
|
|
||||||
super("None of the extractors " + Arrays.toString(extractors) + " could read the stream.");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -577,11 +577,28 @@ public final class Util {
|
|||||||
* @return A string containing the hex representation of the data provided.
|
* @return A string containing the hex representation of the data provided.
|
||||||
*/
|
*/
|
||||||
public static String getHexStringFromBytes(byte[] data, int beginIndex, int endIndex) {
|
public static String getHexStringFromBytes(byte[] data, int beginIndex, int endIndex) {
|
||||||
StringBuffer dataStringBuffer = new StringBuffer(endIndex - beginIndex);
|
StringBuilder dataStringBuilder = new StringBuilder(endIndex - beginIndex);
|
||||||
for (int i = beginIndex; i < endIndex; i++) {
|
for (int i = beginIndex; i < endIndex; i++) {
|
||||||
dataStringBuffer.append(String.format(Locale.US, "%02X", data[i]));
|
dataStringBuilder.append(String.format(Locale.US, "%02X", data[i]));
|
||||||
}
|
}
|
||||||
return dataStringBuffer.toString();
|
return dataStringBuilder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a string with comma delimited simple names of each object's class.
|
||||||
|
*
|
||||||
|
* @param objects The objects whose simple class names should be comma delimited and returned.
|
||||||
|
* @return A string with comma delimited simple names of each object's class.
|
||||||
|
*/
|
||||||
|
public static <T> String getCommaDelimitedSimpleClassNames(T[] objects) {
|
||||||
|
StringBuilder stringBuilder = new StringBuilder();
|
||||||
|
for (int i = 0; i < objects.length; i++) {
|
||||||
|
stringBuilder.append(objects[i].getClass().getSimpleName());
|
||||||
|
if (i < objects.length - 1) {
|
||||||
|
stringBuilder.append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return stringBuilder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user