Merge "Populate some missing fields in TrackData" into rvc-dev am: 26e55eb8ab

Change-Id: I3f6b21703b00a4189cca15de7d572cd3bf0d17bb
This commit is contained in:
Santiago Seifert
2020-04-17 17:37:58 +00:00
committed by Automerger Merge Worker

View File

@@ -22,12 +22,14 @@ import android.annotation.Nullable;
import android.annotation.StringDef; import android.annotation.StringDef;
import android.media.MediaCodec.CryptoInfo; import android.media.MediaCodec.CryptoInfo;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log;
import android.util.Pair; import android.util.Pair;
import android.util.SparseArray; import android.util.SparseArray;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
import com.google.android.exoplayer2.extractor.DefaultExtractorInput; import com.google.android.exoplayer2.extractor.DefaultExtractorInput;
import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.Extractor;
import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.ExtractorInput;
@@ -59,6 +61,8 @@ import java.io.EOFException;
import java.io.IOException; import java.io.IOException;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -66,6 +70,7 @@ import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.UUID;
/** /**
* Parses media container formats and extracts contained media samples and metadata. * Parses media container formats and extracts contained media samples and metadata.
@@ -707,11 +712,14 @@ public final class MediaParser {
// Private constants. // Private constants.
private static final String TAG = "MediaParser";
private static final Map<String, ExtractorFactory> EXTRACTOR_FACTORIES_BY_NAME; private static final Map<String, ExtractorFactory> EXTRACTOR_FACTORIES_BY_NAME;
private static final Map<String, Class> EXPECTED_TYPE_BY_PARAMETER_NAME; private static final Map<String, Class> EXPECTED_TYPE_BY_PARAMETER_NAME;
private static final String TS_MODE_SINGLE_PMT = "single_pmt"; private static final String TS_MODE_SINGLE_PMT = "single_pmt";
private static final String TS_MODE_MULTI_PMT = "multi_pmt"; private static final String TS_MODE_MULTI_PMT = "multi_pmt";
private static final String TS_MODE_HLS = "hls"; private static final String TS_MODE_HLS = "hls";
@Nullable
private static final Constructor<DrmInitData.SchemeInitData> SCHEME_INIT_DATA_CONSTRUCTOR;
// Instance creation methods. // Instance creation methods.
@@ -851,6 +859,7 @@ public final class MediaParser {
private ExtractorInput mExtractorInput; private ExtractorInput mExtractorInput;
private long mPendingSeekPosition; private long mPendingSeekPosition;
private long mPendingSeekTimeMicros; private long mPendingSeekTimeMicros;
private boolean mLoggedSchemeInitDataCreationException;
// Public methods. // Public methods.
@@ -1187,6 +1196,47 @@ public final class MediaParser {
} }
} }
private static final class MediaParserDrmInitData extends DrmInitData {
private final SchemeInitData[] mSchemeDatas;
private MediaParserDrmInitData(com.google.android.exoplayer2.drm.DrmInitData exoDrmInitData)
throws IllegalAccessException, InstantiationException, InvocationTargetException {
mSchemeDatas = new SchemeInitData[exoDrmInitData.schemeDataCount];
for (int i = 0; i < mSchemeDatas.length; i++) {
mSchemeDatas[i] = toFrameworkSchemeInitData(exoDrmInitData.get(i));
}
}
@Override
@Nullable
public SchemeInitData get(UUID schemeUuid) {
for (SchemeInitData schemeInitData : mSchemeDatas) {
if (schemeInitData.uuid.equals(schemeUuid)) {
return schemeInitData;
}
}
return null;
}
@Override
public SchemeInitData getSchemeInitDataAt(int index) {
return mSchemeDatas[index];
}
@Override
public int getSchemeInitDataCount() {
return mSchemeDatas.length;
}
private static DrmInitData.SchemeInitData toFrameworkSchemeInitData(
SchemeData exoSchemeData)
throws IllegalAccessException, InvocationTargetException, InstantiationException {
return SCHEME_INIT_DATA_CONSTRUCTOR.newInstance(
exoSchemeData.uuid, exoSchemeData.mimeType, exoSchemeData.data);
}
}
private final class ExtractorOutputAdapter implements ExtractorOutput { private final class ExtractorOutputAdapter implements ExtractorOutput {
private final SparseArray<TrackOutput> mTrackOutputAdapters; private final SparseArray<TrackOutput> mTrackOutputAdapters;
@@ -1373,6 +1423,8 @@ public final class MediaParser {
setOptionalMediaFormatInt(result, MediaFormat.KEY_PCM_ENCODING, format.pcmEncoding); setOptionalMediaFormatInt(result, MediaFormat.KEY_PCM_ENCODING, format.pcmEncoding);
setOptionalMediaFormatInt(result, MediaFormat.KEY_ROTATION, format.rotationDegrees); setOptionalMediaFormatInt(result, MediaFormat.KEY_ROTATION, format.rotationDegrees);
setOptionalMediaFormatInt(result, MediaFormat.KEY_SAMPLE_RATE, format.sampleRate); setOptionalMediaFormatInt(result, MediaFormat.KEY_SAMPLE_RATE, format.sampleRate);
setOptionalMediaFormatInt(
result, MediaFormat.KEY_CAPTION_SERVICE_NUMBER, format.accessibilityChannel);
int selectionFlags = format.selectionFlags; int selectionFlags = format.selectionFlags;
result.setInteger( result.setInteger(
@@ -1398,15 +1450,16 @@ public final class MediaParser {
result.setInteger(MediaFormat.KEY_PIXEL_ASPECT_RATIO_HEIGHT, parHeight); result.setInteger(MediaFormat.KEY_PIXEL_ASPECT_RATIO_HEIGHT, parHeight);
result.setFloat("pixel-width-height-ratio-float", format.pixelWidthHeightRatio); result.setFloat("pixel-width-height-ratio-float", format.pixelWidthHeightRatio);
} }
if (format.drmInitData != null) {
// The crypto mode is propagated along with sample metadata. We also include it in the
// format for convenient use from ExoPlayer.
result.setString("crypto-mode-fourcc", format.drmInitData.schemeType);
}
// LACK OF SUPPORT FOR: // LACK OF SUPPORT FOR:
// format.accessibilityChannel;
// format.containerMimeType; // format.containerMimeType;
// format.id; // format.id;
// format.metadata; // format.metadata;
// format.roleFlags;
// format.stereoMode; // format.stereoMode;
// format.subsampleOffsetUs;
return result; return result;
} }
@@ -1423,11 +1476,20 @@ public final class MediaParser {
} }
} }
private static DrmInitData toFrameworkDrmInitData( private DrmInitData toFrameworkDrmInitData(
com.google.android.exoplayer2.drm.DrmInitData drmInitData) { com.google.android.exoplayer2.drm.DrmInitData exoDrmInitData) {
// TODO: Implement. try {
return exoDrmInitData != null && SCHEME_INIT_DATA_CONSTRUCTOR != null
? new MediaParserDrmInitData(exoDrmInitData)
: null;
} catch (Throwable e) {
if (!mLoggedSchemeInitDataCreationException) {
mLoggedSchemeInitDataCreationException = true;
Log.e(TAG, "Unable to create SchemeInitData instance.");
}
return null; return null;
} }
}
private static CryptoInfo toCryptoInfo(TrackOutput.CryptoData encryptionData) { private static CryptoInfo toCryptoInfo(TrackOutput.CryptoData encryptionData) {
// TODO: Implement. // TODO: Implement.
@@ -1496,5 +1558,17 @@ public final class MediaParser {
expectedTypeByParameterName.put(PARAMETER_TS_DETECT_ACCESS_UNITS, Boolean.class); expectedTypeByParameterName.put(PARAMETER_TS_DETECT_ACCESS_UNITS, Boolean.class);
expectedTypeByParameterName.put(PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS, Boolean.class); expectedTypeByParameterName.put(PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS, Boolean.class);
EXPECTED_TYPE_BY_PARAMETER_NAME = Collections.unmodifiableMap(expectedTypeByParameterName); EXPECTED_TYPE_BY_PARAMETER_NAME = Collections.unmodifiableMap(expectedTypeByParameterName);
// TODO: Use constructor statically when available.
Constructor<DrmInitData.SchemeInitData> constructor;
try {
constructor =
DrmInitData.SchemeInitData.class.getConstructor(
UUID.class, String.class, byte[].class);
} catch (Throwable e) {
Log.e(TAG, "Unable to get SchemeInitData constructor.");
constructor = null;
}
SCHEME_INIT_DATA_CONSTRUCTOR = constructor;
} }
} }