Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4cb0976b authored by Fyodor Kyslov's avatar Fyodor Kyslov Committed by Automerger Merge Worker
Browse files

Merge "APV: Add Profile/Level/Band limit to VideoCapabilities" into main am: 6e835f57

parents b126345f 6e835f57
Loading
Loading
Loading
Loading
+145 −0
Original line number Diff line number Diff line
@@ -3827,6 +3827,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