Commit 461751b1 by aquilescanta Committed by Oliver Woodman

Add codec profiles for video container/sample formats.

This allows better decoding support checking.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=124550351
parent ca9bd5e8
Showing with 166 additions and 152 deletions
...@@ -63,7 +63,7 @@ public final class FfmpegAudioTrackRenderer extends AudioDecoderTrackRenderer { ...@@ -63,7 +63,7 @@ public final class FfmpegAudioTrackRenderer extends AudioDecoderTrackRenderer {
public Format getOutputFormat() { public Format getOutputFormat() {
int channelCount = decoder.getChannelCount(); int channelCount = decoder.getChannelCount();
int sampleRate = decoder.getSampleRate(); int sampleRate = decoder.getSampleRate();
return Format.createAudioSampleFormat(null, MimeTypes.AUDIO_RAW, Format.NO_VALUE, return Format.createAudioSampleFormat(null, MimeTypes.AUDIO_RAW, null, Format.NO_VALUE,
Format.NO_VALUE, channelCount, sampleRate, C.ENCODING_PCM_16BIT, null, null, 0, null); Format.NO_VALUE, channelCount, sampleRate, C.ENCODING_PCM_16BIT, null, null, 0, null);
} }
......
...@@ -111,7 +111,7 @@ public final class FlacExtractor implements Extractor { ...@@ -111,7 +111,7 @@ public final class FlacExtractor implements Extractor {
}); });
Format mediaFormat = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_RAW, Format mediaFormat = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_RAW, null,
streamInfo.bitRate(), Format.NO_VALUE, streamInfo.channels, streamInfo.sampleRate, streamInfo.bitRate(), Format.NO_VALUE, streamInfo.channels, streamInfo.sampleRate,
C.ENCODING_PCM_16BIT, null, null, 0, null); C.ENCODING_PCM_16BIT, null, null, 0, null);
trackOutput.format(mediaFormat); trackOutput.format(mediaFormat);
......
...@@ -59,8 +59,8 @@ public final class FormatTest extends TestCase { ...@@ -59,8 +59,8 @@ public final class FormatTest extends TestCase {
TestUtil.buildTestData(128, 1 /* data seed */)); TestUtil.buildTestData(128, 1 /* data seed */));
DrmInitData drmInitData = new DrmInitData(DRM_DATA_1, DRM_DATA_2); DrmInitData drmInitData = new DrmInitData(DRM_DATA_1, DRM_DATA_2);
Format formatToParcel = new Format("id", MimeTypes.VIDEO_MP4, MimeTypes.VIDEO_H264, 1024, 2048, Format formatToParcel = new Format("id", MimeTypes.VIDEO_MP4, MimeTypes.VIDEO_H264, null,
1920, 1080, 24, 90, 2, 6, 44100, C.ENCODING_PCM_24BIT, 1001, 1002, 0, "und", 1024, 2048, 1920, 1080, 24, 90, 2, 6, 44100, C.ENCODING_PCM_24BIT, 1001, 1002, 0, "und",
Format.OFFSET_SAMPLE_RELATIVE, INIT_DATA, drmInitData, false); Format.OFFSET_SAMPLE_RELATIVE, INIT_DATA, drmInitData, false);
Parcel parcel = Parcel.obtain(); Parcel parcel = Parcel.obtain();
...@@ -79,17 +79,17 @@ public final class FormatTest extends TestCase { ...@@ -79,17 +79,17 @@ public final class FormatTest extends TestCase {
return; return;
} }
testConversionToFrameworkMediaFormatV16(Format.createVideoSampleFormat(null, "video/xyz", 5000, testConversionToFrameworkMediaFormatV16(Format.createVideoSampleFormat(null, "video/xyz", null,
102400, 1280, 720, 30, INIT_DATA, null)); 5000, 102400, 1280, 720, 30, INIT_DATA, null));
testConversionToFrameworkMediaFormatV16(Format.createVideoSampleFormat(null, "video/xyz", 5000, testConversionToFrameworkMediaFormatV16(Format.createVideoSampleFormat(null, "video/xyz", null,
Format.NO_VALUE, 1280, 720, 30, null, null)); 5000, Format.NO_VALUE, 1280, 720, 30, null, null));
testConversionToFrameworkMediaFormatV16(Format.createAudioSampleFormat(null, "audio/xyz", 500, testConversionToFrameworkMediaFormatV16(Format.createAudioSampleFormat(null, "audio/xyz", null,
128, 5, 44100, INIT_DATA, null, 0, null)); 500, 128, 5, 44100, INIT_DATA, null, 0, null));
testConversionToFrameworkMediaFormatV16(Format.createAudioSampleFormat(null, "audio/xyz", 500, testConversionToFrameworkMediaFormatV16(Format.createAudioSampleFormat(null, "audio/xyz", null,
Format.NO_VALUE, 5, 44100, null, null, 0, null)); 500, Format.NO_VALUE, 5, 44100, null, null, 0, null));
testConversionToFrameworkMediaFormatV16(Format.createTextSampleFormat(null, "text/xyz", testConversionToFrameworkMediaFormatV16(Format.createTextSampleFormat(null, "text/xyz", null,
Format.NO_VALUE, 0, "eng", null)); Format.NO_VALUE, 0, "eng", null));
testConversionToFrameworkMediaFormatV16(Format.createTextSampleFormat(null, "text/xyz", testConversionToFrameworkMediaFormatV16(Format.createTextSampleFormat(null, "text/xyz", null,
Format.NO_VALUE, 0, null, null)); Format.NO_VALUE, 0, null, null));
} }
......
...@@ -44,12 +44,13 @@ public class DashChunkSourceTest extends InstrumentationTestCase { ...@@ -44,12 +44,13 @@ public class DashChunkSourceTest extends InstrumentationTestCase {
private static final int WIDE_WIDTH = 400; private static final int WIDE_WIDTH = 400;
private static final Format REGULAR_VIDEO = Format.createVideoContainerFormat("1", private static final Format REGULAR_VIDEO = Format.createVideoContainerFormat("1",
MimeTypes.APPLICATION_MP4, MimeTypes.VIDEO_H264, 1000, 480, 240, Format.NO_VALUE, null); MimeTypes.APPLICATION_MP4, MimeTypes.VIDEO_H264, null, 1000, 480, 240, Format.NO_VALUE, null);
private static final Format TALL_VIDEO = Format.createVideoContainerFormat("2", private static final Format TALL_VIDEO = Format.createVideoContainerFormat("2",
MimeTypes.APPLICATION_MP4, MimeTypes.VIDEO_H264, 1000, 100, TALL_HEIGHT, Format.NO_VALUE, MimeTypes.APPLICATION_MP4, MimeTypes.VIDEO_H264, null, 1000, 100, TALL_HEIGHT,
null); Format.NO_VALUE, null);
private static final Format WIDE_VIDEO = Format.createVideoContainerFormat("3", private static final Format WIDE_VIDEO = Format.createVideoContainerFormat("3",
MimeTypes.APPLICATION_MP4, MimeTypes.VIDEO_H264, 1000, WIDE_WIDTH, 50, Format.NO_VALUE, null); MimeTypes.APPLICATION_MP4, MimeTypes.VIDEO_H264, null, 1000, WIDE_WIDTH, 50, Format.NO_VALUE,
null);
@Override @Override
public void setUp() throws Exception { public void setUp() throws Exception {
......
...@@ -29,12 +29,12 @@ public class RepresentationTest extends TestCase { ...@@ -29,12 +29,12 @@ public class RepresentationTest extends TestCase {
public void testGetCacheKey() { public void testGetCacheKey() {
String uri = "http://www.google.com"; String uri = "http://www.google.com";
SegmentBase base = new SingleSegmentBase(new RangedUri(uri, null, 0, 1), 1, 0, uri, 1, 1); SegmentBase base = new SingleSegmentBase(new RangedUri(uri, null, 0, 1), 1, 0, uri, 1, 1);
Format format = Format.createVideoContainerFormat("0", MimeTypes.APPLICATION_MP4, Format format = Format.createVideoContainerFormat("0", MimeTypes.APPLICATION_MP4, null,
MimeTypes.VIDEO_H264, 2500000, 1920, 1080, Format.NO_VALUE, null); MimeTypes.VIDEO_H264, 2500000, 1920, 1080, Format.NO_VALUE, null);
Representation representation = Representation.newInstance("test_stream_1", 3, format, base); Representation representation = Representation.newInstance("test_stream_1", 3, format, base);
assertEquals("test_stream_1.0.3", representation.getCacheKey()); assertEquals("test_stream_1.0.3", representation.getCacheKey());
format = Format.createVideoContainerFormat("150", MimeTypes.APPLICATION_MP4, format = Format.createVideoContainerFormat("150", MimeTypes.APPLICATION_MP4, null,
MimeTypes.VIDEO_H264, 2500000, 1920, 1080, Format.NO_VALUE, null); MimeTypes.VIDEO_H264, 2500000, 1920, 1080, Format.NO_VALUE, null);
representation = Representation.newInstance("test_stream_1", -1, format, base); representation = Representation.newInstance("test_stream_1", -1, format, base);
assertEquals("test_stream_1.150.-1", representation.getCacheKey()); assertEquals("test_stream_1.150.-1", representation.getCacheKey());
......
...@@ -75,6 +75,10 @@ public final class Format implements Parcelable { ...@@ -75,6 +75,10 @@ public final class Format implements Parcelable {
* The average bandwidth in bits per second, or {@link #NO_VALUE} if unknown or not applicable. * The average bandwidth in bits per second, or {@link #NO_VALUE} if unknown or not applicable.
*/ */
public final int bitrate; public final int bitrate;
/**
* Codecs of the format as described in RFC 6381, or null if unknown or not applicable.
*/
public final String codecs;
// Container specific. // Container specific.
...@@ -190,92 +194,95 @@ public final class Format implements Parcelable { ...@@ -190,92 +194,95 @@ public final class Format implements Parcelable {
// Video. // Video.
public static Format createVideoContainerFormat(String id, String containerMimeType, public static Format createVideoContainerFormat(String id, String containerMimeType,
String sampleMimeType, int bitrate, int width, int height, float frameRate, String sampleMimeType, String codecs, int bitrate, int width, int height,
List<byte[]> initializationData) { float frameRate, List<byte[]> initializationData) {
return new Format(id, containerMimeType, sampleMimeType, bitrate, NO_VALUE, width, height, return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, NO_VALUE, width,
frameRate, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, 0, null, height, frameRate, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, 0,
OFFSET_SAMPLE_RELATIVE, initializationData, null, false); null, OFFSET_SAMPLE_RELATIVE, initializationData, null, false);
} }
public static Format createVideoSampleFormat(String id, String sampleMimeType, int bitrate, public static Format createVideoSampleFormat(String id, String sampleMimeType,
int maxInputSize, int width, int height, float frameRate, List<byte[]> initializationData, String codecs, int bitrate, int maxInputSize, int width, int height, float frameRate,
DrmInitData drmInitData) { List<byte[]> initializationData, DrmInitData drmInitData) {
return createVideoSampleFormat(id, sampleMimeType, bitrate, maxInputSize, width, height, return createVideoSampleFormat(id, sampleMimeType, codecs, bitrate, maxInputSize, width,
frameRate, initializationData, NO_VALUE, NO_VALUE, drmInitData); height, frameRate, initializationData, NO_VALUE, NO_VALUE, drmInitData);
} }
public static Format createVideoSampleFormat(String id, String sampleMimeType, int bitrate, public static Format createVideoSampleFormat(String id, String sampleMimeType,
int maxInputSize, int width, int height, float frameRate, List<byte[]> initializationData, String codecs, int bitrate, int maxInputSize, int width, int height, float frameRate,
int rotationDegrees, float pixelWidthHeightRatio, DrmInitData drmInitData) { List<byte[]> initializationData, int rotationDegrees, float pixelWidthHeightRatio,
return new Format(id, null, sampleMimeType, bitrate, maxInputSize, width, height, frameRate, DrmInitData drmInitData) {
rotationDegrees, pixelWidthHeightRatio, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, 0, return new Format(id, null, sampleMimeType, codecs, bitrate, maxInputSize, width, height,
null, OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, false); frameRate, rotationDegrees, pixelWidthHeightRatio, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, 0, null, OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, false);
} }
// Audio. // Audio.
public static Format createAudioContainerFormat(String id, String containerMimeType, public static Format createAudioContainerFormat(String id, String containerMimeType,
String sampleMimeType, int bitrate, int channelCount, int sampleRate, String sampleMimeType, String codecs, int bitrate, int channelCount, int sampleRate,
List<byte[]> initializationData, int selectionFlags, String language) { List<byte[]> initializationData, int selectionFlags, String language) {
return new Format(id, containerMimeType, sampleMimeType, bitrate, NO_VALUE, NO_VALUE, NO_VALUE, return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, channelCount, sampleRate, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, channelCount, sampleRate, NO_VALUE, NO_VALUE,
selectionFlags, language, OFFSET_SAMPLE_RELATIVE, initializationData, null, false); NO_VALUE, selectionFlags, language, OFFSET_SAMPLE_RELATIVE, initializationData, null,
false);
} }
public static Format createAudioSampleFormat(String id, String sampleMimeType, int bitrate, public static Format createAudioSampleFormat(String id, String sampleMimeType, String codecs,
int maxInputSize, int channelCount, int sampleRate, List<byte[]> initializationData, int bitrate, int maxInputSize, int channelCount, int sampleRate,
DrmInitData drmInitData, int selectionFlags, String language) { List<byte[]> initializationData, DrmInitData drmInitData, int selectionFlags,
return createAudioSampleFormat(id, sampleMimeType, bitrate, maxInputSize, channelCount, String language) {
return createAudioSampleFormat(id, sampleMimeType, codecs, bitrate, maxInputSize, channelCount,
sampleRate, NO_VALUE, initializationData, drmInitData, selectionFlags, language); sampleRate, NO_VALUE, initializationData, drmInitData, selectionFlags, language);
} }
public static Format createAudioSampleFormat(String id, String sampleMimeType, int bitrate, public static Format createAudioSampleFormat(String id, String sampleMimeType, String codecs,
int maxInputSize, int channelCount, int sampleRate, int pcmEncoding, int bitrate, int maxInputSize, int channelCount, int sampleRate, int pcmEncoding,
List<byte[]> initializationData, DrmInitData drmInitData, int selectionFlags, List<byte[]> initializationData, DrmInitData drmInitData, int selectionFlags,
String language) { String language) {
return createAudioSampleFormat(id, sampleMimeType, bitrate, maxInputSize, channelCount, return createAudioSampleFormat(id, sampleMimeType, codecs, bitrate, maxInputSize, channelCount,
sampleRate, pcmEncoding, NO_VALUE, NO_VALUE, initializationData, drmInitData, sampleRate, pcmEncoding, NO_VALUE, NO_VALUE, initializationData, drmInitData,
selectionFlags, language); selectionFlags, language);
} }
public static Format createAudioSampleFormat(String id, String sampleMimeType, int bitrate, public static Format createAudioSampleFormat(String id, String sampleMimeType, String codecs,
int maxInputSize, int channelCount, int sampleRate, int pcmEncoding, int encoderDelay, int bitrate, int maxInputSize, int channelCount, int sampleRate, int pcmEncoding,
int encoderPadding, List<byte[]> initializationData, DrmInitData drmInitData, int encoderDelay, int encoderPadding, List<byte[]> initializationData,
int selectionFlags, String language) { DrmInitData drmInitData, int selectionFlags, String language) {
return new Format(id, null, sampleMimeType, bitrate, maxInputSize, NO_VALUE, NO_VALUE, NO_VALUE, return new Format(id, null, sampleMimeType, codecs, bitrate, maxInputSize, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, channelCount, sampleRate, pcmEncoding, encoderDelay, encoderPadding, NO_VALUE, NO_VALUE, NO_VALUE, channelCount, sampleRate, pcmEncoding, encoderDelay,
selectionFlags, language, OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, encoderPadding, selectionFlags, language, OFFSET_SAMPLE_RELATIVE, initializationData,
false); drmInitData, false);
} }
// Text. // Text.
public static Format createTextContainerFormat(String id, String containerMimeType, public static Format createTextContainerFormat(String id, String containerMimeType,
String sampleMimeType, int bitrate, int selectionFlags, String language) { String sampleMimeType, String codecs, int bitrate, int selectionFlags, String language) {
return new Format(id, containerMimeType, sampleMimeType, bitrate, NO_VALUE, NO_VALUE, NO_VALUE, return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE,
selectionFlags, language, OFFSET_SAMPLE_RELATIVE, null, null, false); selectionFlags, language, OFFSET_SAMPLE_RELATIVE, null, null, false);
} }
public static Format createTextSampleFormat(String id, String sampleMimeType, int bitrate, public static Format createTextSampleFormat(String id, String sampleMimeType, String codecs,
int selectionFlags, String language, DrmInitData drmInitData) { int bitrate, int selectionFlags, String language, DrmInitData drmInitData) {
return createTextSampleFormat(id, sampleMimeType, bitrate, selectionFlags, language, return createTextSampleFormat(id, sampleMimeType, codecs, bitrate, selectionFlags, language,
drmInitData, OFFSET_SAMPLE_RELATIVE); drmInitData, OFFSET_SAMPLE_RELATIVE);
} }
public static Format createTextSampleFormat(String id, String sampleMimeType, int bitrate, public static Format createTextSampleFormat(String id, String sampleMimeType, String codecs,
int selectionFlags, String language, DrmInitData drmInitData, long subsampleOffsetUs) { int bitrate, int selectionFlags, String language, DrmInitData drmInitData,
return new Format(id, null, sampleMimeType, bitrate, NO_VALUE, NO_VALUE, NO_VALUE, long subsampleOffsetUs) {
return new Format(id, null, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE,
selectionFlags, language, subsampleOffsetUs, null, drmInitData, false); selectionFlags, language, subsampleOffsetUs, null, drmInitData, false);
} }
// Image. // Image.
public static Format createImageSampleFormat(String id, String sampleMimeType, int bitrate, public static Format createImageSampleFormat(String id, String sampleMimeType, String codecs,
List<byte[]> initializationData, String language, int bitrate, List<byte[]> initializationData, String language, DrmInitData drmInitData) {
DrmInitData drmInitData) { return new Format(id, null, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE, NO_VALUE,
return new Format(id, null, sampleMimeType, bitrate, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, 0, language, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, 0, language,
OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, false); OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, false);
} }
...@@ -284,27 +291,28 @@ public final class Format implements Parcelable { ...@@ -284,27 +291,28 @@ public final class Format implements Parcelable {
public static Format createContainerFormat(String id, String containerMimeType, public static Format createContainerFormat(String id, String containerMimeType,
String sampleMimeType, int bitrate) { String sampleMimeType, int bitrate) {
return new Format(id, containerMimeType, sampleMimeType, bitrate, NO_VALUE, NO_VALUE, NO_VALUE, return new Format(id, containerMimeType, sampleMimeType, null, bitrate, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, 0, null, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE,
OFFSET_SAMPLE_RELATIVE, null, null, false); 0, null, OFFSET_SAMPLE_RELATIVE, null, null, false);
} }
public static Format createSampleFormat(String id, String sampleMimeType, int bitrate, public static Format createSampleFormat(String id, String sampleMimeType, String codecs,
DrmInitData drmInitData) { int bitrate, DrmInitData drmInitData) {
return new Format(id, null, sampleMimeType, bitrate, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, return new Format(id, null, sampleMimeType, codecs, bitrate, NO_VALUE, NO_VALUE, NO_VALUE,
NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, 0, null, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, NO_VALUE, 0, null,
OFFSET_SAMPLE_RELATIVE, null, drmInitData, false); OFFSET_SAMPLE_RELATIVE, null, drmInitData, false);
} }
/* package */ Format(String id, String containerMimeType, String sampleMimeType, int bitrate, /* package */ Format(String id, String containerMimeType, String sampleMimeType,
int maxInputSize, int width, int height, float frameRate, int rotationDegrees, String codecs, int bitrate, int maxInputSize, int width, int height, float frameRate,
float pixelWidthHeightRatio, int channelCount, int sampleRate, int pcmEncoding, int rotationDegrees, float pixelWidthHeightRatio, int channelCount, int sampleRate,
int encoderDelay, int encoderPadding, int selectionFlags, String language, int pcmEncoding, int encoderDelay, int encoderPadding, int selectionFlags, String language,
long subsampleOffsetUs, List<byte[]> initializationData, DrmInitData drmInitData, long subsampleOffsetUs, List<byte[]> initializationData, DrmInitData drmInitData,
boolean requiresSecureDecryption) { boolean requiresSecureDecryption) {
this.id = id; this.id = id;
this.containerMimeType = containerMimeType; this.containerMimeType = containerMimeType;
this.sampleMimeType = sampleMimeType; this.sampleMimeType = sampleMimeType;
this.codecs = codecs;
this.bitrate = bitrate; this.bitrate = bitrate;
this.maxInputSize = maxInputSize; this.maxInputSize = maxInputSize;
this.width = width; this.width = width;
...@@ -330,6 +338,7 @@ public final class Format implements Parcelable { ...@@ -330,6 +338,7 @@ public final class Format implements Parcelable {
id = in.readString(); id = in.readString();
containerMimeType = in.readString(); containerMimeType = in.readString();
sampleMimeType = in.readString(); sampleMimeType = in.readString();
codecs = in.readString();
bitrate = in.readInt(); bitrate = in.readInt();
maxInputSize = in.readInt(); maxInputSize = in.readInt();
width = in.readInt(); width = in.readInt();
...@@ -355,23 +364,23 @@ public final class Format implements Parcelable { ...@@ -355,23 +364,23 @@ public final class Format implements Parcelable {
} }
public Format copyWithMaxInputSize(int maxInputSize) { public Format copyWithMaxInputSize(int maxInputSize) {
return new Format(id, containerMimeType, sampleMimeType, bitrate, maxInputSize, width, return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, maxInputSize,
height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate,
pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs, pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs,
initializationData, drmInitData, requiresSecureDecryption); initializationData, drmInitData, requiresSecureDecryption);
} }
public Format copyWithSubsampleOffsetUs(long subsampleOffsetUs) { public Format copyWithSubsampleOffsetUs(long subsampleOffsetUs) {
return new Format(id, containerMimeType, sampleMimeType, bitrate, maxInputSize, width, return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, maxInputSize,
height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate,
pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs, pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs,
initializationData, drmInitData, requiresSecureDecryption); initializationData, drmInitData, requiresSecureDecryption);
} }
public Format copyWithContainerInfo(String id, int bitrate, int width, int height, public Format copyWithContainerInfo(String id, int bitrate, int width, int height,
int selectionFlags, String language) { int selectionFlags, String language) {
return new Format(id, containerMimeType, sampleMimeType, bitrate, maxInputSize, width, return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, maxInputSize,
height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate,
pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs, pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs,
initializationData, drmInitData, requiresSecureDecryption); initializationData, drmInitData, requiresSecureDecryption);
} }
...@@ -386,22 +395,22 @@ public final class Format implements Parcelable { ...@@ -386,22 +395,22 @@ public final class Format implements Parcelable {
|| this.drmInitData == null ? manifestFormat.drmInitData : this.drmInitData; || this.drmInitData == null ? manifestFormat.drmInitData : this.drmInitData;
boolean requiresSecureDecryption = this.requiresSecureDecryption boolean requiresSecureDecryption = this.requiresSecureDecryption
|| manifestFormat.requiresSecureDecryption; || manifestFormat.requiresSecureDecryption;
return new Format(id, containerMimeType, sampleMimeType, bitrate, maxInputSize, width, return new Format(id, containerMimeType, sampleMimeType, null, bitrate, maxInputSize, width,
height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate,
pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs, pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs,
initializationData, drmInitData, requiresSecureDecryption); initializationData, drmInitData, requiresSecureDecryption);
} }
public Format copyWithGaplessInfo(int encoderDelay, int encoderPadding) { public Format copyWithGaplessInfo(int encoderDelay, int encoderPadding) {
return new Format(id, containerMimeType, sampleMimeType, bitrate, maxInputSize, width, return new Format(id, containerMimeType, sampleMimeType, codecs, bitrate, maxInputSize,
height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate,
pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs, pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs,
initializationData, drmInitData, requiresSecureDecryption); initializationData, drmInitData, requiresSecureDecryption);
} }
public Format copyWithDrmInitData(DrmInitData drmInitData) { public Format copyWithDrmInitData(DrmInitData drmInitData) {
return new Format(id, containerMimeType, sampleMimeType, bitrate, maxInputSize, width, return new Format(id, containerMimeType, codecs, sampleMimeType, bitrate, maxInputSize,
height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate, width, height, frameRate, rotationDegrees, pixelWidthHeightRatio, channelCount, sampleRate,
pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs, pcmEncoding, encoderDelay, encoderPadding, selectionFlags, language, subsampleOffsetUs,
initializationData, drmInitData, requiresSecureDecryption); initializationData, drmInitData, requiresSecureDecryption);
} }
...@@ -459,6 +468,7 @@ public final class Format implements Parcelable { ...@@ -459,6 +468,7 @@ public final class Format implements Parcelable {
result = 31 * result + (id == null ? 0 : id.hashCode()); result = 31 * result + (id == null ? 0 : id.hashCode());
result = 31 * result + (containerMimeType == null ? 0 : containerMimeType.hashCode()); result = 31 * result + (containerMimeType == null ? 0 : containerMimeType.hashCode());
result = 31 * result + (sampleMimeType == null ? 0 : sampleMimeType.hashCode()); result = 31 * result + (sampleMimeType == null ? 0 : sampleMimeType.hashCode());
result = 31 * result + (codecs == null ? 0 : codecs.hashCode());
result = 31 * result + bitrate; result = 31 * result + bitrate;
result = 31 * result + width; result = 31 * result + width;
result = 31 * result + height; result = 31 * result + height;
...@@ -492,6 +502,7 @@ public final class Format implements Parcelable { ...@@ -492,6 +502,7 @@ public final class Format implements Parcelable {
|| !Util.areEqual(language, other.language) || !Util.areEqual(language, other.language)
|| !Util.areEqual(containerMimeType, other.containerMimeType) || !Util.areEqual(containerMimeType, other.containerMimeType)
|| !Util.areEqual(sampleMimeType, other.sampleMimeType) || !Util.areEqual(sampleMimeType, other.sampleMimeType)
|| !Util.areEqual(codecs, other.codecs)
|| !Util.areEqual(drmInitData, other.drmInitData) || !Util.areEqual(drmInitData, other.drmInitData)
|| initializationData.size() != other.initializationData.size()) { || initializationData.size() != other.initializationData.size()) {
return false; return false;
...@@ -537,6 +548,7 @@ public final class Format implements Parcelable { ...@@ -537,6 +548,7 @@ public final class Format implements Parcelable {
dest.writeString(id); dest.writeString(id);
dest.writeString(containerMimeType); dest.writeString(containerMimeType);
dest.writeString(sampleMimeType); dest.writeString(sampleMimeType);
dest.writeString(codecs);
dest.writeInt(bitrate); dest.writeInt(bitrate);
dest.writeInt(maxInputSize); dest.writeInt(maxInputSize);
dest.writeInt(width); dest.writeInt(width);
......
...@@ -331,7 +331,7 @@ public final class FrameworkSampleSource implements SampleSource { ...@@ -331,7 +331,7 @@ public final class FrameworkSampleSource implements SampleSource {
buffer.flip(); buffer.flip();
} }
int pcmEncoding = MimeTypes.AUDIO_RAW.equals(mimeType) ? C.ENCODING_PCM_16BIT : Format.NO_VALUE; int pcmEncoding = MimeTypes.AUDIO_RAW.equals(mimeType) ? C.ENCODING_PCM_16BIT : Format.NO_VALUE;
Format format = new Format(Integer.toString(index), null, mimeType, Format.NO_VALUE, Format format = new Format(Integer.toString(index), null, mimeType, null, Format.NO_VALUE,
maxInputSize, width, height, frameRate, rotationDegrees, Format.NO_VALUE, channelCount, maxInputSize, width, height, frameRate, rotationDegrees, Format.NO_VALUE, channelCount,
sampleRate, pcmEncoding, encoderDelay, encoderPadding, 0, language, sampleRate, pcmEncoding, encoderDelay, encoderPadding, 0, language,
Format.OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, false); Format.OFFSET_SAMPLE_RELATIVE, initializationData, drmInitData, false);
......
...@@ -405,14 +405,14 @@ public class MediaPresentationDescriptionParser extends DefaultHandler ...@@ -405,14 +405,14 @@ public class MediaPresentationDescriptionParser extends DefaultHandler
String sampleMimeType = getSampleMimeType(containerMimeType, codecs); String sampleMimeType = getSampleMimeType(containerMimeType, codecs);
if (sampleMimeType != null) { if (sampleMimeType != null) {
if (MimeTypes.isVideo(sampleMimeType)) { if (MimeTypes.isVideo(sampleMimeType)) {
return Format.createVideoContainerFormat(id, containerMimeType, sampleMimeType, bitrate, return Format.createVideoContainerFormat(id, containerMimeType, sampleMimeType, null,
width, height, frameRate, null); bitrate, width, height, frameRate, null);
} else if (MimeTypes.isAudio(sampleMimeType)) { } else if (MimeTypes.isAudio(sampleMimeType)) {
return Format.createAudioContainerFormat(id, containerMimeType, sampleMimeType, bitrate, return Format.createAudioContainerFormat(id, containerMimeType, sampleMimeType, null,
audioChannels, audioSamplingRate, null, 0, language); bitrate, audioChannels, audioSamplingRate, null, 0, language);
} else if (mimeTypeIsRawText(sampleMimeType)) { } else if (mimeTypeIsRawText(sampleMimeType)) {
return Format.createTextContainerFormat(id, containerMimeType, sampleMimeType, bitrate, 0, return Format.createTextContainerFormat(id, containerMimeType, sampleMimeType, null,
language); bitrate, 0, language);
} else { } else {
return Format.createContainerFormat(id, containerMimeType, sampleMimeType, bitrate); return Format.createContainerFormat(id, containerMimeType, sampleMimeType, bitrate);
} }
......
...@@ -140,7 +140,7 @@ public abstract class AudioDecoderTrackRenderer extends TrackRenderer implements ...@@ -140,7 +140,7 @@ public abstract class AudioDecoderTrackRenderer extends TrackRenderer implements
* rate as the input. * rate as the input.
*/ */
protected Format getOutputFormat() { protected Format getOutputFormat() {
return Format.createAudioSampleFormat(null, MimeTypes.AUDIO_RAW, Format.NO_VALUE, return Format.createAudioSampleFormat(null, MimeTypes.AUDIO_RAW, null, Format.NO_VALUE,
Format.NO_VALUE, inputFormat.channelCount, inputFormat.sampleRate, C.ENCODING_PCM_16BIT, Format.NO_VALUE, inputFormat.channelCount, inputFormat.sampleRate, C.ENCODING_PCM_16BIT,
null, null, 0, null); null, null, 0, null);
} }
......
...@@ -86,7 +86,7 @@ import java.util.Collections; ...@@ -86,7 +86,7 @@ import java.util.Collections;
data.readBytes(audioSpecifiConfig, 0, audioSpecifiConfig.length); data.readBytes(audioSpecifiConfig, 0, audioSpecifiConfig.length);
Pair<Integer, Integer> audioParams = CodecSpecificDataUtil.parseAacAudioSpecificConfig( Pair<Integer, Integer> audioParams = CodecSpecificDataUtil.parseAacAudioSpecificConfig(
audioSpecifiConfig); audioSpecifiConfig);
Format format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_AAC, Format format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_AAC, null,
Format.NO_VALUE, Format.NO_VALUE, audioParams.second, audioParams.first, Format.NO_VALUE, Format.NO_VALUE, audioParams.second, audioParams.first,
Collections.singletonList(audioSpecifiConfig), null, 0, null); Collections.singletonList(audioSpecifiConfig), null, 0, null);
output.format(format); output.format(format);
......
...@@ -93,7 +93,7 @@ import java.util.List; ...@@ -93,7 +93,7 @@ import java.util.List;
nalUnitLengthFieldLength = avcData.nalUnitLengthFieldLength; nalUnitLengthFieldLength = avcData.nalUnitLengthFieldLength;
// Construct and output the format. // Construct and output the format.
Format format = Format.createVideoSampleFormat(null, MimeTypes.VIDEO_H264, Format format = Format.createVideoSampleFormat(null, MimeTypes.VIDEO_H264, null,
Format.NO_VALUE, Format.NO_VALUE, avcData.width, avcData.height, Format.NO_VALUE, Format.NO_VALUE, avcData.width, avcData.height,
Format.NO_VALUE, avcData.initializationData, Format.NO_VALUE, Format.NO_VALUE, avcData.initializationData, Format.NO_VALUE,
avcData.pixelWidthAspectRatio, null); avcData.pixelWidthAspectRatio, null);
......
...@@ -1337,7 +1337,7 @@ public final class MatroskaExtractor implements Extractor { ...@@ -1337,7 +1337,7 @@ public final class MatroskaExtractor implements Extractor {
// TODO: Consider reading the name elements of the tracks and, if present, incorporating them // TODO: Consider reading the name elements of the tracks and, if present, incorporating them
// into the trackId passed when creating the formats. // into the trackId passed when creating the formats.
if (MimeTypes.isAudio(mimeType)) { if (MimeTypes.isAudio(mimeType)) {
format = Format.createAudioSampleFormat(Integer.toString(trackId), mimeType, format = Format.createAudioSampleFormat(Integer.toString(trackId), mimeType, null,
Format.NO_VALUE, maxInputSize, channelCount, sampleRate, pcmEncoding, Format.NO_VALUE, maxInputSize, channelCount, sampleRate, pcmEncoding,
initializationData, drmInitData, selectionFlags, language); initializationData, drmInitData, selectionFlags, language);
} else if (MimeTypes.isVideo(mimeType)) { } else if (MimeTypes.isVideo(mimeType)) {
...@@ -1349,15 +1349,15 @@ public final class MatroskaExtractor implements Extractor { ...@@ -1349,15 +1349,15 @@ public final class MatroskaExtractor implements Extractor {
if (displayWidth != Format.NO_VALUE && displayHeight != Format.NO_VALUE) { if (displayWidth != Format.NO_VALUE && displayHeight != Format.NO_VALUE) {
pixelWidthHeightRatio = ((float) (height * displayWidth)) / (width * displayHeight); pixelWidthHeightRatio = ((float) (height * displayWidth)) / (width * displayHeight);
} }
format = Format.createVideoSampleFormat(Integer.toString(trackId), mimeType, format = Format.createVideoSampleFormat(Integer.toString(trackId), mimeType, null,
Format.NO_VALUE, maxInputSize, width, height, Format.NO_VALUE, initializationData, Format.NO_VALUE, maxInputSize, width, height, Format.NO_VALUE, initializationData,
Format.NO_VALUE, pixelWidthHeightRatio, drmInitData); Format.NO_VALUE, pixelWidthHeightRatio, drmInitData);
} else if (MimeTypes.APPLICATION_SUBRIP.equals(mimeType)) { } else if (MimeTypes.APPLICATION_SUBRIP.equals(mimeType)) {
format = Format.createTextSampleFormat(Integer.toString(trackId), mimeType, Format.NO_VALUE, format = Format.createTextSampleFormat(Integer.toString(trackId), mimeType, null,
selectionFlags, language, drmInitData); Format.NO_VALUE, selectionFlags, language, drmInitData);
} else if (MimeTypes.APPLICATION_VOBSUB.equals(mimeType) } else if (MimeTypes.APPLICATION_VOBSUB.equals(mimeType)
|| MimeTypes.APPLICATION_PGS.equals(mimeType)) { || MimeTypes.APPLICATION_PGS.equals(mimeType)) {
format = Format.createImageSampleFormat(Integer.toString(trackId), mimeType, format = Format.createImageSampleFormat(Integer.toString(trackId), mimeType, null,
Format.NO_VALUE, initializationData, language, drmInitData); Format.NO_VALUE, initializationData, language, drmInitData);
} else { } else {
throw new ParserException("Unexpected MIME type."); throw new ParserException("Unexpected MIME type.");
......
...@@ -125,7 +125,7 @@ public final class Mp3Extractor implements Extractor { ...@@ -125,7 +125,7 @@ public final class Mp3Extractor implements Extractor {
if (seeker == null) { if (seeker == null) {
seeker = setupSeeker(input); seeker = setupSeeker(input);
extractorOutput.seekMap(seeker); extractorOutput.seekMap(seeker);
trackOutput.format(Format.createAudioSampleFormat(null, synchronizedHeader.mimeType, trackOutput.format(Format.createAudioSampleFormat(null, synchronizedHeader.mimeType, null,
Format.NO_VALUE, MpegAudioHeader.MAX_FRAME_SIZE_BYTES, synchronizedHeader.channels, Format.NO_VALUE, MpegAudioHeader.MAX_FRAME_SIZE_BYTES, synchronizedHeader.channels,
synchronizedHeader.sampleRate, Format.NO_VALUE, gaplessInfoHolder.encoderDelay, synchronizedHeader.sampleRate, Format.NO_VALUE, gaplessInfoHolder.encoderDelay,
gaplessInfoHolder.encoderPadding, null, null, 0, null)); gaplessInfoHolder.encoderPadding, null, null, 0, null));
......
...@@ -610,16 +610,16 @@ import java.util.List; ...@@ -610,16 +610,16 @@ import java.util.List;
language, isQuickTime, drmInitData, out, i); language, isQuickTime, drmInitData, out, i);
} else if (childAtomType == Atom.TYPE_TTML) { } else if (childAtomType == Atom.TYPE_TTML) {
out.format = Format.createTextSampleFormat(Integer.toString(trackId), out.format = Format.createTextSampleFormat(Integer.toString(trackId),
MimeTypes.APPLICATION_TTML, Format.NO_VALUE, 0, language, drmInitData); MimeTypes.APPLICATION_TTML, null, Format.NO_VALUE, 0, language, drmInitData);
} else if (childAtomType == Atom.TYPE_tx3g) { } else if (childAtomType == Atom.TYPE_tx3g) {
out.format = Format.createTextSampleFormat(Integer.toString(trackId), out.format = Format.createTextSampleFormat(Integer.toString(trackId),
MimeTypes.APPLICATION_TX3G, Format.NO_VALUE, 0, language, drmInitData); MimeTypes.APPLICATION_TX3G, null, Format.NO_VALUE, 0, language, drmInitData);
} else if (childAtomType == Atom.TYPE_wvtt) { } else if (childAtomType == Atom.TYPE_wvtt) {
out.format = Format.createTextSampleFormat(Integer.toString(trackId), out.format = Format.createTextSampleFormat(Integer.toString(trackId),
MimeTypes.APPLICATION_MP4VTT, Format.NO_VALUE, 0, language, drmInitData); MimeTypes.APPLICATION_MP4VTT, null, Format.NO_VALUE, 0, language, drmInitData);
} else if (childAtomType == Atom.TYPE_stpp) { } else if (childAtomType == Atom.TYPE_stpp) {
out.format = Format.createTextSampleFormat(Integer.toString(trackId), out.format = Format.createTextSampleFormat(Integer.toString(trackId),
MimeTypes.APPLICATION_TTML, Format.NO_VALUE, 0, language, drmInitData, MimeTypes.APPLICATION_TTML, null, Format.NO_VALUE, 0, language, drmInitData,
0 /* subsample timing is absolute */); 0 /* subsample timing is absolute */);
} }
stsd.setPosition(childStartPosition + childAtomSize); stsd.setPosition(childStartPosition + childAtomSize);
...@@ -696,7 +696,7 @@ import java.util.List; ...@@ -696,7 +696,7 @@ import java.util.List;
return; return;
} }
out.format = Format.createVideoSampleFormat(Integer.toString(trackId), mimeType, out.format = Format.createVideoSampleFormat(Integer.toString(trackId), mimeType, null,
Format.NO_VALUE, Format.NO_VALUE, width, height, Format.NO_VALUE, initializationData, Format.NO_VALUE, Format.NO_VALUE, width, height, Format.NO_VALUE, initializationData,
rotationDegrees, pixelWidthHeightRatio, drmInitData); rotationDegrees, pixelWidthHeightRatio, drmInitData);
} }
...@@ -908,7 +908,7 @@ import java.util.List; ...@@ -908,7 +908,7 @@ import java.util.List;
out.format = Ac3Util.parseEAc3AnnexFFormat(parent, Integer.toString(trackId), language, out.format = Ac3Util.parseEAc3AnnexFFormat(parent, Integer.toString(trackId), language,
drmInitData); drmInitData);
} else if (childAtomType == Atom.TYPE_ddts) { } else if (childAtomType == Atom.TYPE_ddts) {
out.format = Format.createAudioSampleFormat(Integer.toString(trackId), mimeType, out.format = Format.createAudioSampleFormat(Integer.toString(trackId), mimeType, null,
Format.NO_VALUE, Format.NO_VALUE, channelCount, sampleRate, null, drmInitData, 0, Format.NO_VALUE, Format.NO_VALUE, channelCount, sampleRate, null, drmInitData, 0,
language); language);
} }
...@@ -919,7 +919,7 @@ import java.util.List; ...@@ -919,7 +919,7 @@ import java.util.List;
// TODO: Determine the correct PCM encoding. // TODO: Determine the correct PCM encoding.
int pcmEncoding = int pcmEncoding =
MimeTypes.AUDIO_RAW.equals(mimeType) ? C.ENCODING_PCM_16BIT : Format.NO_VALUE; MimeTypes.AUDIO_RAW.equals(mimeType) ? C.ENCODING_PCM_16BIT : Format.NO_VALUE;
out.format = Format.createAudioSampleFormat(Integer.toString(trackId), mimeType, out.format = Format.createAudioSampleFormat(Integer.toString(trackId), mimeType, null,
Format.NO_VALUE, Format.NO_VALUE, channelCount, sampleRate, pcmEncoding, Format.NO_VALUE, Format.NO_VALUE, channelCount, sampleRate, pcmEncoding,
initializationData == null ? null : Collections.singletonList(initializationData), initializationData == null ? null : Collections.singletonList(initializationData),
drmInitData, 0, language); drmInitData, 0, language);
......
...@@ -76,9 +76,9 @@ import java.util.List; ...@@ -76,9 +76,9 @@ import java.util.List;
byte[] metadata = Arrays.copyOfRange(data, 9, packet.limit()); byte[] metadata = Arrays.copyOfRange(data, 9, packet.limit());
metadata[4] = (byte) 0x80; // Set the last metadata block flag, ignore the other blocks metadata[4] = (byte) 0x80; // Set the last metadata block flag, ignore the other blocks
List<byte[]> initializationData = Collections.singletonList(metadata); List<byte[]> initializationData = Collections.singletonList(metadata);
setupData.format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_FLAC, Format.NO_VALUE, setupData.format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_FLAC, null,
streamInfo.bitRate(), streamInfo.channels, streamInfo.sampleRate, initializationData, Format.NO_VALUE, streamInfo.bitRate(), streamInfo.channels, streamInfo.sampleRate,
null, 0, null); initializationData, null, 0, null);
} else if ((data[0] & 0x7F) == SEEKTABLE_PACKET_TYPE) { } else if ((data[0] & 0x7F) == SEEKTABLE_PACKET_TYPE) {
flacOggSeeker = new FlacOggSeeker(); flacOggSeeker = new FlacOggSeeker();
flacOggSeeker.parseSeekTable(packet); flacOggSeeker.parseSeekTable(packet);
......
...@@ -80,8 +80,9 @@ import java.util.List; ...@@ -80,8 +80,9 @@ import java.util.List;
putNativeOrderLong(initializationData, preskip); putNativeOrderLong(initializationData, preskip);
putNativeOrderLong(initializationData, DEFAULT_SEEK_PRE_ROLL_SAMPLES); putNativeOrderLong(initializationData, DEFAULT_SEEK_PRE_ROLL_SAMPLES);
setupData.format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_OPUS, Format.NO_VALUE, setupData.format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_OPUS, null,
Format.NO_VALUE, channelCount, SAMPLE_RATE, initializationData, null, 0, "und"); Format.NO_VALUE, Format.NO_VALUE, channelCount, SAMPLE_RATE, initializationData, null, 0,
"und");
headerRead = true; headerRead = true;
} else { } else {
boolean headerPacket = packet.readInt() == OPUS_CODE; boolean headerPacket = packet.readInt() == OPUS_CODE;
......
...@@ -101,7 +101,7 @@ import java.util.ArrayList; ...@@ -101,7 +101,7 @@ import java.util.ArrayList;
codecInitialisationData.add(vorbisSetup.idHeader.data); codecInitialisationData.add(vorbisSetup.idHeader.data);
codecInitialisationData.add(vorbisSetup.setupHeaderData); codecInitialisationData.add(vorbisSetup.setupHeaderData);
setupData.format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_VORBIS, setupData.format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_VORBIS, null,
this.vorbisSetup.idHeader.bitrateNominal, OggPageHeader.MAX_PAGE_PAYLOAD, this.vorbisSetup.idHeader.bitrateNominal, OggPageHeader.MAX_PAGE_PAYLOAD,
this.vorbisSetup.idHeader.channels, (int) this.vorbisSetup.idHeader.sampleRate, this.vorbisSetup.idHeader.channels, (int) this.vorbisSetup.idHeader.sampleRate,
codecInitialisationData, null, 0, null); codecInitialisationData, null, 0, null);
......
...@@ -84,8 +84,8 @@ import java.util.Collections; ...@@ -84,8 +84,8 @@ import java.util.Collections;
public AdtsReader(TrackOutput output, TrackOutput id3Output) { public AdtsReader(TrackOutput output, TrackOutput id3Output) {
super(output); super(output);
this.id3Output = id3Output; this.id3Output = id3Output;
id3Output.format(Format.createSampleFormat(null, MimeTypes.APPLICATION_ID3, Format.NO_VALUE, id3Output.format(Format.createSampleFormat(null, MimeTypes.APPLICATION_ID3, null,
null)); Format.NO_VALUE, null));
adtsScratch = new ParsableBitArray(new byte[HEADER_SIZE + CRC_SIZE]); adtsScratch = new ParsableBitArray(new byte[HEADER_SIZE + CRC_SIZE]);
id3HeaderBuffer = new ParsableByteArray(Arrays.copyOf(ID3_IDENTIFIER, ID3_HEADER_SIZE)); id3HeaderBuffer = new ParsableByteArray(Arrays.copyOf(ID3_IDENTIFIER, ID3_HEADER_SIZE));
setFindingSampleState(); setFindingSampleState();
...@@ -278,8 +278,8 @@ import java.util.Collections; ...@@ -278,8 +278,8 @@ import java.util.Collections;
Pair<Integer, Integer> audioParams = CodecSpecificDataUtil.parseAacAudioSpecificConfig( Pair<Integer, Integer> audioParams = CodecSpecificDataUtil.parseAacAudioSpecificConfig(
audioSpecificConfig); audioSpecificConfig);
Format format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_AAC, Format.NO_VALUE, Format format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_AAC, null,
Format.NO_VALUE, audioParams.second, audioParams.first, Format.NO_VALUE, Format.NO_VALUE, audioParams.second, audioParams.first,
Collections.singletonList(audioSpecificConfig), null, 0, null); Collections.singletonList(audioSpecificConfig), null, 0, null);
// In this class a sample is an access unit, but the MediaFormat sample rate specifies the // In this class a sample is an access unit, but the MediaFormat sample rate specifies the
// number of PCM audio samples per second. // number of PCM audio samples per second.
......
...@@ -189,9 +189,9 @@ import java.util.Collections; ...@@ -189,9 +189,9 @@ import java.util.Collections;
break; break;
} }
Format format = Format.createVideoSampleFormat(null, MimeTypes.VIDEO_MPEG2, Format.NO_VALUE, Format format = Format.createVideoSampleFormat(null, MimeTypes.VIDEO_MPEG2, null,
Format.NO_VALUE, width, height, Format.NO_VALUE, Collections.singletonList(csdData), Format.NO_VALUE, Format.NO_VALUE, width, height, Format.NO_VALUE,
Format.NO_VALUE, pixelWidthHeightRatio, null); Collections.singletonList(csdData), Format.NO_VALUE, pixelWidthHeightRatio, null);
long frameDurationUs = 0; long frameDurationUs = 0;
int frameRateCodeMinusOne = (csdData[7] & 0x0F) - 1; int frameRateCodeMinusOne = (csdData[7] & 0x0F) - 1;
......
...@@ -169,9 +169,9 @@ import java.util.List; ...@@ -169,9 +169,9 @@ import java.util.List;
initializationData.add(Arrays.copyOf(pps.nalData, pps.nalLength)); initializationData.add(Arrays.copyOf(pps.nalData, pps.nalLength));
NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnit(sps.nalData, 3, sps.nalLength); NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnit(sps.nalData, 3, sps.nalLength);
NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnit(pps.nalData, 3, pps.nalLength); NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnit(pps.nalData, 3, pps.nalLength);
output.format(Format.createVideoSampleFormat(null, MimeTypes.VIDEO_H264, Format.NO_VALUE, output.format(Format.createVideoSampleFormat(null, MimeTypes.VIDEO_H264, null,
Format.NO_VALUE, spsData.width, spsData.height, Format.NO_VALUE, initializationData, Format.NO_VALUE, Format.NO_VALUE, spsData.width, spsData.height, Format.NO_VALUE,
Format.NO_VALUE, spsData.pixelWidthAspectRatio, null)); initializationData, Format.NO_VALUE, spsData.pixelWidthAspectRatio, null));
hasOutputFormat = true; hasOutputFormat = true;
sampleReader.putSps(spsData); sampleReader.putSps(spsData);
sampleReader.putPps(ppsData); sampleReader.putPps(ppsData);
......
...@@ -308,7 +308,7 @@ import java.util.Collections; ...@@ -308,7 +308,7 @@ import java.util.Collections;
} }
} }
return Format.createVideoSampleFormat(null, MimeTypes.VIDEO_H265, Format.NO_VALUE, return Format.createVideoSampleFormat(null, MimeTypes.VIDEO_H265, null, Format.NO_VALUE,
Format.NO_VALUE, picWidthInLumaSamples, picHeightInLumaSamples, Format.NO_VALUE, Format.NO_VALUE, picWidthInLumaSamples, picHeightInLumaSamples, Format.NO_VALUE,
Collections.singletonList(csd), Format.NO_VALUE, pixelWidthHeightRatio, null); Collections.singletonList(csd), Format.NO_VALUE, pixelWidthHeightRatio, null);
} }
......
...@@ -40,7 +40,7 @@ import com.google.android.exoplayer.util.ParsableByteArray; ...@@ -40,7 +40,7 @@ import com.google.android.exoplayer.util.ParsableByteArray;
public Id3Reader(TrackOutput output) { public Id3Reader(TrackOutput output) {
super(output); super(output);
output.format(Format.createSampleFormat(null, MimeTypes.APPLICATION_ID3, Format.NO_VALUE, output.format(Format.createSampleFormat(null, MimeTypes.APPLICATION_ID3, null, Format.NO_VALUE,
null)); null));
id3Header = new ParsableByteArray(ID3_HEADER_SIZE); id3Header = new ParsableByteArray(ID3_HEADER_SIZE);
} }
......
...@@ -162,7 +162,7 @@ import com.google.android.exoplayer.util.ParsableByteArray; ...@@ -162,7 +162,7 @@ import com.google.android.exoplayer.util.ParsableByteArray;
frameSize = header.frameSize; frameSize = header.frameSize;
if (!hasOutputFormat) { if (!hasOutputFormat) {
frameDurationUs = (C.MICROS_PER_SECOND * header.samplesPerFrame) / header.sampleRate; frameDurationUs = (C.MICROS_PER_SECOND * header.samplesPerFrame) / header.sampleRate;
Format format = Format.createAudioSampleFormat(null, header.mimeType, Format.NO_VALUE, Format format = Format.createAudioSampleFormat(null, header.mimeType, null, Format.NO_VALUE,
MpegAudioHeader.MAX_FRAME_SIZE_BYTES, header.channels, header.sampleRate, null, null, 0, MpegAudioHeader.MAX_FRAME_SIZE_BYTES, header.channels, header.sampleRate, null, null, 0,
null); null);
output.format(format); output.format(format);
......
...@@ -31,8 +31,8 @@ import com.google.android.exoplayer.util.ParsableByteArray; ...@@ -31,8 +31,8 @@ import com.google.android.exoplayer.util.ParsableByteArray;
public SeiReader(TrackOutput output) { public SeiReader(TrackOutput output) {
this.output = output; this.output = output;
output.format(Format.createTextSampleFormat(null, MimeTypes.APPLICATION_EIA608, Format.NO_VALUE, output.format(Format.createTextSampleFormat(null, MimeTypes.APPLICATION_EIA608, null,
0, null, null)); Format.NO_VALUE, 0, null, null));
} }
public void consume(long pesTimeUs, ParsableByteArray seiBuffer) { public void consume(long pesTimeUs, ParsableByteArray seiBuffer) {
......
...@@ -72,7 +72,7 @@ public final class WavExtractor implements Extractor, SeekMap { ...@@ -72,7 +72,7 @@ public final class WavExtractor implements Extractor, SeekMap {
// Should only happen if the media wasn't sniffed. // Should only happen if the media wasn't sniffed.
throw new ParserException("Unsupported or unrecognized wav header."); throw new ParserException("Unsupported or unrecognized wav header.");
} }
Format format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_RAW, Format format = Format.createAudioSampleFormat(null, MimeTypes.AUDIO_RAW, null,
wavHeader.getBitrate(), MAX_INPUT_SIZE, wavHeader.getNumChannels(), wavHeader.getBitrate(), MAX_INPUT_SIZE, wavHeader.getNumChannels(),
wavHeader.getSampleRateHz(), wavHeader.getEncoding(), null, null, 0, null); wavHeader.getSampleRateHz(), wavHeader.getEncoding(), null, null, 0, null);
trackOutput.format(format); trackOutput.format(format);
......
...@@ -165,8 +165,8 @@ import java.util.regex.Pattern; ...@@ -165,8 +165,8 @@ import java.util.regex.Pattern;
private TrackOutput buildTrackOutput(long subsampleOffsetUs) { private TrackOutput buildTrackOutput(long subsampleOffsetUs) {
TrackOutput trackOutput = output.track(0); TrackOutput trackOutput = output.track(0);
trackOutput.format(Format.createTextSampleFormat(null, MimeTypes.TEXT_VTT, Format.NO_VALUE, 0, trackOutput.format(Format.createTextSampleFormat(null, MimeTypes.TEXT_VTT, null,
language, null, subsampleOffsetUs)); Format.NO_VALUE, 0, language, null, subsampleOffsetUs));
output.endTracks(); output.endTracks();
return trackOutput; return trackOutput;
} }
......
...@@ -168,7 +168,7 @@ public final class HlsPlaylistParser implements UriLoadable.Parser<HlsPlaylist> ...@@ -168,7 +168,7 @@ public final class HlsPlaylistParser implements UriLoadable.Parser<HlsPlaylist>
String captionName = HlsParserUtil.parseStringAttr(line, NAME_ATTR_REGEX, NAME_ATTR); String captionName = HlsParserUtil.parseStringAttr(line, NAME_ATTR_REGEX, NAME_ATTR);
String language = HlsParserUtil.parseOptionalStringAttr(line, LANGUAGE_ATTR_REGEX); String language = HlsParserUtil.parseOptionalStringAttr(line, LANGUAGE_ATTR_REGEX);
muxedCaptionFormat = Format.createTextContainerFormat(captionName, muxedCaptionFormat = Format.createTextContainerFormat(captionName,
MimeTypes.APPLICATION_M3U8, MimeTypes.APPLICATION_EIA608, -1, 0, language); MimeTypes.APPLICATION_M3U8, MimeTypes.APPLICATION_EIA608, null, -1, 0, language);
} }
} else if (SUBTITLES_TYPE.equals(type)) { } else if (SUBTITLES_TYPE.equals(type)) {
// We assume all subtitles belong to the same group. // We assume all subtitles belong to the same group.
...@@ -176,7 +176,7 @@ public final class HlsPlaylistParser implements UriLoadable.Parser<HlsPlaylist> ...@@ -176,7 +176,7 @@ public final class HlsPlaylistParser implements UriLoadable.Parser<HlsPlaylist>
String uri = HlsParserUtil.parseStringAttr(line, URI_ATTR_REGEX, URI_ATTR); String uri = HlsParserUtil.parseStringAttr(line, URI_ATTR_REGEX, URI_ATTR);
String language = HlsParserUtil.parseOptionalStringAttr(line, LANGUAGE_ATTR_REGEX); String language = HlsParserUtil.parseOptionalStringAttr(line, LANGUAGE_ATTR_REGEX);
Format format = Format.createTextContainerFormat(subtitleName, MimeTypes.APPLICATION_M3U8, Format format = Format.createTextContainerFormat(subtitleName, MimeTypes.APPLICATION_M3U8,
MimeTypes.TEXT_VTT, bitrate, 0, language); MimeTypes.TEXT_VTT, null, bitrate, 0, language);
subtitles.add(new Variant(uri, format, codecs)); subtitles.add(new Variant(uri, format, codecs));
} else if (AUDIO_TYPE.equals(type)) { } else if (AUDIO_TYPE.equals(type)) {
// We assume all audios belong to the same group. // We assume all audios belong to the same group.
...@@ -185,7 +185,7 @@ public final class HlsPlaylistParser implements UriLoadable.Parser<HlsPlaylist> ...@@ -185,7 +185,7 @@ public final class HlsPlaylistParser implements UriLoadable.Parser<HlsPlaylist>
String audioName = HlsParserUtil.parseStringAttr(line, NAME_ATTR_REGEX, NAME_ATTR); String audioName = HlsParserUtil.parseStringAttr(line, NAME_ATTR_REGEX, NAME_ATTR);
int audioBitrate = uri != null ? bitrate : -1; int audioBitrate = uri != null ? bitrate : -1;
Format format = Format.createAudioContainerFormat(audioName, MimeTypes.APPLICATION_M3U8, Format format = Format.createAudioContainerFormat(audioName, MimeTypes.APPLICATION_M3U8,
null, audioBitrate, -1, -1, null, 0, language); null, null, audioBitrate, -1, -1, null, 0, language);
if (uri != null) { if (uri != null) {
audios.add(new Variant(uri, format, codecs)); audios.add(new Variant(uri, format, codecs));
} else { } else {
...@@ -220,7 +220,7 @@ public final class HlsPlaylistParser implements UriLoadable.Parser<HlsPlaylist> ...@@ -220,7 +220,7 @@ public final class HlsPlaylistParser implements UriLoadable.Parser<HlsPlaylist>
name = Integer.toString(variants.size()); name = Integer.toString(variants.size());
} }
Format format = Format.createVideoContainerFormat(name, MimeTypes.APPLICATION_M3U8, null, Format format = Format.createVideoContainerFormat(name, MimeTypes.APPLICATION_M3U8, null,
bitrate, width, height, Format.NO_VALUE, null); null, bitrate, width, height, Format.NO_VALUE, null);
variants.add(new Variant(line, format, codecs)); variants.add(new Variant(line, format, codecs));
bitrate = 0; bitrate = 0;
codecs = null; codecs = null;
......
...@@ -631,8 +631,8 @@ public class SmoothStreamingManifestParser implements UriLoadable.Parser<SmoothS ...@@ -631,8 +631,8 @@ public class SmoothStreamingManifestParser implements UriLoadable.Parser<SmoothS
int height = parseRequiredInt(parser, KEY_MAX_HEIGHT); int height = parseRequiredInt(parser, KEY_MAX_HEIGHT);
List<byte[]> codecSpecificData = buildCodecSpecificData( List<byte[]> codecSpecificData = buildCodecSpecificData(
parser.getAttributeValue(null, KEY_CODEC_PRIVATE_DATA)); parser.getAttributeValue(null, KEY_CODEC_PRIVATE_DATA));
format = Format.createVideoContainerFormat(id, MimeTypes.VIDEO_MP4, sampleMimeType, bitrate, format = Format.createVideoContainerFormat(id, MimeTypes.VIDEO_MP4, sampleMimeType, null,
width, height, Format.NO_VALUE, codecSpecificData); bitrate, width, height, Format.NO_VALUE, codecSpecificData);
} else if (type == C.TRACK_TYPE_AUDIO) { } else if (type == C.TRACK_TYPE_AUDIO) {
sampleMimeType = sampleMimeType == null ? MimeTypes.AUDIO_AAC : sampleMimeType; sampleMimeType = sampleMimeType == null ? MimeTypes.AUDIO_AAC : sampleMimeType;
int channels = parseRequiredInt(parser, KEY_CHANNELS); int channels = parseRequiredInt(parser, KEY_CHANNELS);
...@@ -640,12 +640,12 @@ public class SmoothStreamingManifestParser implements UriLoadable.Parser<SmoothS ...@@ -640,12 +640,12 @@ public class SmoothStreamingManifestParser implements UriLoadable.Parser<SmoothS
List<byte[]> codecSpecificData = buildCodecSpecificData( List<byte[]> codecSpecificData = buildCodecSpecificData(
parser.getAttributeValue(null, KEY_CODEC_PRIVATE_DATA)); parser.getAttributeValue(null, KEY_CODEC_PRIVATE_DATA));
String language = (String) getNormalizedAttribute(KEY_LANGUAGE); String language = (String) getNormalizedAttribute(KEY_LANGUAGE);
format = Format.createAudioContainerFormat(id, MimeTypes.AUDIO_MP4, sampleMimeType, bitrate, format = Format.createAudioContainerFormat(id, MimeTypes.AUDIO_MP4, sampleMimeType, null,
channels, samplingRate, codecSpecificData, 0, language); bitrate, channels, samplingRate, codecSpecificData, 0, language);
} else if (type == C.TRACK_TYPE_TEXT) { } else if (type == C.TRACK_TYPE_TEXT) {
String language = (String) getNormalizedAttribute(KEY_LANGUAGE); String language = (String) getNormalizedAttribute(KEY_LANGUAGE);
format = Format.createTextContainerFormat(id, MimeTypes.APPLICATION_MP4, sampleMimeType, format = Format.createTextContainerFormat(id, MimeTypes.APPLICATION_MP4, sampleMimeType,
bitrate, 0, language); null, bitrate, 0, language);
} else { } else {
format = Format.createContainerFormat(id, MimeTypes.APPLICATION_MP4, sampleMimeType, format = Format.createContainerFormat(id, MimeTypes.APPLICATION_MP4, sampleMimeType,
bitrate); bitrate);
......
...@@ -79,7 +79,7 @@ public final class Ac3Util { ...@@ -79,7 +79,7 @@ public final class Ac3Util {
if ((nextByte & 0x04) != 0) { // lfeon if ((nextByte & 0x04) != 0) { // lfeon
channelCount++; channelCount++;
} }
return Format.createAudioSampleFormat(trackId, MimeTypes.AUDIO_AC3, Format.NO_VALUE, return Format.createAudioSampleFormat(trackId, MimeTypes.AUDIO_AC3, null, Format.NO_VALUE,
Format.NO_VALUE, channelCount, sampleRate, null, drmInitData, 0, language); Format.NO_VALUE, channelCount, sampleRate, null, drmInitData, 0, language);
} }
...@@ -106,7 +106,7 @@ public final class Ac3Util { ...@@ -106,7 +106,7 @@ public final class Ac3Util {
if ((nextByte & 0x01) != 0) { // lfeon if ((nextByte & 0x01) != 0) { // lfeon
channelCount++; channelCount++;
} }
return Format.createAudioSampleFormat(trackId, MimeTypes.AUDIO_E_AC3, Format.NO_VALUE, return Format.createAudioSampleFormat(trackId, MimeTypes.AUDIO_E_AC3, null, Format.NO_VALUE,
Format.NO_VALUE, channelCount, sampleRate, null, drmInitData, 0, language); Format.NO_VALUE, channelCount, sampleRate, null, drmInitData, 0, language);
} }
...@@ -136,7 +136,7 @@ public final class Ac3Util { ...@@ -136,7 +136,7 @@ public final class Ac3Util {
data.skipBits(2); // dsurmod data.skipBits(2); // dsurmod
} }
boolean lfeon = data.readBit(); boolean lfeon = data.readBit();
return Format.createAudioSampleFormat(trackId, MimeTypes.AUDIO_AC3, Format.NO_VALUE, return Format.createAudioSampleFormat(trackId, MimeTypes.AUDIO_AC3, null, Format.NO_VALUE,
Format.NO_VALUE, CHANNEL_COUNT_BY_ACMOD[acmod] + (lfeon ? 1 : 0), Format.NO_VALUE, CHANNEL_COUNT_BY_ACMOD[acmod] + (lfeon ? 1 : 0),
SAMPLE_RATE_BY_FSCOD[fscod], null, drmInitData, 0, language); SAMPLE_RATE_BY_FSCOD[fscod], null, drmInitData, 0, language);
} }
...@@ -164,7 +164,7 @@ public final class Ac3Util { ...@@ -164,7 +164,7 @@ public final class Ac3Util {
} }
int acmod = data.readBits(3); int acmod = data.readBits(3);
boolean lfeon = data.readBit(); boolean lfeon = data.readBit();
return Format.createAudioSampleFormat(trackId, MimeTypes.AUDIO_E_AC3, Format.NO_VALUE, return Format.createAudioSampleFormat(trackId, MimeTypes.AUDIO_E_AC3, null, Format.NO_VALUE,
Format.NO_VALUE, CHANNEL_COUNT_BY_ACMOD[acmod] + (lfeon ? 1 : 0), sampleRate, null, Format.NO_VALUE, CHANNEL_COUNT_BY_ACMOD[acmod] + (lfeon ? 1 : 0), sampleRate, null,
drmInitData, 0, language); drmInitData, 0, language);
} }
......
...@@ -72,8 +72,8 @@ public final class DtsUtil { ...@@ -72,8 +72,8 @@ public final class DtsUtil {
: TWICE_BITRATE_KBPS_BY_RATE[rate] * 1000 / 2; : TWICE_BITRATE_KBPS_BY_RATE[rate] * 1000 / 2;
frameBits.skipBits(10); // MIX, DYNF, TIMEF, AUXF, HDCD, EXT_AUDIO_ID, EXT_AUDIO, ASPF frameBits.skipBits(10); // MIX, DYNF, TIMEF, AUXF, HDCD, EXT_AUDIO_ID, EXT_AUDIO, ASPF
channelCount += frameBits.readBits(2) > 0 ? 1 : 0; // LFF channelCount += frameBits.readBits(2) > 0 ? 1 : 0; // LFF
return Format.createAudioSampleFormat(trackId, MimeTypes.AUDIO_DTS, bitrate, Format.NO_VALUE, return Format.createAudioSampleFormat(trackId, MimeTypes.AUDIO_DTS, null, bitrate,
channelCount, sampleRate, null, drmInitData, 0, language); Format.NO_VALUE, channelCount, sampleRate, null, drmInitData, 0, language);
} }
/** /**
......
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