diff --git a/README.md b/README.md
index 8755ac588d..13dfaddab3 100644
--- a/README.md
+++ b/README.md
@@ -38,8 +38,8 @@ repositories {
}
```
-Next add a gradle compile dependency to the `build.gradle` file of your app
-module. The following will add a dependency to the full library:
+Next add a dependency in the `build.gradle` file of your app module. The
+following will add a dependency to the full library:
```gradle
implementation 'com.google.android.exoplayer:exoplayer:2.X.X'
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java b/library/core/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java
index c2b3735265..79537e1c24 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java
@@ -1929,12 +1929,12 @@ public final class MatroskaExtractor implements Extractor {
/**
* Builds initialization data for a {@link Format} from FourCC codec private data.
- *
- * VC1 and H263 are the only supported compression types.
*
- * @return A pair object with the first object being the codec mime type
- * and the second object the initialization data for the {@link Format},
- * or null if the compression type is not a currently supported type (VC1 or H263).
+ *
VC1 and H263 are the only supported compression types.
+ *
+ * @return The codec mime type and initialization data. If the compression type is not supported
+ * then the mime type is set to {@link MimeTypes#VIDEO_UNKNOWN} and the initialization data
+ * is {@code null}.
* @throws ParserException If the initialization data could not be built.
*/
private static Pair> parseFourCcPrivate(ParsableByteArray buffer)
@@ -1944,14 +1944,16 @@ public final class MatroskaExtractor implements Extractor {
long compression = buffer.readLittleEndianUnsignedInt();
if (compression == FOURCC_COMPRESSION_DIVX) {
return new Pair<>(MimeTypes.VIDEO_H263, null);
- } else if (compression == FOURCC_COMPRESSION_VC1) {
+ } else if (compression == FOURCC_COMPRESSION_VC1) {
// Search for the initialization data from the end of the BITMAPINFOHEADER. The last 20
// bytes of which are: sizeImage(4), xPel/m (4), yPel/m (4), clrUsed(4), clrImportant(4).
int startOffset = buffer.getPosition() + 20;
byte[] bufferData = buffer.data;
for (int offset = startOffset; offset < bufferData.length - 4; offset++) {
- if (bufferData[offset] == 0x00 && bufferData[offset + 1] == 0x00
- && bufferData[offset + 2] == 0x01 && bufferData[offset + 3] == 0x0F) {
+ if (bufferData[offset] == 0x00
+ && bufferData[offset + 1] == 0x00
+ && bufferData[offset + 2] == 0x01
+ && bufferData[offset + 3] == 0x0F) {
// We've found the initialization data.
byte[] initializationData = Arrays.copyOfRange(bufferData, offset, bufferData.length);
return new Pair<>(MimeTypes.VIDEO_VC1, Collections.singletonList(initializationData));
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java
index 0a6bc062f1..a5656ec109 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadService.java
@@ -289,6 +289,7 @@ public abstract class DownloadService extends Service implements DownloadManager
@Override
public void onIdle(DownloadManager downloadManager) {
// Make sure startForeground is called before stopping.
+ // Workaround for https://buganizer.corp.google.com/issues/69424260
if (Util.SDK_INT >= 26) {
Builder notificationBuilder = new Builder(this, getNotificationChannelId());
Notification foregroundNotification = notificationBuilder.build();
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
index e8b7f00a56..d45b7182c4 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
@@ -614,8 +614,8 @@ public class DefaultHttpDataSource implements HttpDataSource {
}
String className = inputStream.getClass().getName();
if ("com.android.okhttp.internal.http.HttpTransport$ChunkedInputStream".equals(className)
- || "com.android.okhttp.internal.http.HttpTransport$FixedLengthInputStream".equals(
- className)) {
+ || "com.android.okhttp.internal.http.HttpTransport$FixedLengthInputStream"
+ .equals(className)) {
Class> superclass = inputStream.getClass().getSuperclass();
Method unexpectedEndOfInput = superclass.getDeclaredMethod("unexpectedEndOfInput");
unexpectedEndOfInput.setAccessible(true);
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java
index 1cac8958c4..df555b824a 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java
@@ -89,173 +89,207 @@ public class EventLogger
@Override
public void onLoadingChanged(boolean isLoading) {
- logd(TAG, "loading [" + isLoading + "]");
+ logd("loading [" + isLoading + "]");
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int state) {
- logd(TAG, "state [" + getSessionTimeString() + ", " + playWhenReady + ", "
- + getStateString(state) + "]");
+ logd(
+ "state ["
+ + getSessionTimeString()
+ + ", "
+ + playWhenReady
+ + ", "
+ + getStateString(state)
+ + "]");
}
@Override
public void onRepeatModeChanged(@Player.RepeatMode int repeatMode) {
- logd(TAG, "repeatMode [" + getRepeatModeString(repeatMode) + "]");
+ logd("repeatMode [" + getRepeatModeString(repeatMode) + "]");
}
@Override
public void onShuffleModeEnabledChanged(boolean shuffleModeEnabled) {
- logd(TAG, "shuffleModeEnabled [" + shuffleModeEnabled + "]");
+ logd("shuffleModeEnabled [" + shuffleModeEnabled + "]");
}
@Override
public void onPositionDiscontinuity(@Player.DiscontinuityReason int reason) {
- logd(TAG, "positionDiscontinuity [" + getDiscontinuityReasonString(reason) + "]");
+ logd("positionDiscontinuity [" + getDiscontinuityReasonString(reason) + "]");
}
@Override
public void onPlaybackParametersChanged(PlaybackParameters playbackParameters) {
- logd(TAG, "playbackParameters " + String.format(
- "[speed=%.2f, pitch=%.2f]", playbackParameters.speed, playbackParameters.pitch));
+ logd(
+ "playbackParameters "
+ + String.format(
+ "[speed=%.2f, pitch=%.2f]", playbackParameters.speed, playbackParameters.pitch));
}
@Override
- public void onTimelineChanged(Timeline timeline, Object manifest,
- @Player.TimelineChangeReason int reason) {
+ public void onTimelineChanged(
+ Timeline timeline, Object manifest, @Player.TimelineChangeReason int reason) {
int periodCount = timeline.getPeriodCount();
int windowCount = timeline.getWindowCount();
- logd(TAG, "timelineChanged [periodCount=" + periodCount + ", windowCount=" + windowCount
- + ", reason=" + getTimelineChangeReasonString(reason));
+ logd(
+ "timelineChanged [periodCount="
+ + periodCount
+ + ", windowCount="
+ + windowCount
+ + ", reason="
+ + getTimelineChangeReasonString(reason));
for (int i = 0; i < Math.min(periodCount, MAX_TIMELINE_ITEM_LINES); i++) {
timeline.getPeriod(i, period);
- logd(TAG, " " + "period [" + getTimeString(period.getDurationMs()) + "]");
+ logd(" " + "period [" + getTimeString(period.getDurationMs()) + "]");
}
if (periodCount > MAX_TIMELINE_ITEM_LINES) {
- logd(TAG, " ...");
+ logd(" ...");
}
for (int i = 0; i < Math.min(windowCount, MAX_TIMELINE_ITEM_LINES); i++) {
timeline.getWindow(i, window);
- logd(TAG, " " + "window [" + getTimeString(window.getDurationMs()) + ", "
- + window.isSeekable + ", " + window.isDynamic + "]");
+ logd(
+ " "
+ + "window ["
+ + getTimeString(window.getDurationMs())
+ + ", "
+ + window.isSeekable
+ + ", "
+ + window.isDynamic
+ + "]");
}
if (windowCount > MAX_TIMELINE_ITEM_LINES) {
- logd(TAG, " ...");
+ logd(" ...");
}
- logd(TAG, "]");
+ logd("]");
}
@Override
public void onPlayerError(ExoPlaybackException e) {
- loge(TAG, "playerFailed [" + getSessionTimeString() + "]", e);
+ loge("playerFailed [" + getSessionTimeString() + "]", e);
}
@Override
public void onTracksChanged(TrackGroupArray ignored, TrackSelectionArray trackSelections) {
MappedTrackInfo mappedTrackInfo = trackSelector.getCurrentMappedTrackInfo();
if (mappedTrackInfo == null) {
- logd(TAG, "Tracks []");
+ logd("Tracks []");
return;
}
- logd(TAG, "Tracks [");
+ logd("Tracks [");
// Log tracks associated to renderers.
for (int rendererIndex = 0; rendererIndex < mappedTrackInfo.length; rendererIndex++) {
TrackGroupArray rendererTrackGroups = mappedTrackInfo.getTrackGroups(rendererIndex);
TrackSelection trackSelection = trackSelections.get(rendererIndex);
if (rendererTrackGroups.length > 0) {
- logd(TAG, " Renderer:" + rendererIndex + " [");
+ logd(" Renderer:" + rendererIndex + " [");
for (int groupIndex = 0; groupIndex < rendererTrackGroups.length; groupIndex++) {
TrackGroup trackGroup = rendererTrackGroups.get(groupIndex);
- String adaptiveSupport = getAdaptiveSupportString(trackGroup.length,
- mappedTrackInfo.getAdaptiveSupport(rendererIndex, groupIndex, false));
- logd(TAG, " Group:" + groupIndex + ", adaptive_supported=" + adaptiveSupport + " [");
+ String adaptiveSupport =
+ getAdaptiveSupportString(
+ trackGroup.length,
+ mappedTrackInfo.getAdaptiveSupport(rendererIndex, groupIndex, false));
+ logd(" Group:" + groupIndex + ", adaptive_supported=" + adaptiveSupport + " [");
for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) {
String status = getTrackStatusString(trackSelection, trackGroup, trackIndex);
- String formatSupport = getFormatSupportString(
- mappedTrackInfo.getTrackFormatSupport(rendererIndex, groupIndex, trackIndex));
- logd(TAG, " " + status + " Track:" + trackIndex + ", "
- + Format.toLogString(trackGroup.getFormat(trackIndex))
- + ", supported=" + formatSupport);
+ String formatSupport =
+ getFormatSupportString(
+ mappedTrackInfo.getTrackFormatSupport(rendererIndex, groupIndex, trackIndex));
+ logd(
+ " "
+ + status
+ + " Track:"
+ + trackIndex
+ + ", "
+ + Format.toLogString(trackGroup.getFormat(trackIndex))
+ + ", supported="
+ + formatSupport);
}
- logd(TAG, " ]");
+ logd(" ]");
}
// Log metadata for at most one of the tracks selected for the renderer.
if (trackSelection != null) {
for (int selectionIndex = 0; selectionIndex < trackSelection.length(); selectionIndex++) {
Metadata metadata = trackSelection.getFormat(selectionIndex).metadata;
if (metadata != null) {
- logd(TAG, " Metadata [");
+ logd(" Metadata [");
printMetadata(metadata, " ");
- logd(TAG, " ]");
+ logd(" ]");
break;
}
}
}
- logd(TAG, " ]");
+ logd(" ]");
}
}
// Log tracks not associated with a renderer.
TrackGroupArray unassociatedTrackGroups = mappedTrackInfo.getUnassociatedTrackGroups();
if (unassociatedTrackGroups.length > 0) {
- logd(TAG, " Renderer:None [");
+ logd(" Renderer:None [");
for (int groupIndex = 0; groupIndex < unassociatedTrackGroups.length; groupIndex++) {
- logd(TAG, " Group:" + groupIndex + " [");
+ logd(" Group:" + groupIndex + " [");
TrackGroup trackGroup = unassociatedTrackGroups.get(groupIndex);
for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) {
String status = getTrackStatusString(false);
- String formatSupport = getFormatSupportString(
- RendererCapabilities.FORMAT_UNSUPPORTED_TYPE);
- logd(TAG, " " + status + " Track:" + trackIndex + ", "
- + Format.toLogString(trackGroup.getFormat(trackIndex))
- + ", supported=" + formatSupport);
+ String formatSupport =
+ getFormatSupportString(RendererCapabilities.FORMAT_UNSUPPORTED_TYPE);
+ logd(
+ " "
+ + status
+ + " Track:"
+ + trackIndex
+ + ", "
+ + Format.toLogString(trackGroup.getFormat(trackIndex))
+ + ", supported="
+ + formatSupport);
}
- logd(TAG, " ]");
+ logd(" ]");
}
- logd(TAG, " ]");
+ logd(" ]");
}
- logd(TAG, "]");
+ logd("]");
}
@Override
public void onSeekProcessed() {
- logd(TAG, "seekProcessed");
+ logd("seekProcessed");
}
// MetadataOutput
@Override
public void onMetadata(Metadata metadata) {
- logd(TAG, "onMetadata [");
+ logd("onMetadata [");
printMetadata(metadata, " ");
- logd(TAG, "]");
+ logd("]");
}
// AudioRendererEventListener
@Override
public void onAudioEnabled(DecoderCounters counters) {
- logd(TAG, "audioEnabled [" + getSessionTimeString() + "]");
+ logd("audioEnabled [" + getSessionTimeString() + "]");
}
@Override
public void onAudioSessionId(int audioSessionId) {
- logd(TAG, "audioSessionId [" + audioSessionId + "]");
+ logd("audioSessionId [" + audioSessionId + "]");
}
@Override
- public void onAudioDecoderInitialized(String decoderName, long elapsedRealtimeMs,
- long initializationDurationMs) {
- logd(TAG, "audioDecoderInitialized [" + getSessionTimeString() + ", " + decoderName + "]");
+ public void onAudioDecoderInitialized(
+ String decoderName, long elapsedRealtimeMs, long initializationDurationMs) {
+ logd("audioDecoderInitialized [" + getSessionTimeString() + ", " + decoderName + "]");
}
@Override
public void onAudioInputFormatChanged(Format format) {
- logd(TAG, "audioFormatChanged [" + getSessionTimeString() + ", " + Format.toLogString(format)
- + "]");
+ logd("audioFormatChanged [" + getSessionTimeString() + ", " + Format.toLogString(format) + "]");
}
@Override
public void onAudioDisabled(DecoderCounters counters) {
- logd(TAG, "audioDisabled [" + getSessionTimeString() + "]");
+ logd("audioDisabled [" + getSessionTimeString() + "]");
}
@Override
@@ -268,40 +302,39 @@ public class EventLogger
@Override
public void onVideoEnabled(DecoderCounters counters) {
- logd(TAG, "videoEnabled [" + getSessionTimeString() + "]");
+ logd("videoEnabled [" + getSessionTimeString() + "]");
}
@Override
- public void onVideoDecoderInitialized(String decoderName, long elapsedRealtimeMs,
- long initializationDurationMs) {
- logd(TAG, "videoDecoderInitialized [" + getSessionTimeString() + ", " + decoderName + "]");
+ public void onVideoDecoderInitialized(
+ String decoderName, long elapsedRealtimeMs, long initializationDurationMs) {
+ logd("videoDecoderInitialized [" + getSessionTimeString() + ", " + decoderName + "]");
}
@Override
public void onVideoInputFormatChanged(Format format) {
- logd(TAG, "videoFormatChanged [" + getSessionTimeString() + ", " + Format.toLogString(format)
- + "]");
+ logd("videoFormatChanged [" + getSessionTimeString() + ", " + Format.toLogString(format) + "]");
}
@Override
public void onVideoDisabled(DecoderCounters counters) {
- logd(TAG, "videoDisabled [" + getSessionTimeString() + "]");
+ logd("videoDisabled [" + getSessionTimeString() + "]");
}
@Override
public void onDroppedFrames(int count, long elapsed) {
- logd(TAG, "droppedFrames [" + getSessionTimeString() + ", " + count + "]");
+ logd("droppedFrames [" + getSessionTimeString() + ", " + count + "]");
}
@Override
- public void onVideoSizeChanged(int width, int height, int unappliedRotationDegrees,
- float pixelWidthHeightRatio) {
- logd(TAG, "videoSizeChanged [" + width + ", " + height + "]");
+ public void onVideoSizeChanged(
+ int width, int height, int unappliedRotationDegrees, float pixelWidthHeightRatio) {
+ logd("videoSizeChanged [" + width + ", " + height + "]");
}
@Override
public void onRenderedFirstFrame(Surface surface) {
- logd(TAG, "renderedFirstFrame [" + surface + "]");
+ logd("renderedFirstFrame [" + surface + "]");
}
// DefaultDrmSessionManager.EventListener
@@ -313,17 +346,17 @@ public class EventLogger
@Override
public void onDrmKeysRestored() {
- logd(TAG, "drmKeysRestored [" + getSessionTimeString() + "]");
+ logd("drmKeysRestored [" + getSessionTimeString() + "]");
}
@Override
public void onDrmKeysRemoved() {
- logd(TAG, "drmKeysRemoved [" + getSessionTimeString() + "]");
+ logd("drmKeysRemoved [" + getSessionTimeString() + "]");
}
@Override
public void onDrmKeysLoaded() {
- logd(TAG, "drmKeysLoaded [" + getSessionTimeString() + "]");
+ logd("drmKeysLoaded [" + getSessionTimeString() + "]");
}
// MediaSourceEventListener
@@ -397,10 +430,29 @@ public class EventLogger
// Do nothing.
}
+ /**
+ * Logs a debug message.
+ *
+ * @param msg The message to log.
+ */
+ protected void logd(String msg) {
+ Log.d(TAG, msg);
+ }
+
+ /**
+ * Logs an error message and exception.
+ *
+ * @param msg The message to log.
+ * @param tr The exception to log.
+ */
+ protected void loge(String msg, Throwable tr) {
+ Log.e(TAG, msg, tr);
+ }
+
// Internal methods
private void printInternalError(String type, Exception e) {
- loge(TAG, "internalError [" + getSessionTimeString() + ", " + type + "]", e);
+ loge("internalError [" + getSessionTimeString() + ", " + type + "]", e);
}
private void printMetadata(Metadata metadata, String prefix) {
@@ -408,37 +460,51 @@ public class EventLogger
Metadata.Entry entry = metadata.get(i);
if (entry instanceof TextInformationFrame) {
TextInformationFrame textInformationFrame = (TextInformationFrame) entry;
- logd(TAG, prefix + String.format("%s: value=%s", textInformationFrame.id,
- textInformationFrame.value));
+ logd(
+ prefix
+ + String.format(
+ "%s: value=%s", textInformationFrame.id, textInformationFrame.value));
} else if (entry instanceof UrlLinkFrame) {
UrlLinkFrame urlLinkFrame = (UrlLinkFrame) entry;
- logd(TAG, prefix + String.format("%s: url=%s", urlLinkFrame.id, urlLinkFrame.url));
+ logd(prefix + String.format("%s: url=%s", urlLinkFrame.id, urlLinkFrame.url));
} else if (entry instanceof PrivFrame) {
PrivFrame privFrame = (PrivFrame) entry;
- logd(TAG, prefix + String.format("%s: owner=%s", privFrame.id, privFrame.owner));
+ logd(prefix + String.format("%s: owner=%s", privFrame.id, privFrame.owner));
} else if (entry instanceof GeobFrame) {
GeobFrame geobFrame = (GeobFrame) entry;
- logd(TAG, prefix + String.format("%s: mimeType=%s, filename=%s, description=%s",
- geobFrame.id, geobFrame.mimeType, geobFrame.filename, geobFrame.description));
+ logd(
+ prefix
+ + String.format(
+ "%s: mimeType=%s, filename=%s, description=%s",
+ geobFrame.id, geobFrame.mimeType, geobFrame.filename, geobFrame.description));
} else if (entry instanceof ApicFrame) {
ApicFrame apicFrame = (ApicFrame) entry;
- logd(TAG, prefix + String.format("%s: mimeType=%s, description=%s",
- apicFrame.id, apicFrame.mimeType, apicFrame.description));
+ logd(
+ prefix
+ + String.format(
+ "%s: mimeType=%s, description=%s",
+ apicFrame.id, apicFrame.mimeType, apicFrame.description));
} else if (entry instanceof CommentFrame) {
CommentFrame commentFrame = (CommentFrame) entry;
- logd(TAG, prefix + String.format("%s: language=%s, description=%s", commentFrame.id,
- commentFrame.language, commentFrame.description));
+ logd(
+ prefix
+ + String.format(
+ "%s: language=%s, description=%s",
+ commentFrame.id, commentFrame.language, commentFrame.description));
} else if (entry instanceof Id3Frame) {
Id3Frame id3Frame = (Id3Frame) entry;
- logd(TAG, prefix + String.format("%s", id3Frame.id));
+ logd(prefix + id3Frame.id);
} else if (entry instanceof EventMessage) {
EventMessage eventMessage = (EventMessage) entry;
- logd(TAG, prefix + String.format("EMSG: scheme=%s, id=%d, value=%s",
- eventMessage.schemeIdUri, eventMessage.id, eventMessage.value));
+ logd(
+ prefix
+ + String.format(
+ "EMSG: scheme=%s, id=%d, value=%s",
+ eventMessage.schemeIdUri, eventMessage.id, eventMessage.value));
} else if (entry instanceof SpliceCommand) {
String description =
String.format("SCTE-35 splice command: type=%s.", entry.getClass().getSimpleName());
- logd(TAG, prefix + description);
+ logd(prefix + description);
}
}
}
@@ -555,11 +621,4 @@ public class EventLogger
}
}
- protected void logd(String tag, String msg) {
- Log.d(tag, msg);
- }
-
- protected void loge(String tag, String msg, Throwable tr) {
- Log.e(tag, msg, tr);
- }
}