summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt4
-rw-r--r--media/java/android/media/DrmInitData.java43
-rw-r--r--media/java/android/media/MediaExtractor.java41
3 files changed, 76 insertions, 12 deletions
diff --git a/api/current.txt b/api/current.txt
index 9ea4b2d4d151..10e45d39af66 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -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 {
diff --git a/media/java/android/media/DrmInitData.java b/media/java/android/media/DrmInitData.java
index 170d9de9d50a..cc35f140dd7e 100644
--- a/media/java/android/media/DrmInitData.java
+++ b/media/java/android/media/DrmInitData.java
@@ -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;
/**
@@ -42,11 +41,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}.
*/
public final String mimeType;
@@ -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));
}
}
diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java
index 7785900a7c6e..6ef871383a58 100644
--- a/media/java/android/media/MediaExtractor.java
+++ b/media/java/android/media/MediaExtractor.java
@@ -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;
}
};
}