media: Add reason to CodecException.

Bug: 19620911
Change-Id: Ic7244a2369a04bfd69e703415a8c9aacdcbf3c57
diff --git a/api/current.txt b/api/current.txt
index dc83f6e..ea7b0be 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -15141,8 +15141,11 @@
 
   public static final class MediaCodec.CodecException extends java.lang.IllegalStateException {
     method public java.lang.String getDiagnosticInfo();
+    method public int getReason();
     method public boolean isRecoverable();
     method public boolean isTransient();
+    field public static final int REASON_HARDWARE = 0; // 0x0
+    field public static final int REASON_RECLAIMED = 1; // 0x1
   }
 
   public static final class MediaCodec.CryptoException extends java.lang.RuntimeException {
diff --git a/api/system-current.txt b/api/system-current.txt
index ac80474..bb31924 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -16353,8 +16353,11 @@
 
   public static final class MediaCodec.CodecException extends java.lang.IllegalStateException {
     method public java.lang.String getDiagnosticInfo();
+    method public int getReason();
     method public boolean isRecoverable();
     method public boolean isTransient();
+    field public static final int REASON_HARDWARE = 0; // 0x0
+    field public static final int REASON_RECLAIMED = 1; // 0x1
   }
 
   public static final class MediaCodec.CryptoException extends java.lang.RuntimeException {
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index e028e3f..c85fcdc 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -687,6 +687,7 @@
         CodecException(int errorCode, int actionCode, String detailMessage) {
             super(detailMessage);
             mErrorCode = errorCode;
+            mReason = REASON_HARDWARE;
             mActionCode = actionCode;
 
             // TODO get this from codec
@@ -714,6 +715,15 @@
         }
 
         /**
+         * Retrieve the reason associated with a CodecException.
+         * The reason could be one of {@link #REASON_HARDWARE} or {@link #REASON_RECLAIMED}.
+         *
+         */
+        public int getReason() {
+            return mReason;
+        }
+
+        /**
          * Retrieve the error code associated with a CodecException.
          * This is opaque diagnostic information and may depend on
          * hardware or API level.
@@ -734,6 +744,19 @@
             return mDiagnosticInfo;
         }
 
+        /**
+         * This indicates the exception is caused by the hardware.
+         */
+        public static final int REASON_HARDWARE = 0;
+
+        /**
+         * This indicates the exception is because the resource manager reclaimed
+         * the media resource used by the codec.
+         * <p>
+         * With this exception, the codec must be released, as it has moved to terminal state.
+         */
+        public static final int REASON_RECLAIMED = 1;
+
         /* Must be in sync with android_media_MediaCodec.cpp */
         private final static int ACTION_FATAL = 0;
         private final static int ACTION_TRANSIENT = 1;
@@ -741,6 +764,7 @@
 
         private final String mDiagnosticInfo;
         private final int mErrorCode;
+        private final int mReason;
         private final int mActionCode;
     }