Commit 879da812 by Oliver Woodman

Expose more sensible HLS track information.

- Video track is always marked as adaptive, the resolution is
  stripped out (since it's otherwise just set to whatever the
  resolution of the first selected variant is), and the max
  dimensions are set.

Issue #514
parent 0efaec59
...@@ -451,9 +451,9 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, ...@@ -451,9 +451,9 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
if (format.adaptive) { if (format.adaptive) {
return "auto"; return "auto";
} else if (MimeTypes.isVideo(format.mimeType)) { } else if (MimeTypes.isVideo(format.mimeType)) {
return format.width + "x" + format.height + buildBitrateString(format); return buildResolutionString(format) + buildBitrateString(format);
} else if (MimeTypes.isAudio(format.mimeType)) { } else if (MimeTypes.isAudio(format.mimeType)) {
return format.channelCount + "ch, " + format.sampleRate + "Hz" + buildBitrateString(format); return buildAudioPropertyString(format) + buildBitrateString(format);
} else if (MimeTypes.isText(format.mimeType) && !TextUtils.isEmpty(format.language)) { } else if (MimeTypes.isText(format.mimeType) && !TextUtils.isEmpty(format.language)) {
return format.language + buildBitrateString(format); return format.language + buildBitrateString(format);
} else { } else {
...@@ -461,6 +461,16 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, ...@@ -461,6 +461,16 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback,
} }
} }
private static String buildResolutionString(MediaFormat format) {
return format.width == MediaFormat.NO_VALUE || format.height == MediaFormat.NO_VALUE
? "video" : format.width + "x" + format.height;
}
private static String buildAudioPropertyString(MediaFormat format) {
return format.channelCount == MediaFormat.NO_VALUE || format.sampleRate == MediaFormat.NO_VALUE
? "audio" : format.channelCount + "ch, " + format.sampleRate + "Hz";
}
private static String buildBitrateString(MediaFormat format) { private static String buildBitrateString(MediaFormat format) {
return format.bitrate == MediaFormat.NO_VALUE ? "" return format.bitrate == MediaFormat.NO_VALUE ? ""
: String.format(Locale.US, " (%.2fMbit)", format.bitrate / 1000000f); : String.format(Locale.US, " (%.2fMbit)", format.bitrate / 1000000f);
......
...@@ -37,14 +37,10 @@ ...@@ -37,14 +37,10 @@
<string name="off">[off]</string> <string name="off">[off]</string>
<string name="on">[on]</string>
<string name="drm_error_not_supported">Protected content not supported on API levels below 18</string> <string name="drm_error_not_supported">Protected content not supported on API levels below 18</string>
<string name="drm_error_unsupported_scheme">This device does not support the required DRM scheme</string> <string name="drm_error_unsupported_scheme">This device does not support the required DRM scheme</string>
<string name="drm_error_unknown">An unknown DRM error occurred</string> <string name="drm_error_unknown">An unknown DRM error occurred</string>
<string name="failed">Playback failed</string>
</resources> </resources>
...@@ -235,9 +235,9 @@ public final class MediaFormat { ...@@ -235,9 +235,9 @@ public final class MediaFormat {
} }
public MediaFormat copyAsAdaptive() { public MediaFormat copyAsAdaptive() {
return new MediaFormat(mimeType, NO_VALUE, maxInputSize, durationUs, width, height, return new MediaFormat(mimeType, NO_VALUE, NO_VALUE, durationUs, NO_VALUE, NO_VALUE,
rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, language, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, null, OFFSET_SAMPLE_RELATIVE, null, true, maxWidth,
subsampleOffsetUs, initializationData, true, maxWidth, maxHeight); maxHeight);
} }
/** /**
......
...@@ -29,6 +29,7 @@ import com.google.android.exoplayer.chunk.Format; ...@@ -29,6 +29,7 @@ import com.google.android.exoplayer.chunk.Format;
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.MimeTypes;
import android.os.Handler; import android.os.Handler;
import android.os.SystemClock; import android.os.SystemClock;
...@@ -135,9 +136,12 @@ public final class HlsSampleSource implements SampleSource, SampleSourceReader, ...@@ -135,9 +136,12 @@ public final class HlsSampleSource implements SampleSource, SampleSourceReader,
pendingDiscontinuities = new boolean[trackCount]; pendingDiscontinuities = new boolean[trackCount];
downstreamMediaFormats = new MediaFormat[trackCount]; downstreamMediaFormats = new MediaFormat[trackCount];
mediaFormats = new MediaFormat[trackCount]; mediaFormats = new MediaFormat[trackCount];
long durationUs = chunkSource.getDurationUs();
for (int i = 0; i < trackCount; i++) { for (int i = 0; i < trackCount; i++) {
mediaFormats[i] = extractor.getMediaFormat(i).copyWithDurationUs( mediaFormats[i] = extractor.getMediaFormat(i).copyWithDurationUs(durationUs);
chunkSource.getDurationUs()); if (MimeTypes.isVideo(mediaFormats[i].mimeType)) {
mediaFormats[i] = chunkSource.getMaxVideoDimensions(mediaFormats[i]).copyAsAdaptive();
}
} }
prepared = true; prepared = true;
return true; return true;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment