Merge "Add parameters for HLS usage" into rvc-dev am: 98bcac2e9b am: 511eb2bd52

Change-Id: Ib7ee023cce8dcdec0eb275bce5e1535b454c2207
This commit is contained in:
Santiago Seifert
2020-05-29 13:33:05 +00:00
committed by Automerger Merge Worker

View File

@@ -55,6 +55,7 @@ import com.google.android.exoplayer2.extractor.ts.TsExtractor;
import com.google.android.exoplayer2.extractor.wav.WavExtractor;
import com.google.android.exoplayer2.upstream.DataReader;
import com.google.android.exoplayer2.util.ParsableByteArray;
import com.google.android.exoplayer2.util.TimestampAdjuster;
import com.google.android.exoplayer2.util.Util;
import com.google.android.exoplayer2.video.ColorInfo;
@@ -759,7 +760,6 @@ public final class MediaParser {
*/
public static final String PARAMETER_IN_BAND_CRYPTO_INFO =
"android.media.mediaparser.inBandCryptoInfo";
/**
* Sets whether supplemental data should be included as part of the sample data. {@code boolean}
* expected. Default value is {@code false}. See {@link #SAMPLE_FLAG_HAS_SUPPLEMENTAL_DATA} for
@@ -769,6 +769,31 @@ public final class MediaParser {
*/
public static final String PARAMETER_INCLUDE_SUPPLEMENTAL_DATA =
"android.media.mediaparser.includeSupplementalData";
/**
* Sets whether sample timestamps may start from non-zero offsets. {@code boolean} expected.
* Default value is {@code false}.
*
* <p>When set to true, sample timestamps will not be offset to start from zero, and the media
* provided timestamps will be used instead. For example, transport stream sample timestamps
* will not be converted to a zero-based timebase.
*
* @hide
*/
public static final String PARAMETER_IGNORE_TIMESTAMP_OFFSET =
"android.media.mediaparser.ignoreTimestampOffset";
/**
* Sets whether each track type should be eagerly exposed. {@code boolean} expected. Default
* value is {@code false}.
*
* <p>When set to true, each track type will be eagerly exposed through a call to {@link
* OutputConsumer#onTrackDataFound} containing a single-value {@link MediaFormat}. The key for
* the track type is {@code "track-type-string"}, and the possible values are {@code "video"},
* {@code "audio"}, {@code "text"}, {@code "metadata"}, and {@code "unknown"}.
*
* @hide
*/
public static final String PARAMETER_EAGERLY_EXPOSE_TRACKTYPE =
"android.media.mediaparser.eagerlyExposeTrackType";
// Private constants.
@@ -930,6 +955,8 @@ public final class MediaParser {
@Nullable private final Constructor<DrmInitData.SchemeInitData> mSchemeInitDataConstructor;
private boolean mInBandCryptoInfo;
private boolean mIncludeSupplementalData;
private boolean mIgnoreTimestampOffset;
private boolean mEagerlyExposeTrackType;
private String mParserName;
private Extractor mExtractor;
private ExtractorInput mExtractorInput;
@@ -983,6 +1010,12 @@ public final class MediaParser {
if (PARAMETER_INCLUDE_SUPPLEMENTAL_DATA.equals(parameterName)) {
mIncludeSupplementalData = (boolean) value;
}
if (PARAMETER_IGNORE_TIMESTAMP_OFFSET.equals(parameterName)) {
mIgnoreTimestampOffset = (boolean) value;
}
if (PARAMETER_EAGERLY_EXPOSE_TRACKTYPE.equals(parameterName)) {
mEagerlyExposeTrackType = (boolean) value;
}
mParserParameters.put(parameterName, value);
return this;
}
@@ -1159,6 +1192,10 @@ public final class MediaParser {
private Extractor createExtractor(String parserName) {
int flags = 0;
TimestampAdjuster timestampAdjuster = null;
if (mIgnoreTimestampOffset) {
timestampAdjuster = new TimestampAdjuster(TimestampAdjuster.DO_NOT_OFFSET);
}
switch (parserName) {
case PARSER_NAME_MATROSKA:
flags =
@@ -1180,7 +1217,7 @@ public final class MediaParser {
? FragmentedMp4Extractor
.FLAG_WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME
: 0;
return new FragmentedMp4Extractor(flags);
return new FragmentedMp4Extractor(flags, timestampAdjuster);
case PARSER_NAME_MP4:
flags |=
getBooleanParameter(PARAMETER_MP4_IGNORE_EDIT_LISTS)
@@ -1238,7 +1275,12 @@ public final class MediaParser {
: TS_MODE_HLS.equals(tsMode)
? TsExtractor.MODE_HLS
: TsExtractor.MODE_MULTI_PMT;
return new TsExtractor(hlsMode, flags);
return new TsExtractor(
hlsMode,
timestampAdjuster != null
? timestampAdjuster
: new TimestampAdjuster(/* firstSampleTimestampUs= */ 0),
new DefaultTsPayloadReaderFactory(flags));
case PARSER_NAME_FLV:
return new FlvExtractor();
case PARSER_NAME_OGG:
@@ -1340,8 +1382,15 @@ public final class MediaParser {
public TrackOutput track(int id, int type) {
TrackOutput trackOutput = mTrackOutputAdapters.get(id);
if (trackOutput == null) {
trackOutput = new TrackOutputAdapter(mTrackOutputAdapters.size());
int trackIndex = mTrackOutputAdapters.size();
trackOutput = new TrackOutputAdapter(trackIndex);
mTrackOutputAdapters.put(id, trackOutput);
if (mEagerlyExposeTrackType) {
MediaFormat mediaFormat = new MediaFormat();
mediaFormat.setString("track-type-string", toTypeString(type));
mOutputConsumer.onTrackDataFound(
trackIndex, new TrackData(mediaFormat, /* drmInitData= */ null));
}
}
return trackOutput;
}
@@ -1662,6 +1711,21 @@ public final class MediaParser {
return result;
}
private static String toTypeString(int type) {
switch (type) {
case C.TRACK_TYPE_VIDEO:
return "video";
case C.TRACK_TYPE_AUDIO:
return "audio";
case C.TRACK_TYPE_TEXT:
return "text";
case C.TRACK_TYPE_METADATA:
return "metadata";
default:
return "unknown";
}
}
private static void setPcmEncoding(Format format, MediaFormat result) {
int exoPcmEncoding = format.pcmEncoding;
setOptionalMediaFormatInt(result, "exo-pcm-encoding", format.pcmEncoding);
@@ -1800,6 +1864,8 @@ public final class MediaParser {
expectedTypeByParameterName.put(PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS, Boolean.class);
expectedTypeByParameterName.put(PARAMETER_IN_BAND_CRYPTO_INFO, Boolean.class);
expectedTypeByParameterName.put(PARAMETER_INCLUDE_SUPPLEMENTAL_DATA, Boolean.class);
expectedTypeByParameterName.put(PARAMETER_IGNORE_TIMESTAMP_OFFSET, Boolean.class);
expectedTypeByParameterName.put(PARAMETER_EAGERLY_EXPOSE_TRACKTYPE, Boolean.class);
EXPECTED_TYPE_BY_PARAMETER_NAME = Collections.unmodifiableMap(expectedTypeByParameterName);
}
}