Add MediaCodec.CryptoInfo.getPattern
Allows MediaParser and MediaExtractor clients to know the
encrpytion pattern of the parsed/extracted media. Without
the getter, only MediaCodec can know the pattern, which
impossibilitates the use of app-bundled decoders.
Bug: 158743263
Test: atest CtsMediaTestCases:MediaCodecTest.testCryptoInfoPattern
Change-Id: Iaf77c8ecafad093cfa434a9ac31314895a44e78f
diff --git a/api/current.txt b/api/current.txt
index 83df1d9..5609aab 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -25456,6 +25456,7 @@
public static final class MediaCodec.CryptoInfo {
ctor public MediaCodec.CryptoInfo();
+ method @NonNull public android.media.MediaCodec.CryptoInfo.Pattern getPattern();
method public void set(int, @NonNull int[], @NonNull int[], @NonNull byte[], @NonNull byte[], int);
method public void setPattern(android.media.MediaCodec.CryptoInfo.Pattern);
field public byte[] iv;
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 0747ab13..ae97a71 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -2711,12 +2711,12 @@
}
};
- private final Pattern zeroPattern = new Pattern(0, 0);
+ private static final Pattern ZERO_PATTERN = new Pattern(0, 0);
/**
* The pattern applicable to the protected data in each subsample.
*/
- private Pattern pattern;
+ private Pattern mPattern = ZERO_PATTERN;
/**
* Set the subsample count, clear/encrypted sizes, key, IV and mode fields of
@@ -2735,22 +2735,30 @@
key = newKey;
iv = newIV;
mode = newMode;
- pattern = zeroPattern;
+ mPattern = ZERO_PATTERN;
+ }
+
+ /**
+ * Returns the {@link Pattern encryption pattern}.
+ */
+ public @NonNull Pattern getPattern() {
+ return new Pattern(mPattern.getEncryptBlocks(), mPattern.getSkipBlocks());
}
/**
* Set the encryption pattern on a {@link MediaCodec.CryptoInfo} instance.
- * See {@link MediaCodec.CryptoInfo.Pattern}.
+ * See {@link Pattern}.
*/
public void setPattern(Pattern newPattern) {
if (newPattern == null) {
- newPattern = zeroPattern;
+ newPattern = ZERO_PATTERN;
}
- pattern = newPattern;
+ setPattern(newPattern.getEncryptBlocks(), newPattern.getSkipBlocks());
}
+ // Accessed from android_media_MediaExtractor.cpp.
private void setPattern(int blocksToEncrypt, int blocksToSkip) {
- pattern = new Pattern(blocksToEncrypt, blocksToSkip);
+ mPattern = new Pattern(blocksToEncrypt, blocksToSkip);
}
@Override
@@ -2772,9 +2780,9 @@
builder.append(", encrypted ");
builder.append(Arrays.toString(numBytesOfEncryptedData));
builder.append(", pattern (encrypt: ");
- builder.append(pattern.mEncryptBlocks);
+ builder.append(mPattern.mEncryptBlocks);
builder.append(", skip: ");
- builder.append(pattern.mSkipBlocks);
+ builder.append(mPattern.mSkipBlocks);
builder.append(")");
return builder.toString();
}
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 0b0e162..71c86cc 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -2662,7 +2662,7 @@
gFields.cryptoInfoModeID = env->GetFieldID(clazz.get(), "mode", "I");
CHECK(gFields.cryptoInfoModeID != NULL);
- gFields.cryptoInfoPatternID = env->GetFieldID(clazz.get(), "pattern",
+ gFields.cryptoInfoPatternID = env->GetFieldID(clazz.get(), "mPattern",
"Landroid/media/MediaCodec$CryptoInfo$Pattern;");
CHECK(gFields.cryptoInfoPatternID != NULL);
diff --git a/non-updatable-api/current.txt b/non-updatable-api/current.txt
index a0aa0e0..993ee9a 100644
--- a/non-updatable-api/current.txt
+++ b/non-updatable-api/current.txt
@@ -25438,6 +25438,7 @@
public static final class MediaCodec.CryptoInfo {
ctor public MediaCodec.CryptoInfo();
+ method @NonNull public android.media.MediaCodec.CryptoInfo.Pattern getPattern();
method public void set(int, @NonNull int[], @NonNull int[], @NonNull byte[], @NonNull byte[], int);
method public void setPattern(android.media.MediaCodec.CryptoInfo.Pattern);
field public byte[] iv;