/** Returns a {@link MediaFormat} built using the information in this instance. */
public MediaFormat getMediaFormat(long durationUs) throws ParserException {
String mimeType;
List initializationData = null;
int maxInputSize = UNKNOWN;
switch (codecId) {
case CODEC_ID_VP8:
mimeType = MimeTypes.VIDEO_VP8;
break;
case CODEC_ID_VP9:
mimeType = MimeTypes.VIDEO_VP9;
break;
case CODEC_ID_MPEG4_SP:
case CODEC_ID_MPEG4_ASP:
case CODEC_ID_MPEG4_AP:
mimeType = MimeTypes.VIDEO_MP4V;
initializationData =
codecPrivate == null ? null : Collections.singletonList(codecPrivate);
break;
case CODEC_ID_H264:
mimeType = MimeTypes.VIDEO_H264;
Pair, Integer> h264Data = parseAvcCodecPrivate(
new ParsableByteArray(codecPrivate));
initializationData = h264Data.first;
nalUnitLengthFieldLength = h264Data.second;
break;
case CODEC_ID_H265:
mimeType = MimeTypes.VIDEO_H265;
Pair, Integer> hevcData = parseHevcCodecPrivate(
new ParsableByteArray(codecPrivate));
initializationData = hevcData.first;
nalUnitLengthFieldLength = hevcData.second;
break;
case CODEC_ID_VORBIS:
mimeType = MimeTypes.AUDIO_VORBIS;
maxInputSize = VORBIS_MAX_INPUT_SIZE;
initializationData = parseVorbisCodecPrivate(codecPrivate);
break;
case CODEC_ID_OPUS:
mimeType = MimeTypes.AUDIO_OPUS;
maxInputSize = OPUS_MAX_INPUT_SIZE;
initializationData = new ArrayList<>(3);
initializationData.add(codecPrivate);
initializationData.add(ByteBuffer.allocate(Long.SIZE).putLong(codecDelayNs).array());
initializationData.add(ByteBuffer.allocate(Long.SIZE).putLong(seekPreRollNs).array());
break;
case CODEC_ID_AAC:
mimeType = MimeTypes.AUDIO_AAC;
initializationData = Collections.singletonList(codecPrivate);
break;
case CODEC_ID_MP3:
maxInputSize = MP3_MAX_INPUT_SIZE;
mimeType = MimeTypes.AUDIO_MPEG;
break;
case CODEC_ID_AC3:
mimeType = MimeTypes.AUDIO_AC3;
break;
default:
throw new ParserException("Unrecognized codec identifier.");
}
if (MimeTypes.isAudio(mimeType)) {
return MediaFormat.createAudioFormat(mimeType, maxInputSize, durationUs, channelCount,
sampleRate, initializationData);
} else if (MimeTypes.isVideo(mimeType)) {
return MediaFormat.createVideoFormat(mimeType, maxInputSize, durationUs, pixelWidth,
pixelHeight, initializationData);
} else {
throw new ParserException("Unexpected MIME type.");
}
}