From 42351d31273e18b288197bebbeb6a18587dc3ae8 Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Tue, 20 Oct 2015 13:59:10 -0400 Subject: [PATCH 1/6] Added id property to MediaFormat Added the property 'id' to the MediaFormat class which serves as an identifier for the track. DASH Representations will have the "id's" from their Media Presentation Description mapped to the id property in the MediaFormat class that will represent the track. We needed this for an use case where we wanted to read the 'id' value from the DASH representation and present it to the user in order for the user to select the right track. --- .../demo/MediaFormatIdTextViewHelper.java | 7 ++++ .../android/exoplayer/MediaFormatTest.java | 12 +++--- .../exoplayer/FrameworkSampleSource.java | 2 +- .../google/android/exoplayer/MediaFormat.java | 40 ++++++++++--------- .../exoplayer/dash/DashChunkSource.java | 11 ++--- .../exoplayer/extractor/mp3/Mp3Extractor.java | 2 +- .../exoplayer/extractor/mp4/AtomParsers.java | 12 +++--- .../exoplayer/extractor/ts/AdtsReader.java | 2 +- .../exoplayer/extractor/ts/H264Reader.java | 2 +- .../exoplayer/extractor/ts/H265Reader.java | 2 +- .../exoplayer/extractor/ts/Id3Reader.java | 2 +- .../extractor/ts/MpegAudioReader.java | 2 +- .../exoplayer/extractor/ts/SeiReader.java | 2 +- .../extractor/webm/WebmExtractor.java | 8 ++-- .../SmoothStreamingChunkSource.java | 6 +-- .../android/exoplayer/util/Ac3Util.java | 6 +-- 16 files changed, 66 insertions(+), 52 deletions(-) create mode 100644 demo/src/main/java/com/google/android/exoplayer/demo/MediaFormatIdTextViewHelper.java diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/MediaFormatIdTextViewHelper.java b/demo/src/main/java/com/google/android/exoplayer/demo/MediaFormatIdTextViewHelper.java new file mode 100644 index 0000000000..a437dcfd52 --- /dev/null +++ b/demo/src/main/java/com/google/android/exoplayer/demo/MediaFormatIdTextViewHelper.java @@ -0,0 +1,7 @@ +package com.google.android.exoplayer.demo; + +/** + * @author Rik Heijdens + */ +public class MediaFormatIdTextViewHelper { +} diff --git a/library/src/androidTest/java/com/google/android/exoplayer/MediaFormatTest.java b/library/src/androidTest/java/com/google/android/exoplayer/MediaFormatTest.java index a22bc07567..d0004b704e 100644 --- a/library/src/androidTest/java/com/google/android/exoplayer/MediaFormatTest.java +++ b/library/src/androidTest/java/com/google/android/exoplayer/MediaFormatTest.java @@ -45,20 +45,20 @@ public final class MediaFormatTest extends TestCase { initData.add(initData2); testConversionToFrameworkFormatV16(MediaFormat.createVideoFormat( - MediaFormat.NO_VALUE, "video/xyz", 5000, 102400, 1000L, 1280, 720, initData)); + null, MediaFormat.NO_VALUE, "video/xyz", 5000, 102400, 1000L, 1280, 720, initData)); testConversionToFrameworkFormatV16(MediaFormat.createVideoFormat( - MediaFormat.NO_VALUE, "video/xyz", 5000, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, 1280, 720, + null, MediaFormat.NO_VALUE, "video/xyz", 5000, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, 1280, 720, null)); testConversionToFrameworkFormatV16(MediaFormat.createAudioFormat( - MediaFormat.NO_VALUE, "audio/xyz", 500, 128, 1000L, 5, 44100, initData, null)); + null, MediaFormat.NO_VALUE, "audio/xyz", 500, 128, 1000L, 5, 44100, initData, null)); testConversionToFrameworkFormatV16(MediaFormat.createAudioFormat( - MediaFormat.NO_VALUE, "audio/xyz", 500, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, 5, 44100, + null, MediaFormat.NO_VALUE, "audio/xyz", 500, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, 5, 44100, null, null)); testConversionToFrameworkFormatV16( - MediaFormat.createTextFormat(MediaFormat.NO_VALUE, "text/xyz", MediaFormat.NO_VALUE, 1000L, + MediaFormat.createTextFormat(null, MediaFormat.NO_VALUE, "text/xyz", MediaFormat.NO_VALUE, 1000L, "eng")); testConversionToFrameworkFormatV16( - MediaFormat.createTextFormat(MediaFormat.NO_VALUE, "text/xyz", MediaFormat.NO_VALUE, + MediaFormat.createTextFormat(null, MediaFormat.NO_VALUE, "text/xyz", MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, null)); } diff --git a/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java b/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java index 6c0cf25b7a..23bd7ce1c6 100644 --- a/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java @@ -315,7 +315,7 @@ public final class FrameworkSampleSource implements SampleSource, SampleSourceRe } long durationUs = format.containsKey(android.media.MediaFormat.KEY_DURATION) ? format.getLong(android.media.MediaFormat.KEY_DURATION) : C.UNKNOWN_TIME_US; - MediaFormat mediaFormat = new MediaFormat(MediaFormat.NO_VALUE, mimeType, MediaFormat.NO_VALUE, + MediaFormat mediaFormat = new MediaFormat(null, MediaFormat.NO_VALUE, mimeType, MediaFormat.NO_VALUE, maxInputSize, durationUs, width, height, rotationDegrees, MediaFormat.NO_VALUE, channelCount, sampleRate, language, MediaFormat.OFFSET_SAMPLE_RELATIVE, initializationData, false, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE); diff --git a/library/src/main/java/com/google/android/exoplayer/MediaFormat.java b/library/src/main/java/com/google/android/exoplayer/MediaFormat.java index be21897c55..d7e6e0c8d9 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaFormat.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaFormat.java @@ -38,7 +38,10 @@ public final class MediaFormat { * the timestamps of their parent samples. */ public static final long OFFSET_SAMPLE_RELATIVE = Long.MAX_VALUE; - + /** + * An identifier for the format. + */ + public final String id; /** * The identifier for the track represented by the format, or {@link #NO_VALUE} if unknown or not * applicable. @@ -139,52 +142,53 @@ public final class MediaFormat { private int hashCode; private android.media.MediaFormat frameworkMediaFormat; - public static MediaFormat createVideoFormat(int trackId, String mimeType, int bitrate, + public static MediaFormat createVideoFormat(String id, int trackId, String mimeType, int bitrate, int maxInputSize, long durationUs, int width, int height, List initializationData) { - return createVideoFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return createVideoFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, initializationData, NO_VALUE, NO_VALUE); } - public static MediaFormat createVideoFormat(int trackId, String mimeType, int bitrate, + public static MediaFormat createVideoFormat(String id, int trackId, String mimeType, int bitrate, int maxInputSize, long durationUs, int width, int height, List initializationData, int rotationDegrees, float pixelWidthHeightRatio) { - return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, rotationDegrees, pixelWidthHeightRatio, NO_VALUE, NO_VALUE, null, OFFSET_SAMPLE_RELATIVE, initializationData, false, NO_VALUE, NO_VALUE); } - public static MediaFormat createAudioFormat(int trackId, String mimeType, int bitrate, + public static MediaFormat createAudioFormat(String id, int trackId, String mimeType, int bitrate, int maxInputSize, long durationUs, int channelCount, int sampleRate, List initializationData, String language) { - return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, NO_VALUE, NO_VALUE, + return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, channelCount, sampleRate, language, OFFSET_SAMPLE_RELATIVE, initializationData, false, NO_VALUE, NO_VALUE); } - public static MediaFormat createTextFormat(int trackId, String mimeType, int bitrate, + public static MediaFormat createTextFormat(String id, int trackId, String mimeType, int bitrate, long durationUs, String language) { - return createTextFormat(trackId, mimeType, bitrate, durationUs, language, + return createTextFormat(id, trackId, mimeType, bitrate, durationUs, language, OFFSET_SAMPLE_RELATIVE); } - public static MediaFormat createTextFormat(int trackId, String mimeType, int bitrate, + public static MediaFormat createTextFormat(String id, int trackId, String mimeType, int bitrate, long durationUs, String language, long subsampleOffsetUs) { - return new MediaFormat(trackId, mimeType, bitrate, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, + return new MediaFormat(id, trackId, mimeType, bitrate, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, language, subsampleOffsetUs, null, false, NO_VALUE, NO_VALUE); } - public static MediaFormat createFormatForMimeType(int trackId, String mimeType, int bitrate, + public static MediaFormat createFormatForMimeType(String id, int trackId, String mimeType, int bitrate, long durationUs) { - return new MediaFormat(trackId, mimeType, bitrate, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, + return new MediaFormat(id, trackId, mimeType, bitrate, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, null, OFFSET_SAMPLE_RELATIVE, null, false, NO_VALUE, NO_VALUE); } - /* package */ MediaFormat(int trackId, String mimeType, int bitrate, int maxInputSize, + /* package */ MediaFormat(String id, int trackId, String mimeType, int bitrate, int maxInputSize, long durationUs, int width, int height, int rotationDegrees, float pixelWidthHeightRatio, int channelCount, int sampleRate, String language, long subsampleOffsetUs, List initializationData, boolean adaptive, int maxWidth, int maxHeight) { + this.id = id; this.trackId = trackId; this.mimeType = Assertions.checkNotEmpty(mimeType); this.bitrate = bitrate; @@ -206,25 +210,25 @@ public final class MediaFormat { } public MediaFormat copyWithMaxVideoDimensions(int maxWidth, int maxHeight) { - return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, language, subsampleOffsetUs, initializationData, adaptive, maxWidth, maxHeight); } public MediaFormat copyWithSubsampleOffsetUs(long subsampleOffsetUs) { - return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, language, subsampleOffsetUs, initializationData, adaptive, maxWidth, maxHeight); } public MediaFormat copyWithDurationUs(long durationUs) { - return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, language, subsampleOffsetUs, initializationData, adaptive, maxWidth, maxHeight); } public MediaFormat copyAsAdaptive() { - return new MediaFormat(trackId, mimeType, NO_VALUE, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, + return new MediaFormat(id, trackId, mimeType, NO_VALUE, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, null, OFFSET_SAMPLE_RELATIVE, null, true, maxWidth, maxHeight); } diff --git a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java index 1f72d1218c..4f2672daab 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java @@ -608,14 +608,14 @@ public class DashChunkSource implements ChunkSource, Output { String mediaMimeType, long durationUs) { switch (adaptationSetType) { case AdaptationSet.TYPE_VIDEO: - return MediaFormat.createVideoFormat(MediaFormat.NO_VALUE, mediaMimeType, format.bitrate, + return MediaFormat.createVideoFormat(format.id, MediaFormat.NO_VALUE, mediaMimeType, format.bitrate, MediaFormat.NO_VALUE, durationUs, format.width, format.height, null); case AdaptationSet.TYPE_AUDIO: - return MediaFormat.createAudioFormat(MediaFormat.NO_VALUE, mediaMimeType, format.bitrate, + return MediaFormat.createAudioFormat(format.id, MediaFormat.NO_VALUE, mediaMimeType, format.bitrate, MediaFormat.NO_VALUE, durationUs, format.audioChannels, format.audioSamplingRate, null, format.language); case AdaptationSet.TYPE_TEXT: - return MediaFormat.createTextFormat(MediaFormat.NO_VALUE, mediaMimeType, format.bitrate, + return MediaFormat.createTextFormat(format.id, MediaFormat.NO_VALUE, mediaMimeType, format.bitrate, durationUs, format.language); default: return null; @@ -846,6 +846,7 @@ public class DashChunkSource implements ChunkSource, Output { public ExposedTrack(MediaFormat trackFormat, int adaptationSetIndex, Format fixedFormat) { this.trackFormat = trackFormat; + this.adaptationSetIndex = adaptationSetIndex; this.fixedFormat = fixedFormat; this.adaptiveFormats = null; @@ -865,9 +866,9 @@ public class DashChunkSource implements ChunkSource, Output { public boolean isAdaptive() { return adaptiveFormats != null; - } - } + } + } private static final class RepresentationHolder { diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java index bbc717fd9e..b7b013b5fa 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java @@ -332,7 +332,7 @@ public final class Mp3Extractor implements Extractor { if (seeker == null) { setupSeeker(extractorInput, headerPosition); extractorOutput.seekMap(seeker); - trackOutput.format(MediaFormat.createAudioFormat(MediaFormat.NO_VALUE, + trackOutput.format(MediaFormat.createAudioFormat(null, MediaFormat.NO_VALUE, synchronizedHeader.mimeType, MediaFormat.NO_VALUE, MpegAudioHeader.MAX_FRAME_SIZE_BYTES, seeker.getDurationUs(), synchronizedHeader.channels, synchronizedHeader.sampleRate, null, null)); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java index 7028cf5159..91399644e7 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java @@ -383,13 +383,13 @@ import java.util.List; parseAudioSampleEntry(stsd, childAtomType, childStartPosition, childAtomSize, trackId, durationUs, language, out, i); } else if (childAtomType == Atom.TYPE_TTML) { - out.mediaFormat = MediaFormat.createTextFormat(trackId, MimeTypes.APPLICATION_TTML, + out.mediaFormat = MediaFormat.createTextFormat(null, trackId, MimeTypes.APPLICATION_TTML, MediaFormat.NO_VALUE, durationUs, language); } else if (childAtomType == Atom.TYPE_tx3g) { - out.mediaFormat = MediaFormat.createTextFormat(trackId, MimeTypes.APPLICATION_TX3G, + out.mediaFormat = MediaFormat.createTextFormat(null, trackId, MimeTypes.APPLICATION_TX3G, MediaFormat.NO_VALUE, durationUs, language); } else if (childAtomType == Atom.TYPE_stpp) { - out.mediaFormat = MediaFormat.createTextFormat(trackId, MimeTypes.APPLICATION_TTML, + out.mediaFormat = MediaFormat.createTextFormat(null, trackId, MimeTypes.APPLICATION_TTML, MediaFormat.NO_VALUE, durationUs, language, 0 /* subsample timing is absolute */); } stsd.setPosition(childStartPosition + childAtomSize); @@ -460,7 +460,7 @@ import java.util.List; return; } - out.mediaFormat = MediaFormat.createVideoFormat(trackId, mimeType, MediaFormat.NO_VALUE, + out.mediaFormat = MediaFormat.createVideoFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, durationUs, width, height, initializationData, rotationDegrees, pixelWidthHeightRatio); } @@ -649,7 +649,7 @@ import java.util.List; } else if ((atomType == Atom.TYPE_dtsc || atomType == Atom.TYPE_dtse || atomType == Atom.TYPE_dtsh || atomType == Atom.TYPE_dtsl) && childAtomType == Atom.TYPE_ddts) { - out.mediaFormat = MediaFormat.createAudioFormat(trackId, mimeType, MediaFormat.NO_VALUE, + out.mediaFormat = MediaFormat.createAudioFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, durationUs, channelCount, sampleRate, null, language); return; } @@ -661,7 +661,7 @@ import java.util.List; return; } - out.mediaFormat = MediaFormat.createAudioFormat(trackId, mimeType, MediaFormat.NO_VALUE, + out.mediaFormat = MediaFormat.createAudioFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, sampleSize, durationUs, channelCount, sampleRate, initializationData == null ? null : Collections.singletonList(initializationData), language); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsReader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsReader.java index cbdc58872a..88bce4b159 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsReader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsReader.java @@ -170,7 +170,7 @@ import java.util.Collections; Pair audioParams = CodecSpecificDataUtil.parseAacAudioSpecificConfig( audioSpecificConfig); - MediaFormat mediaFormat = MediaFormat.createAudioFormat(MediaFormat.NO_VALUE, + MediaFormat mediaFormat = MediaFormat.createAudioFormat(null, MediaFormat.NO_VALUE, MimeTypes.AUDIO_AAC, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, audioParams.second, audioParams.first, Collections.singletonList(audioSpecificConfig), null); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/H264Reader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/H264Reader.java index 848e40b29d..30c4a8bf5c 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/H264Reader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/H264Reader.java @@ -210,7 +210,7 @@ import java.util.List; SpsData parsedSpsData = CodecSpecificDataUtil.parseSpsNalUnit(bitArray); // Construct and output the format. - output.format(MediaFormat.createVideoFormat(MediaFormat.NO_VALUE, MimeTypes.VIDEO_H264, + output.format(MediaFormat.createVideoFormat(null, MediaFormat.NO_VALUE, MimeTypes.VIDEO_H264, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, parsedSpsData.width, parsedSpsData.height, initializationData, MediaFormat.NO_VALUE, parsedSpsData.pixelWidthAspectRatio)); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/H265Reader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/H265Reader.java index 0927ffa3b4..2d3482e69a 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/H265Reader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/H265Reader.java @@ -294,7 +294,7 @@ import java.util.Collections; } } - output.format(MediaFormat.createVideoFormat(MediaFormat.NO_VALUE, MimeTypes.VIDEO_H265, + output.format(MediaFormat.createVideoFormat(null, MediaFormat.NO_VALUE, MimeTypes.VIDEO_H265, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, picWidthInLumaSamples, picHeightInLumaSamples, Collections.singletonList(csd), MediaFormat.NO_VALUE, pixelWidthHeightRatio)); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/Id3Reader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/Id3Reader.java index 553aae6499..740a2e5e9a 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/Id3Reader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/Id3Reader.java @@ -35,7 +35,7 @@ import com.google.android.exoplayer.util.ParsableByteArray; public Id3Reader(TrackOutput output) { super(output); - output.format(MediaFormat.createFormatForMimeType(MediaFormat.NO_VALUE, + output.format(MediaFormat.createFormatForMimeType(null, MediaFormat.NO_VALUE, MimeTypes.APPLICATION_ID3, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US)); } diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/MpegAudioReader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/MpegAudioReader.java index 8e268e53fe..a9563e130a 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/MpegAudioReader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/MpegAudioReader.java @@ -160,7 +160,7 @@ import com.google.android.exoplayer.util.ParsableByteArray; frameSize = header.frameSize; if (!hasOutputFormat) { frameDurationUs = (C.MICROS_PER_SECOND * header.samplesPerFrame) / header.sampleRate; - MediaFormat mediaFormat = MediaFormat.createAudioFormat(MediaFormat.NO_VALUE, header.mimeType, + MediaFormat mediaFormat = MediaFormat.createAudioFormat(null, MediaFormat.NO_VALUE, header.mimeType, MediaFormat.NO_VALUE, MpegAudioHeader.MAX_FRAME_SIZE_BYTES, C.UNKNOWN_TIME_US, header.channels, header.sampleRate, null, null); output.format(mediaFormat); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/SeiReader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/SeiReader.java index 81378d1685..b33595d64e 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/SeiReader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/SeiReader.java @@ -32,7 +32,7 @@ import com.google.android.exoplayer.util.ParsableByteArray; public SeiReader(TrackOutput output) { super(output); - output.format(MediaFormat.createTextFormat(MediaFormat.NO_VALUE, MimeTypes.APPLICATION_EIA608, + output.format(MediaFormat.createTextFormat(null, MediaFormat.NO_VALUE, MimeTypes.APPLICATION_EIA608, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, null)); } diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java index 771fe1e90b..1ca8ec9032 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java @@ -1209,14 +1209,16 @@ public final class WebmExtractor implements Extractor { } MediaFormat format; + // TODO: Read the name of the track from the header of the webm container and + // supply this as id instead of 'null' if (MimeTypes.isAudio(mimeType)) { - format = MediaFormat.createAudioFormat(trackId, mimeType, MediaFormat.NO_VALUE, + format = MediaFormat.createAudioFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, maxInputSize, durationUs, channelCount, sampleRate, initializationData, language); } else if (MimeTypes.isVideo(mimeType)) { - format = MediaFormat.createVideoFormat(trackId, mimeType, MediaFormat.NO_VALUE, + format = MediaFormat.createVideoFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, maxInputSize, durationUs, width, height, initializationData); } else if (MimeTypes.APPLICATION_SUBRIP.equals(mimeType)) { - format = MediaFormat.createTextFormat(trackId, mimeType, MediaFormat.NO_VALUE, durationUs, + format = MediaFormat.createTextFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, durationUs, language); } else { throw new ParserException("Unexpected MIME type."); diff --git a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java index 6ccb297804..48a40a2868 100644 --- a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java @@ -398,7 +398,7 @@ public class SmoothStreamingChunkSource implements ChunkSource, int mp4TrackType; switch (element.type) { case StreamElement.TYPE_VIDEO: - mediaFormat = MediaFormat.createVideoFormat(MediaFormat.NO_VALUE, format.mimeType, + mediaFormat = MediaFormat.createVideoFormat(format.id, MediaFormat.NO_VALUE, format.mimeType, format.bitrate, MediaFormat.NO_VALUE, durationUs, format.width, format.height, Arrays.asList(csdArray)); mp4TrackType = Track.TYPE_vide; @@ -411,13 +411,13 @@ public class SmoothStreamingChunkSource implements ChunkSource, csd = Collections.singletonList(CodecSpecificDataUtil.buildAacAudioSpecificConfig( format.audioSamplingRate, format.audioChannels)); } - mediaFormat = MediaFormat.createAudioFormat(MediaFormat.NO_VALUE, format.mimeType, + mediaFormat = MediaFormat.createAudioFormat(format.id, MediaFormat.NO_VALUE, format.mimeType, format.bitrate, MediaFormat.NO_VALUE, durationUs, format.audioChannels, format.audioSamplingRate, csd, format.language); mp4TrackType = Track.TYPE_soun; break; case StreamElement.TYPE_TEXT: - mediaFormat = MediaFormat.createTextFormat(MediaFormat.NO_VALUE, format.mimeType, + mediaFormat = MediaFormat.createTextFormat(format.id, MediaFormat.NO_VALUE, format.mimeType, format.bitrate, durationUs, format.language); mp4TrackType = Track.TYPE_text; break; diff --git a/library/src/main/java/com/google/android/exoplayer/util/Ac3Util.java b/library/src/main/java/com/google/android/exoplayer/util/Ac3Util.java index 6f1b6764aa..fd81706b30 100644 --- a/library/src/main/java/com/google/android/exoplayer/util/Ac3Util.java +++ b/library/src/main/java/com/google/android/exoplayer/util/Ac3Util.java @@ -55,7 +55,7 @@ public final class Ac3Util { if ((nextByte & 0x04) != 0) { channelCount++; } - return MediaFormat.createAudioFormat(trackId, MimeTypes.AUDIO_AC3, MediaFormat.NO_VALUE, + return MediaFormat.createAudioFormat(null, trackId, MimeTypes.AUDIO_AC3, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, durationUs, channelCount, sampleRate, null, language); } @@ -85,7 +85,7 @@ public final class Ac3Util { if ((nextByte & 0x01) != 0) { channelCount++; } - return MediaFormat.createAudioFormat(trackId, MimeTypes.AUDIO_EC3, MediaFormat.NO_VALUE, + return MediaFormat.createAudioFormat(null, trackId, MimeTypes.AUDIO_EC3, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, durationUs, channelCount, sampleRate, null, language); } @@ -117,7 +117,7 @@ public final class Ac3Util { data.skipBits(2); // dsurmod } boolean lfeon = data.readBit(); - return MediaFormat.createAudioFormat(trackId, MimeTypes.AUDIO_AC3, MediaFormat.NO_VALUE, + return MediaFormat.createAudioFormat(null, trackId, MimeTypes.AUDIO_AC3, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, durationUs, CHANNEL_COUNTS[acmod] + (lfeon ? 1 : 0), SAMPLE_RATES[fscod], null, language); } From 1cefde0d0a9f4dc4214fc56f37c168523abca545 Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Tue, 20 Oct 2015 15:20:44 -0400 Subject: [PATCH 2/6] Deleted unnecessary file used for testing --- .../exoplayer/demo/MediaFormatIdTextViewHelper.java | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 demo/src/main/java/com/google/android/exoplayer/demo/MediaFormatIdTextViewHelper.java diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/MediaFormatIdTextViewHelper.java b/demo/src/main/java/com/google/android/exoplayer/demo/MediaFormatIdTextViewHelper.java deleted file mode 100644 index a437dcfd52..0000000000 --- a/demo/src/main/java/com/google/android/exoplayer/demo/MediaFormatIdTextViewHelper.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.google.android.exoplayer.demo; - -/** - * @author Rik Heijdens - */ -public class MediaFormatIdTextViewHelper { -} From 1b469f422f4599b9a5aca779d4c41f23cb4dcef8 Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Tue, 20 Oct 2015 15:52:35 -0400 Subject: [PATCH 3/6] Synced with upstream --- .../src/main/java/com/google/android/exoplayer/MediaFormat.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/com/google/android/exoplayer/MediaFormat.java b/library/src/main/java/com/google/android/exoplayer/MediaFormat.java index 9157de7ef2..5c849eab9e 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaFormat.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaFormat.java @@ -210,7 +210,7 @@ public final class MediaFormat { } public MediaFormat copyWithMaxInputSize(int maxInputSize) { - return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, language, subsampleOffsetUs, initializationData, adaptive, maxWidth, maxHeight); } From 282a3fe818472c565c294888856f950bc1a911db Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Fri, 23 Oct 2015 09:56:00 -0400 Subject: [PATCH 4/6] Converted trackId into String --- .../exoplayer/demo/PlayerActivity.java | 3 +- .../exoplayer/FrameworkSampleSource.java | 2 +- .../google/android/exoplayer/MediaFormat.java | 47 +++++++++---------- .../exoplayer/dash/DashChunkSource.java | 6 +-- .../exoplayer/extractor/mp3/Mp3Extractor.java | 2 +- .../exoplayer/extractor/mp4/AtomParsers.java | 12 ++--- .../exoplayer/extractor/ts/AdtsReader.java | 2 +- .../exoplayer/extractor/ts/H264Reader.java | 2 +- .../exoplayer/extractor/ts/H265Reader.java | 2 +- .../exoplayer/extractor/ts/Id3Reader.java | 2 +- .../extractor/ts/MpegAudioReader.java | 2 +- .../exoplayer/extractor/ts/SeiReader.java | 2 +- .../extractor/webm/WebmExtractor.java | 8 ++-- .../SmoothStreamingChunkSource.java | 6 +-- .../android/exoplayer/util/Ac3Util.java | 6 +-- 15 files changed, 49 insertions(+), 55 deletions(-) diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java b/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java index dbcdd2cacc..dfc300f516 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/PlayerActivity.java @@ -505,8 +505,7 @@ public class PlayerActivity extends Activity implements SurfaceHolder.Callback, } private static String buildTrackIdString(MediaFormat format) { - return format.trackId == MediaFormat.NO_VALUE ? "" - : String.format(Locale.US, " (%d)", format.trackId); + return format.trackId == null ? "" : " (" + format.trackId + ")"; } private boolean onTrackItemClick(MenuItem item, int type) { diff --git a/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java b/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java index 23bd7ce1c6..e83738c4c1 100644 --- a/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/FrameworkSampleSource.java @@ -315,7 +315,7 @@ public final class FrameworkSampleSource implements SampleSource, SampleSourceRe } long durationUs = format.containsKey(android.media.MediaFormat.KEY_DURATION) ? format.getLong(android.media.MediaFormat.KEY_DURATION) : C.UNKNOWN_TIME_US; - MediaFormat mediaFormat = new MediaFormat(null, MediaFormat.NO_VALUE, mimeType, MediaFormat.NO_VALUE, + MediaFormat mediaFormat = new MediaFormat(null, mimeType, MediaFormat.NO_VALUE, maxInputSize, durationUs, width, height, rotationDegrees, MediaFormat.NO_VALUE, channelCount, sampleRate, language, MediaFormat.OFFSET_SAMPLE_RELATIVE, initializationData, false, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE); diff --git a/library/src/main/java/com/google/android/exoplayer/MediaFormat.java b/library/src/main/java/com/google/android/exoplayer/MediaFormat.java index 5c849eab9e..07fa0fd060 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaFormat.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaFormat.java @@ -39,14 +39,10 @@ public final class MediaFormat { */ public static final long OFFSET_SAMPLE_RELATIVE = Long.MAX_VALUE; /** - * An identifier for the format. - */ - public final String id; - /** - * The identifier for the track represented by the format, or {@link #NO_VALUE} if unknown or not + * The identifier for the track represented by the format, or null if unknown or not * applicable. */ - public final int trackId; + public final String trackId; /** * The mime type of the format. */ @@ -142,53 +138,52 @@ public final class MediaFormat { private int hashCode; private android.media.MediaFormat frameworkMediaFormat; - public static MediaFormat createVideoFormat(String id, int trackId, String mimeType, int bitrate, + public static MediaFormat createVideoFormat(String trackId, String mimeType, int bitrate, int maxInputSize, long durationUs, int width, int height, List initializationData) { - return createVideoFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return createVideoFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, initializationData, NO_VALUE, NO_VALUE); } - public static MediaFormat createVideoFormat(String id, int trackId, String mimeType, int bitrate, + public static MediaFormat createVideoFormat(String trackId, String mimeType, int bitrate, int maxInputSize, long durationUs, int width, int height, List initializationData, int rotationDegrees, float pixelWidthHeightRatio) { - return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, rotationDegrees, pixelWidthHeightRatio, NO_VALUE, NO_VALUE, null, OFFSET_SAMPLE_RELATIVE, initializationData, false, NO_VALUE, NO_VALUE); } - public static MediaFormat createAudioFormat(String id, int trackId, String mimeType, int bitrate, + public static MediaFormat createAudioFormat(String trackId, String mimeType, int bitrate, int maxInputSize, long durationUs, int channelCount, int sampleRate, List initializationData, String language) { - return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, NO_VALUE, NO_VALUE, + return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, channelCount, sampleRate, language, OFFSET_SAMPLE_RELATIVE, initializationData, false, NO_VALUE, NO_VALUE); } - public static MediaFormat createTextFormat(String id, int trackId, String mimeType, int bitrate, + public static MediaFormat createTextFormat(String trackId, String mimeType, int bitrate, long durationUs, String language) { - return createTextFormat(id, trackId, mimeType, bitrate, durationUs, language, + return createTextFormat(trackId, mimeType, bitrate, durationUs, language, OFFSET_SAMPLE_RELATIVE); } - public static MediaFormat createTextFormat(String id, int trackId, String mimeType, int bitrate, + public static MediaFormat createTextFormat(String trackId, String mimeType, int bitrate, long durationUs, String language, long subsampleOffsetUs) { - return new MediaFormat(id, trackId, mimeType, bitrate, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, + return new MediaFormat(trackId, mimeType, bitrate, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, language, subsampleOffsetUs, null, false, NO_VALUE, NO_VALUE); } - public static MediaFormat createFormatForMimeType(String id, int trackId, String mimeType, int bitrate, + public static MediaFormat createFormatForMimeType(String trackId, String mimeType, int bitrate, long durationUs) { - return new MediaFormat(id, trackId, mimeType, bitrate, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, + return new MediaFormat(trackId, mimeType, bitrate, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, null, OFFSET_SAMPLE_RELATIVE, null, false, NO_VALUE, NO_VALUE); } - /* package */ MediaFormat(String id, int trackId, String mimeType, int bitrate, int maxInputSize, + /* package */ MediaFormat(String trackId, String mimeType, int bitrate, int maxInputSize, long durationUs, int width, int height, int rotationDegrees, float pixelWidthHeightRatio, int channelCount, int sampleRate, String language, long subsampleOffsetUs, List initializationData, boolean adaptive, int maxWidth, int maxHeight) { - this.id = id; this.trackId = trackId; this.mimeType = Assertions.checkNotEmpty(mimeType); this.bitrate = bitrate; @@ -210,31 +205,31 @@ public final class MediaFormat { } public MediaFormat copyWithMaxInputSize(int maxInputSize) { - return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, language, subsampleOffsetUs, initializationData, adaptive, maxWidth, maxHeight); } public MediaFormat copyWithMaxVideoDimensions(int maxWidth, int maxHeight) { - return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, language, subsampleOffsetUs, initializationData, adaptive, maxWidth, maxHeight); } public MediaFormat copyWithSubsampleOffsetUs(long subsampleOffsetUs) { - return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, language, subsampleOffsetUs, initializationData, adaptive, maxWidth, maxHeight); } public MediaFormat copyWithDurationUs(long durationUs) { - return new MediaFormat(id, trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, + return new MediaFormat(trackId, mimeType, bitrate, maxInputSize, durationUs, width, height, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, language, subsampleOffsetUs, initializationData, adaptive, maxWidth, maxHeight); } public MediaFormat copyAsAdaptive() { - return new MediaFormat(id, trackId, mimeType, NO_VALUE, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, + return new MediaFormat(null, mimeType, NO_VALUE, NO_VALUE, durationUs, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, null, OFFSET_SAMPLE_RELATIVE, null, true, maxWidth, maxHeight); } @@ -292,7 +287,7 @@ public final class MediaFormat { public int hashCode() { if (hashCode == 0) { int result = 17; - result = 31 * result + trackId; + result = 31 * result + (trackId == null ? 0 : trackId.hashCode()); result = 31 * result + (mimeType == null ? 0 : mimeType.hashCode()); result = 31 * result + bitrate; result = 31 * result + maxInputSize; diff --git a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java index 4f2672daab..3bb88028be 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java @@ -608,14 +608,14 @@ public class DashChunkSource implements ChunkSource, Output { String mediaMimeType, long durationUs) { switch (adaptationSetType) { case AdaptationSet.TYPE_VIDEO: - return MediaFormat.createVideoFormat(format.id, MediaFormat.NO_VALUE, mediaMimeType, format.bitrate, + return MediaFormat.createVideoFormat(format.id, mediaMimeType, format.bitrate, MediaFormat.NO_VALUE, durationUs, format.width, format.height, null); case AdaptationSet.TYPE_AUDIO: - return MediaFormat.createAudioFormat(format.id, MediaFormat.NO_VALUE, mediaMimeType, format.bitrate, + return MediaFormat.createAudioFormat(format.id, mediaMimeType, format.bitrate, MediaFormat.NO_VALUE, durationUs, format.audioChannels, format.audioSamplingRate, null, format.language); case AdaptationSet.TYPE_TEXT: - return MediaFormat.createTextFormat(format.id, MediaFormat.NO_VALUE, mediaMimeType, format.bitrate, + return MediaFormat.createTextFormat(format.id, mediaMimeType, format.bitrate, durationUs, format.language); default: return null; diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java index b7b013b5fa..8fcc147477 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp3/Mp3Extractor.java @@ -332,7 +332,7 @@ public final class Mp3Extractor implements Extractor { if (seeker == null) { setupSeeker(extractorInput, headerPosition); extractorOutput.seekMap(seeker); - trackOutput.format(MediaFormat.createAudioFormat(null, MediaFormat.NO_VALUE, + trackOutput.format(MediaFormat.createAudioFormat(null, synchronizedHeader.mimeType, MediaFormat.NO_VALUE, MpegAudioHeader.MAX_FRAME_SIZE_BYTES, seeker.getDurationUs(), synchronizedHeader.channels, synchronizedHeader.sampleRate, null, null)); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java index 4c7bff673b..29243c1c1e 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/mp4/AtomParsers.java @@ -387,13 +387,13 @@ import java.util.List; parseAudioSampleEntry(stsd, childAtomType, childStartPosition, childAtomSize, trackId, durationUs, language, out, i); } else if (childAtomType == Atom.TYPE_TTML) { - out.mediaFormat = MediaFormat.createTextFormat(null, trackId, MimeTypes.APPLICATION_TTML, + out.mediaFormat = MediaFormat.createTextFormat(Integer.toString(trackId), MimeTypes.APPLICATION_TTML, MediaFormat.NO_VALUE, durationUs, language); } else if (childAtomType == Atom.TYPE_tx3g) { - out.mediaFormat = MediaFormat.createTextFormat(null, trackId, MimeTypes.APPLICATION_TX3G, + out.mediaFormat = MediaFormat.createTextFormat(Integer.toString(trackId), MimeTypes.APPLICATION_TX3G, MediaFormat.NO_VALUE, durationUs, language); } else if (childAtomType == Atom.TYPE_stpp) { - out.mediaFormat = MediaFormat.createTextFormat(null, trackId, MimeTypes.APPLICATION_TTML, + out.mediaFormat = MediaFormat.createTextFormat(Integer.toString(trackId), MimeTypes.APPLICATION_TTML, MediaFormat.NO_VALUE, durationUs, language, 0 /* subsample timing is absolute */); } stsd.setPosition(childStartPosition + childAtomSize); @@ -464,7 +464,7 @@ import java.util.List; return; } - out.mediaFormat = MediaFormat.createVideoFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, + out.mediaFormat = MediaFormat.createVideoFormat(Integer.toString(trackId), mimeType, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, durationUs, width, height, initializationData, rotationDegrees, pixelWidthHeightRatio); } @@ -653,7 +653,7 @@ import java.util.List; } else if ((atomType == Atom.TYPE_dtsc || atomType == Atom.TYPE_dtse || atomType == Atom.TYPE_dtsh || atomType == Atom.TYPE_dtsl) && childAtomType == Atom.TYPE_ddts) { - out.mediaFormat = MediaFormat.createAudioFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, + out.mediaFormat = MediaFormat.createAudioFormat(Integer.toString(trackId), mimeType, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, durationUs, channelCount, sampleRate, null, language); return; } @@ -665,7 +665,7 @@ import java.util.List; return; } - out.mediaFormat = MediaFormat.createAudioFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, + out.mediaFormat = MediaFormat.createAudioFormat(Integer.toString(trackId), mimeType, MediaFormat.NO_VALUE, sampleSize, durationUs, channelCount, sampleRate, initializationData == null ? null : Collections.singletonList(initializationData), language); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsReader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsReader.java index 88bce4b159..ba3d69e024 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsReader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/AdtsReader.java @@ -170,7 +170,7 @@ import java.util.Collections; Pair audioParams = CodecSpecificDataUtil.parseAacAudioSpecificConfig( audioSpecificConfig); - MediaFormat mediaFormat = MediaFormat.createAudioFormat(null, MediaFormat.NO_VALUE, + MediaFormat mediaFormat = MediaFormat.createAudioFormat(null, MimeTypes.AUDIO_AAC, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, audioParams.second, audioParams.first, Collections.singletonList(audioSpecificConfig), null); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/H264Reader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/H264Reader.java index 30c4a8bf5c..efa3a8e5a2 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/H264Reader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/H264Reader.java @@ -210,7 +210,7 @@ import java.util.List; SpsData parsedSpsData = CodecSpecificDataUtil.parseSpsNalUnit(bitArray); // Construct and output the format. - output.format(MediaFormat.createVideoFormat(null, MediaFormat.NO_VALUE, MimeTypes.VIDEO_H264, + output.format(MediaFormat.createVideoFormat(null, MimeTypes.VIDEO_H264, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, parsedSpsData.width, parsedSpsData.height, initializationData, MediaFormat.NO_VALUE, parsedSpsData.pixelWidthAspectRatio)); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/H265Reader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/H265Reader.java index 2d3482e69a..41a1ff85a7 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/H265Reader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/H265Reader.java @@ -294,7 +294,7 @@ import java.util.Collections; } } - output.format(MediaFormat.createVideoFormat(null, MediaFormat.NO_VALUE, MimeTypes.VIDEO_H265, + output.format(MediaFormat.createVideoFormat(null, MimeTypes.VIDEO_H265, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, picWidthInLumaSamples, picHeightInLumaSamples, Collections.singletonList(csd), MediaFormat.NO_VALUE, pixelWidthHeightRatio)); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/Id3Reader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/Id3Reader.java index 740a2e5e9a..ffbeafc295 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/Id3Reader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/Id3Reader.java @@ -35,7 +35,7 @@ import com.google.android.exoplayer.util.ParsableByteArray; public Id3Reader(TrackOutput output) { super(output); - output.format(MediaFormat.createFormatForMimeType(null, MediaFormat.NO_VALUE, + output.format(MediaFormat.createFormatForMimeType(null, MimeTypes.APPLICATION_ID3, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US)); } diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/MpegAudioReader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/MpegAudioReader.java index a9563e130a..ee8f84cfde 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/MpegAudioReader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/MpegAudioReader.java @@ -160,7 +160,7 @@ import com.google.android.exoplayer.util.ParsableByteArray; frameSize = header.frameSize; if (!hasOutputFormat) { frameDurationUs = (C.MICROS_PER_SECOND * header.samplesPerFrame) / header.sampleRate; - MediaFormat mediaFormat = MediaFormat.createAudioFormat(null, MediaFormat.NO_VALUE, header.mimeType, + MediaFormat mediaFormat = MediaFormat.createAudioFormat(null, header.mimeType, MediaFormat.NO_VALUE, MpegAudioHeader.MAX_FRAME_SIZE_BYTES, C.UNKNOWN_TIME_US, header.channels, header.sampleRate, null, null); output.format(mediaFormat); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ts/SeiReader.java b/library/src/main/java/com/google/android/exoplayer/extractor/ts/SeiReader.java index b33595d64e..2aa143d44a 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ts/SeiReader.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ts/SeiReader.java @@ -32,7 +32,7 @@ import com.google.android.exoplayer.util.ParsableByteArray; public SeiReader(TrackOutput output) { super(output); - output.format(MediaFormat.createTextFormat(null, MediaFormat.NO_VALUE, MimeTypes.APPLICATION_EIA608, + output.format(MediaFormat.createTextFormat(null, MimeTypes.APPLICATION_EIA608, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, null)); } diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java b/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java index adcaae0741..c4b1590cd4 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/webm/WebmExtractor.java @@ -1229,15 +1229,15 @@ public final class WebmExtractor implements Extractor { MediaFormat format; // TODO: Read the name of the track from the header of the webm container and - // supply this as id instead of 'null' + // supply this as id instead of trackId? if (MimeTypes.isAudio(mimeType)) { - format = MediaFormat.createAudioFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, + format = MediaFormat.createAudioFormat(Integer.toString(trackId), mimeType, MediaFormat.NO_VALUE, maxInputSize, durationUs, channelCount, sampleRate, initializationData, language); } else if (MimeTypes.isVideo(mimeType)) { - format = MediaFormat.createVideoFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, + format = MediaFormat.createVideoFormat(Integer.toString(trackId), mimeType, MediaFormat.NO_VALUE, maxInputSize, durationUs, width, height, initializationData); } else if (MimeTypes.APPLICATION_SUBRIP.equals(mimeType)) { - format = MediaFormat.createTextFormat(null, trackId, mimeType, MediaFormat.NO_VALUE, durationUs, + format = MediaFormat.createTextFormat(Integer.toString(trackId), mimeType, MediaFormat.NO_VALUE, durationUs, language); } else { throw new ParserException("Unexpected MIME type."); diff --git a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java index fbfba8e7e8..42ee97c74b 100644 --- a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java @@ -398,7 +398,7 @@ public class SmoothStreamingChunkSource implements ChunkSource, int mp4TrackType; switch (element.type) { case StreamElement.TYPE_VIDEO: - mediaFormat = MediaFormat.createVideoFormat(format.id, MediaFormat.NO_VALUE, format.mimeType, + mediaFormat = MediaFormat.createVideoFormat(format.id, format.mimeType, format.bitrate, MediaFormat.NO_VALUE, durationUs, format.width, format.height, Arrays.asList(csdArray)); mp4TrackType = Track.TYPE_vide; @@ -411,13 +411,13 @@ public class SmoothStreamingChunkSource implements ChunkSource, csd = Collections.singletonList(CodecSpecificDataUtil.buildAacAudioSpecificConfig( format.audioSamplingRate, format.audioChannels)); } - mediaFormat = MediaFormat.createAudioFormat(format.id, MediaFormat.NO_VALUE, format.mimeType, + mediaFormat = MediaFormat.createAudioFormat(format.id, format.mimeType, format.bitrate, MediaFormat.NO_VALUE, durationUs, format.audioChannels, format.audioSamplingRate, csd, format.language); mp4TrackType = Track.TYPE_soun; break; case StreamElement.TYPE_TEXT: - mediaFormat = MediaFormat.createTextFormat(format.id, MediaFormat.NO_VALUE, format.mimeType, + mediaFormat = MediaFormat.createTextFormat(format.id, format.mimeType, format.bitrate, durationUs, format.language); mp4TrackType = Track.TYPE_text; break; diff --git a/library/src/main/java/com/google/android/exoplayer/util/Ac3Util.java b/library/src/main/java/com/google/android/exoplayer/util/Ac3Util.java index fd81706b30..041983fc67 100644 --- a/library/src/main/java/com/google/android/exoplayer/util/Ac3Util.java +++ b/library/src/main/java/com/google/android/exoplayer/util/Ac3Util.java @@ -55,7 +55,7 @@ public final class Ac3Util { if ((nextByte & 0x04) != 0) { channelCount++; } - return MediaFormat.createAudioFormat(null, trackId, MimeTypes.AUDIO_AC3, MediaFormat.NO_VALUE, + return MediaFormat.createAudioFormat(Integer.toString(trackId), MimeTypes.AUDIO_AC3, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, durationUs, channelCount, sampleRate, null, language); } @@ -85,7 +85,7 @@ public final class Ac3Util { if ((nextByte & 0x01) != 0) { channelCount++; } - return MediaFormat.createAudioFormat(null, trackId, MimeTypes.AUDIO_EC3, MediaFormat.NO_VALUE, + return MediaFormat.createAudioFormat(Integer.toString(trackId), MimeTypes.AUDIO_EC3, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, durationUs, channelCount, sampleRate, null, language); } @@ -117,7 +117,7 @@ public final class Ac3Util { data.skipBits(2); // dsurmod } boolean lfeon = data.readBit(); - return MediaFormat.createAudioFormat(null, trackId, MimeTypes.AUDIO_AC3, MediaFormat.NO_VALUE, + return MediaFormat.createAudioFormat(Integer.toString(trackId), MimeTypes.AUDIO_AC3, MediaFormat.NO_VALUE, MediaFormat.NO_VALUE, durationUs, CHANNEL_COUNTS[acmod] + (lfeon ? 1 : 0), SAMPLE_RATES[fscod], null, language); } From bc3125c5d26c68c5724de8c82063653e9893a597 Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Mon, 26 Oct 2015 09:59:05 -0400 Subject: [PATCH 5/6] Fixed MediaFormatTests --- .../android/exoplayer/MediaFormatTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/library/src/androidTest/java/com/google/android/exoplayer/MediaFormatTest.java b/library/src/androidTest/java/com/google/android/exoplayer/MediaFormatTest.java index d0004b704e..836ca27048 100644 --- a/library/src/androidTest/java/com/google/android/exoplayer/MediaFormatTest.java +++ b/library/src/androidTest/java/com/google/android/exoplayer/MediaFormatTest.java @@ -15,11 +15,11 @@ */ package com.google.android.exoplayer; -import com.google.android.exoplayer.util.Util; - import android.annotation.SuppressLint; import android.annotation.TargetApi; +import com.google.android.exoplayer.util.Util; + import junit.framework.TestCase; import java.nio.ByteBuffer; @@ -45,20 +45,20 @@ public final class MediaFormatTest extends TestCase { initData.add(initData2); testConversionToFrameworkFormatV16(MediaFormat.createVideoFormat( - null, MediaFormat.NO_VALUE, "video/xyz", 5000, 102400, 1000L, 1280, 720, initData)); + null, "video/xyz", 5000, 102400, 1000L, 1280, 720, initData)); testConversionToFrameworkFormatV16(MediaFormat.createVideoFormat( - null, MediaFormat.NO_VALUE, "video/xyz", 5000, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, 1280, 720, + null, "video/xyz", 5000, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, 1280, 720, null)); testConversionToFrameworkFormatV16(MediaFormat.createAudioFormat( - null, MediaFormat.NO_VALUE, "audio/xyz", 500, 128, 1000L, 5, 44100, initData, null)); + null, "audio/xyz", 500, 128, 1000L, 5, 44100, initData, null)); testConversionToFrameworkFormatV16(MediaFormat.createAudioFormat( - null, MediaFormat.NO_VALUE, "audio/xyz", 500, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, 5, 44100, + null, "audio/xyz", 500, MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, 5, 44100, null, null)); testConversionToFrameworkFormatV16( - MediaFormat.createTextFormat(null, MediaFormat.NO_VALUE, "text/xyz", MediaFormat.NO_VALUE, 1000L, + MediaFormat.createTextFormat(null, "text/xyz", MediaFormat.NO_VALUE, 1000L, "eng")); testConversionToFrameworkFormatV16( - MediaFormat.createTextFormat(null, MediaFormat.NO_VALUE, "text/xyz", MediaFormat.NO_VALUE, + MediaFormat.createTextFormat(null, "text/xyz", MediaFormat.NO_VALUE, C.UNKNOWN_TIME_US, null)); } From ec65fe952c292495c9837b9ec88b78b901e8fd86 Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Mon, 26 Oct 2015 09:59:19 -0400 Subject: [PATCH 6/6] Fixed code indentation --- .../com/google/android/exoplayer/MediaFormat.java | 7 ++++--- .../android/exoplayer/dash/DashChunkSource.java | 15 +++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/MediaFormat.java b/library/src/main/java/com/google/android/exoplayer/MediaFormat.java index 07fa0fd060..2a81d92472 100644 --- a/library/src/main/java/com/google/android/exoplayer/MediaFormat.java +++ b/library/src/main/java/com/google/android/exoplayer/MediaFormat.java @@ -15,12 +15,12 @@ */ package com.google.android.exoplayer; -import com.google.android.exoplayer.util.Assertions; -import com.google.android.exoplayer.util.Util; - import android.annotation.SuppressLint; import android.annotation.TargetApi; +import com.google.android.exoplayer.util.Assertions; +import com.google.android.exoplayer.util.Util; + import java.nio.ByteBuffer; import java.util.Arrays; import java.util.Collections; @@ -38,6 +38,7 @@ public final class MediaFormat { * the timestamps of their parent samples. */ public static final long OFFSET_SAMPLE_RELATIVE = Long.MAX_VALUE; + /** * The identifier for the track represented by the format, or null if unknown or not * applicable. diff --git a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java index 3bb88028be..a0e893b77f 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java @@ -15,6 +15,11 @@ */ package com.google.android.exoplayer.dash; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.util.SparseArray; + import com.google.android.exoplayer.BehindLiveWindowException; import com.google.android.exoplayer.C; import com.google.android.exoplayer.MediaFormat; @@ -51,11 +56,6 @@ import com.google.android.exoplayer.util.ManifestFetcher; import com.google.android.exoplayer.util.MimeTypes; import com.google.android.exoplayer.util.SystemClock; -import android.os.Handler; -import android.text.TextUtils; -import android.util.Log; -import android.util.SparseArray; - import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -846,7 +846,6 @@ public class DashChunkSource implements ChunkSource, Output { public ExposedTrack(MediaFormat trackFormat, int adaptationSetIndex, Format fixedFormat) { this.trackFormat = trackFormat; - this.adaptationSetIndex = adaptationSetIndex; this.fixedFormat = fixedFormat; this.adaptiveFormats = null; @@ -866,9 +865,9 @@ public class DashChunkSource implements ChunkSource, Output { public boolean isAdaptive() { return adaptiveFormats != null; + } - } - } + } private static final class RepresentationHolder {