parse bitrate range for video/audio caps

Bug: 18684228
Change-Id: Ib5c3682bb1dfa338b99352ea040edcb99d86ef0b
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index 4513643..6984575 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -126,6 +126,7 @@
                      new Rational(Integer.MAX_VALUE, 1));
     private static final Range<Integer> SIZE_RANGE = Range.create(1, 32768);
     private static final Range<Integer> FRAME_RATE_RANGE = Range.create(0, 960);
+    private static final Range<Integer> BITRATE_RANGE = Range.create(0, 500000000);
 
     // found stuff that is not supported by framework (=> this should not happen)
     private static final int ERROR_UNRECOGNIZED   = (1 << 0);
@@ -711,7 +712,7 @@
             }
             if (info.containsKey("bitrate-range")) {
                 bitRates = bitRates.intersect(
-                        Utils.parseIntRange(info.getString("bitrate"), bitRates));
+                        Utils.parseIntRange(info.getString("bitrate-range"), bitRates));
             }
             applyLimits(maxInputChannels, bitRates);
         }
@@ -1061,7 +1062,7 @@
         }
 
         private void initWithPlatformLimits() {
-            mBitrateRange = Range.create(0, Integer.MAX_VALUE);
+            mBitrateRange = BITRATE_RANGE;
 
             mWidthRange  = SIZE_RANGE;
             mHeightRange = SIZE_RANGE;
@@ -1090,7 +1091,7 @@
             Size blockSize = new Size(mBlockWidth, mBlockHeight);
             Size alignment = new Size(mWidthAlignment, mHeightAlignment);
             Range<Integer> counts = null, widths = null, heights = null;
-            Range<Integer> frameRates = null;
+            Range<Integer> frameRates = null, bitRates = null;
             Range<Long> blockRates = null;
             Range<Rational> ratios = null, blockRatios = null;
 
@@ -1148,6 +1149,16 @@
                     frameRates = null;
                 }
             }
+            bitRates = Utils.parseIntRange(map.get("bitrate-range"), null);
+            if (bitRates != null) {
+                try {
+                    bitRates = bitRates.intersect(BITRATE_RANGE);
+                } catch (IllegalArgumentException e) {
+                    Log.w(TAG,  "bitrate range (" + bitRates
+                            + ") is out of limits: " + BITRATE_RANGE);
+                    bitRates = null;
+                }
+            }
 
             checkPowerOfTwo(
                     blockSize.getWidth(), "block-size width must be power of two");
@@ -1196,6 +1207,9 @@
                 if (frameRates != null) {
                     mFrameRateRange = FRAME_RATE_RANGE.intersect(frameRates);
                 }
+                if (bitRates != null) {
+                    mBitrateRange = BITRATE_RANGE.intersect(bitRates);
+                }
             } else {
                 // no unsupported profile/levels, so restrict values to known limits
                 if (widths != null) {
@@ -1226,6 +1240,9 @@
                 if (frameRates != null) {
                     mFrameRateRange = mFrameRateRange.intersect(frameRates);
                 }
+                if (bitRates != null) {
+                    mBitrateRange = mBitrateRange.intersect(bitRates);
+                }
             }
             updateLimits();
         }