Merge "Support psshs with matching UUID in DrmInitData"

This commit is contained in:
Santiago Seifert
2020-02-18 15:10:04 +00:00
committed by Android (Google) Code Review
3 changed files with 76 additions and 12 deletions

View File

@@ -24793,11 +24793,15 @@ package android.media {
public abstract class DrmInitData {
method public abstract android.media.DrmInitData.SchemeInitData get(java.util.UUID);
method @NonNull public android.media.DrmInitData.SchemeInitData getSchemeInitDataAt(int);
method public int getSchemeInitDataCount();
}
public static final class DrmInitData.SchemeInitData {
field @NonNull public static final java.util.UUID UUID_NIL;
field public final byte[] data;
field public final String mimeType;
field @NonNull public final java.util.UUID uuid;
}
public class ExifInterface {

View File

@@ -15,11 +15,10 @@
*/
package android.media;
import android.annotation.NonNull;
import android.media.MediaDrm;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
/**
@@ -41,11 +40,41 @@ public abstract class DrmInitData {
*/
public abstract SchemeInitData get(UUID schemeUuid);
/**
* Returns the number of {@link SchemeInitData} elements available through {@link
* #getSchemeInitDataAt}.
*/
public int getSchemeInitDataCount() {
return 0;
}
/**
* Returns the {@link SchemeInitData} with the given {@code index}.
*
* @param index The index of the {@link SchemeInitData} to return.
* @return The {@link SchemeInitData} associated with the given {@code index}.
* @throws IndexOutOfBoundsException If the given {@code index} is negative or greater than
* {@link #getSchemeInitDataCount}{@code - 1}.
*/
@NonNull public SchemeInitData getSchemeInitDataAt(int index) {
throw new IndexOutOfBoundsException();
}
/**
* Scheme initialization data.
*/
public static final class SchemeInitData {
/**
* The Nil UUID, as defined in RFC 4122, section 4.1.7.
*/
@NonNull public static final UUID UUID_NIL = new UUID(0, 0);
/**
* The UUID associated with this scheme initialization data. May be {@link #UUID_NIL} if
* unknown or not applicable.
*/
@NonNull public final UUID uuid;
/**
* The mimeType of {@link #data}.
*/
@@ -56,12 +85,14 @@ public abstract class DrmInitData {
public final byte[] data;
/**
* @param uuid The UUID associated with this scheme initialization data.
* @param mimeType The mimeType of the initialization data.
* @param data The initialization data.
*
* @hide
*/
public SchemeInitData(String mimeType, byte[] data) {
public SchemeInitData(UUID uuid, String mimeType, byte[] data) {
this.uuid = uuid;
this.mimeType = mimeType;
this.data = data;
}
@@ -76,12 +107,14 @@ public abstract class DrmInitData {
}
SchemeInitData other = (SchemeInitData) obj;
return mimeType.equals(other.mimeType) && Arrays.equals(data, other.data);
return uuid.equals(other.uuid)
&& mimeType.equals(other.mimeType)
&& Arrays.equals(data, other.data);
}
@Override
public int hashCode() {
return mimeType.hashCode() + 31 * Arrays.hashCode(data);
return uuid.hashCode() + 31 * (mimeType.hashCode() + 31 * Arrays.hashCode(data));
}
}

View File

@@ -40,10 +40,12 @@ import java.lang.annotation.RetentionPolicy;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* MediaExtractor facilitates extraction of demuxed, typically encoded, media data
@@ -393,17 +395,28 @@ final public class MediaExtractor {
}
if (formatMap.containsKey("pssh")) {
Map<UUID, byte[]> psshMap = getPsshInfo();
DrmInitData.SchemeInitData[] schemeInitDatas =
psshMap.entrySet().stream().map(
entry -> new DrmInitData.SchemeInitData(
entry.getKey(), /* mimeType= */ "cenc", entry.getValue()))
.toArray(DrmInitData.SchemeInitData[]::new);
final Map<UUID, DrmInitData.SchemeInitData> initDataMap =
new HashMap<UUID, DrmInitData.SchemeInitData>();
for (Map.Entry<UUID, byte[]> e: psshMap.entrySet()) {
UUID uuid = e.getKey();
byte[] data = e.getValue();
initDataMap.put(uuid, new DrmInitData.SchemeInitData("cenc", data));
}
Arrays.stream(schemeInitDatas).collect(
Collectors.toMap(initData -> initData.uuid, initData -> initData));
return new DrmInitData() {
public SchemeInitData get(UUID schemeUuid) {
return initDataMap.get(schemeUuid);
}
@Override
public int getSchemeInitDataCount() {
return schemeInitDatas.length;
}
@Override
public SchemeInitData getSchemeInitDataAt(int index) {
return schemeInitDatas[index];
}
};
} else {
int numTracks = getTrackCount();
@@ -416,9 +429,23 @@ final public class MediaExtractor {
buf.rewind();
final byte[] data = new byte[buf.remaining()];
buf.get(data);
// Webm scheme init data is not uuid-specific.
DrmInitData.SchemeInitData webmSchemeInitData =
new DrmInitData.SchemeInitData(
DrmInitData.SchemeInitData.UUID_NIL, "webm", data);
return new DrmInitData() {
public SchemeInitData get(UUID schemeUuid) {
return new DrmInitData.SchemeInitData("webm", data);
return webmSchemeInitData;
}
@Override
public int getSchemeInitDataCount() {
return 1;
}
@Override
public SchemeInitData getSchemeInitDataAt(int index) {
return webmSchemeInitData;
}
};
}