diff options
author | 2025-03-05 22:41:39 -0800 | |
---|---|---|
committer | 2025-03-05 22:41:39 -0800 | |
commit | c1e5a13a49803840bfbebfcc45a23036d50e3e46 (patch) | |
tree | 9061e63c75e2c9a2c8231655021069fb9abd9ae8 | |
parent | 4d2a2953d2d74afce3d478ea6fb213c36ee19ee2 (diff) | |
parent | 4cb0976bb9a011d6bf23bf59a5a17c838df7c355 (diff) |
Merge "APV: Add Profile/Level/Band limit to VideoCapabilities" into main am: 6e835f57ca am: 4cb0976bb9
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/3524998
Change-Id: I86a6e19baae549f9ef4337db2d5242ad7b1345ce
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | media/java/android/media/MediaCodecInfo.java | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 4e86eacea404..f3b21bfdaa3c 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -3836,6 +3836,151 @@ public final class MediaCodecInfo { maxBlocks, maxBlocksPerSecond, blockSize, blockSize, 1 /* widthAlignment */, 1 /* heightAlignment */); + } else if (GetFlag(() -> android.media.codec.Flags.apvSupport()) + && mime.equalsIgnoreCase(MediaFormat.MIMETYPE_VIDEO_APV)) { + maxBlocksPerSecond = 11880; + maxBps = 7000000; + + // Sample rate, and Bit rate for APV Codec, + // corresponding to the definitions in + // "10.1.4. Levels and bands" + // found at https://www.ietf.org/archive/id/draft-lim-apv-03.html + for (CodecProfileLevel profileLevel: profileLevels) { + long SR = 0; // luma sample rate + int BR = 0; // bit rate bps + switch (profileLevel.level) { + case CodecProfileLevel.APVLevel1Band0: + SR = 3041280; BR = 7000000; break; + case CodecProfileLevel.APVLevel1Band1: + SR = 3041280; BR = 11000000; break; + case CodecProfileLevel.APVLevel1Band2: + SR = 3041280; BR = 14000000; break; + case CodecProfileLevel.APVLevel1Band3: + SR = 3041280; BR = 21000000; break; + case CodecProfileLevel.APVLevel11Band0: + SR = 6082560; BR = 14000000; break; + case CodecProfileLevel.APVLevel11Band1: + SR = 6082560; BR = 21000000; break; + case CodecProfileLevel.APVLevel11Band2: + SR = 6082560; BR = 28000000; break; + case CodecProfileLevel.APVLevel11Band3: + SR = 6082560; BR = 42000000; break; + case CodecProfileLevel.APVLevel2Band0: + SR = 15667200; BR = 36000000; break; + case CodecProfileLevel.APVLevel2Band1: + SR = 15667200; BR = 53000000; break; + case CodecProfileLevel.APVLevel2Band2: + SR = 15667200; BR = 71000000; break; + case CodecProfileLevel.APVLevel2Band3: + SR = 15667200; BR = 106000000; break; + case CodecProfileLevel.APVLevel21Band0: + SR = 31334400; BR = 71000000; break; + case CodecProfileLevel.APVLevel21Band1: + SR = 31334400; BR = 106000000; break; + case CodecProfileLevel.APVLevel21Band2: + SR = 31334400; BR = 141000000; break; + case CodecProfileLevel.APVLevel21Band3: + SR = 31334400; BR = 212000000; break; + case CodecProfileLevel.APVLevel3Band0: + SR = 66846720; BR = 101000000; break; + case CodecProfileLevel.APVLevel3Band1: + SR = 66846720; BR = 151000000; break; + case CodecProfileLevel.APVLevel3Band2: + SR = 66846720; BR = 201000000; break; + case CodecProfileLevel.APVLevel3Band3: + SR = 66846720; BR = 301000000; break; + case CodecProfileLevel.APVLevel31Band0: + SR = 133693440; BR = 201000000; break; + case CodecProfileLevel.APVLevel31Band1: + SR = 133693440; BR = 301000000; break; + case CodecProfileLevel.APVLevel31Band2: + SR = 133693440; BR = 401000000; break; + case CodecProfileLevel.APVLevel31Band3: + SR = 133693440; BR = 602000000; break; + case CodecProfileLevel.APVLevel4Band0: + SR = 265420800; BR = 401000000; break; + case CodecProfileLevel.APVLevel4Band1: + SR = 265420800; BR = 602000000; break; + case CodecProfileLevel.APVLevel4Band2: + SR = 265420800; BR = 780000000; break; + case CodecProfileLevel.APVLevel4Band3: + SR = 265420800; BR = 1170000000; break; + case CodecProfileLevel.APVLevel41Band0: + SR = 530841600; BR = 780000000; break; + case CodecProfileLevel.APVLevel41Band1: + SR = 530841600; BR = 1170000000; break; + case CodecProfileLevel.APVLevel41Band2: + SR = 530841600; BR = 1560000000; break; + case CodecProfileLevel.APVLevel41Band3: + // Current API allows bitrates only up to Max Integer + // Hence we are limiting internal limits to Integer.MAX_VALUE + // even when actual Level/Band limits are higher + SR = 530841600; BR = Integer.MAX_VALUE; break; + case CodecProfileLevel.APVLevel5Band0: + SR = 1061683200; BR = 1560000000; break; + case CodecProfileLevel.APVLevel5Band1: + SR = 1061683200; BR = Integer.MAX_VALUE; break; + case CodecProfileLevel.APVLevel5Band2: + SR = 1061683200; BR = Integer.MAX_VALUE; break; + case CodecProfileLevel.APVLevel5Band3: + SR = 1061683200; BR = Integer.MAX_VALUE; break; + case CodecProfileLevel.APVLevel51Band0: + case CodecProfileLevel.APVLevel51Band1: + case CodecProfileLevel.APVLevel51Band2: + case CodecProfileLevel.APVLevel51Band3: + SR = 2123366400; BR = Integer.MAX_VALUE; break; + case CodecProfileLevel.APVLevel6Band0: + case CodecProfileLevel.APVLevel6Band1: + case CodecProfileLevel.APVLevel6Band2: + case CodecProfileLevel.APVLevel6Band3: + SR = 4777574400L; BR = Integer.MAX_VALUE; break; + case CodecProfileLevel.APVLevel61Band0: + case CodecProfileLevel.APVLevel61Band1: + case CodecProfileLevel.APVLevel61Band2: + case CodecProfileLevel.APVLevel61Band3: + SR = 8493465600L; BR = Integer.MAX_VALUE; break; + case CodecProfileLevel.APVLevel7Band0: + case CodecProfileLevel.APVLevel7Band1: + case CodecProfileLevel.APVLevel7Band2: + case CodecProfileLevel.APVLevel7Band3: + SR = 16986931200L; BR = Integer.MAX_VALUE; break; + case CodecProfileLevel.APVLevel71Band0: + case CodecProfileLevel.APVLevel71Band1: + case CodecProfileLevel.APVLevel71Band2: + case CodecProfileLevel.APVLevel71Band3: + SR = 33973862400L; BR = Integer.MAX_VALUE; break; + default: + Log.w(TAG, "Unrecognized level " + + profileLevel.level + " for " + mime); + errors |= ERROR_UNRECOGNIZED; + } + switch (profileLevel.profile) { + case CodecProfileLevel.APVProfile422_10: + case CodecProfileLevel.APVProfile422_10HDR10: + case CodecProfileLevel.APVProfile422_10HDR10Plus: + break; + default: + Log.w(TAG, "Unrecognized profile " + + profileLevel.profile + " for " + mime); + errors |= ERROR_UNRECOGNIZED; + } + errors &= ~ERROR_NONE_SUPPORTED; + maxBlocksPerSecond = Math.max(SR, maxBlocksPerSecond); + maxBps = Math.max(BR, maxBps); + } + + final int blockSize = 16; + maxBlocks = Integer.MAX_VALUE; + maxBlocksPerSecond = Utils.divUp(maxBlocksPerSecond, blockSize * blockSize); + maxBlocks = (int) Math.min((long) maxBlocks, maxBlocksPerSecond); + // Max frame size in APV is 2^24 + int maxLengthInBlocks = Utils.divUp((int) Math.pow(2, 24), blockSize); + maxLengthInBlocks = Math.min(maxLengthInBlocks, maxBlocks); + applyMacroBlockLimits( + maxLengthInBlocks, maxLengthInBlocks, + maxBlocks, maxBlocksPerSecond, + blockSize, blockSize, + 2 /* widthAlignment */, 1 /* heightAlignment */); } else { Log.w(TAG, "Unsupported mime " + mime); // using minimal bitrate here. should be overriden by |