Merge "Add "throws IOException" to MediaCodec constructors (3)"
diff --git a/api/current.txt b/api/current.txt
index 8ec81b7..0207448 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -12597,9 +12597,9 @@
 
   public final class MediaCodec {
     method public void configure(android.media.MediaFormat, android.view.Surface, android.media.MediaCrypto, int);
-    method public static android.media.MediaCodec createByCodecName(java.lang.String);
-    method public static android.media.MediaCodec createDecoderByType(java.lang.String);
-    method public static android.media.MediaCodec createEncoderByType(java.lang.String);
+    method public static android.media.MediaCodec createByCodecName(java.lang.String) throws java.io.IOException;
+    method public static android.media.MediaCodec createDecoderByType(java.lang.String) throws java.io.IOException;
+    method public static android.media.MediaCodec createEncoderByType(java.lang.String) throws java.io.IOException;
     method public final android.view.Surface createInputSurface();
     method public final int dequeueInputBuffer(long);
     method public final int dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long);
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 5175830..02cb6dd 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -23,6 +23,7 @@
 import android.os.Bundle;
 import android.view.Surface;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Map;
@@ -66,8 +67,8 @@
  *
  * Each codec maintains a number of input and output buffers that are
  * referred to by index in API calls.
- * The contents of these buffers is represented by the ByteBuffer[] arrays
- * accessible through getInputBuffers() and getOutputBuffers().
+ * The contents of these buffers are represented by the ByteBuffer[] arrays
+ * accessible through {@link #getInputBuffers} and {@link #getOutputBuffers}.
  *
  * After a successful call to {@link #start} the client "owns" neither
  * input nor output buffers, subsequent calls to {@link #dequeueInputBuffer}
@@ -117,7 +118,18 @@
  * own any buffers anymore.
  * Note that the format of the data submitted after a flush must not change,
  * flush does not support format discontinuities,
- * for this a full stop(), configure(), start() cycle is necessary.
+ * for this a full {@link #stop}, {@link #configure}, {@link #start}
+ * cycle is necessary.
+ *
+ * <p> The factory methods
+ * {@link #createByCodecName},
+ * {@link #createDecoderByType},
+ * and {@link #createEncoderByType}
+ * throw {@link java.io.IOException} on failure which
+ * the caller must catch or declare to pass up.
+ * Other methods will throw {@link java.lang.IllegalStateException}
+ * if the codec is in an Uninitialized, Invalid, or Error state (e.g. not
+ * initialized properly).  Exceptions are thrown elsewhere as noted. </p>
  *
  */
 final public class MediaCodec {
@@ -181,16 +193,22 @@
      * </ul>
      *
      * @param type The mime type of the input data.
+     * @throws IOException if the codec cannot be created.
+     * @throws IllegalArgumentException if type is null.
      */
-    public static MediaCodec createDecoderByType(String type) {
+    public static MediaCodec createDecoderByType(String type)
+            throws IOException {
         return new MediaCodec(type, true /* nameIsType */, false /* encoder */);
     }
 
     /**
      * Instantiate an encoder supporting output data of the given mime type.
      * @param type The desired mime type of the output data.
+     * @throws IOException if the codec cannot be created.
+     * @throws IllegalArgumentException if type is null.
      */
-    public static MediaCodec createEncoderByType(String type) {
+    public static MediaCodec createEncoderByType(String type)
+            throws IOException {
         return new MediaCodec(type, true /* nameIsType */, true /* encoder */);
     }
 
@@ -199,8 +217,11 @@
      * use this method to instantiate it. Use with caution.
      * Likely to be used with information obtained from {@link android.media.MediaCodecList}
      * @param name The name of the codec to be instantiated.
+     * @throws IOException if the codec cannot be created.
+     * @throws IllegalArgumentException if name is null.
      */
-    public static MediaCodec createByCodecName(String name) {
+    public static MediaCodec createByCodecName(String name)
+            throws IOException {
         return new MediaCodec(
                 name, false /* nameIsType */, false /* unused */);
     }
diff --git a/tests/AccessoryDisplay/sink/src/com/android/accessorydisplay/sink/DisplaySinkService.java b/tests/AccessoryDisplay/sink/src/com/android/accessorydisplay/sink/DisplaySinkService.java
index daec845..9e6ced1 100644
--- a/tests/AccessoryDisplay/sink/src/com/android/accessorydisplay/sink/DisplaySinkService.java
+++ b/tests/AccessoryDisplay/sink/src/com/android/accessorydisplay/sink/DisplaySinkService.java
@@ -30,6 +30,7 @@
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
 public class DisplaySinkService extends Service implements SurfaceHolder.Callback {
@@ -150,7 +151,12 @@
             if (mSurface != null) {
                 MediaFormat format = MediaFormat.createVideoFormat(
                         "video/avc", mSurfaceWidth, mSurfaceHeight);
-                mCodec = MediaCodec.createDecoderByType("video/avc");
+                try {
+                    mCodec = MediaCodec.createDecoderByType("video/avc");
+                } catch (IOException e) {
+                    throw new RuntimeException(
+                            "IOException in MediaCodec.createDecoderByType for video/avc", e);
+                }
                 mCodec.configure(format, mSurface, null, 0);
                 mCodec.start();
                 mCodecBufferInfo = new BufferInfo();
diff --git a/tests/AccessoryDisplay/source/src/com/android/accessorydisplay/source/DisplaySourceService.java b/tests/AccessoryDisplay/source/src/com/android/accessorydisplay/source/DisplaySourceService.java
index 256f900..9207fb2 100644
--- a/tests/AccessoryDisplay/source/src/com/android/accessorydisplay/source/DisplaySourceService.java
+++ b/tests/AccessoryDisplay/source/src/com/android/accessorydisplay/source/DisplaySourceService.java
@@ -32,6 +32,7 @@
 import android.view.Display;
 import android.view.Surface;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
 public class DisplaySourceService extends Service {
@@ -191,8 +192,13 @@
             format.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE);
             format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE);
             format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, I_FRAME_INTERVAL);
-
-            MediaCodec codec = MediaCodec.createEncoderByType("video/avc");
+            MediaCodec codec;
+            try {
+                codec = MediaCodec.createEncoderByType("video/avc");
+            } catch (IOException e) {
+                throw new RuntimeException(
+                        "IOException in MediaCodec.createEncoderByType for video/avc", e);
+            }
             codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
             Surface surface = codec.createInputSurface();
             codec.start();
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/AudioTrackDecoder.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/AudioTrackDecoder.java
index 0219fd7..fbea6cd 100644
--- a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/AudioTrackDecoder.java
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/AudioTrackDecoder.java
@@ -59,8 +59,15 @@
 
     @Override
     protected MediaCodec initMediaCodec(MediaFormat format) {
-        MediaCodec mediaCodec = MediaCodec.createDecoderByType(
-                format.getString(MediaFormat.KEY_MIME));
+        MediaCodec mediaCodec;
+        try {
+            mediaCodec = MediaCodec.createDecoderByType(
+                    format.getString(MediaFormat.KEY_MIME));
+        } catch (IOException e) {
+            throw new RuntimeException(
+                    "IOException in MediaCodec.createDecoderByType for "
+                    + format.getString(MediaFormat.KEY_MIME), e);
+        }
         mediaCodec.configure(format, null, null, 0);
         return mediaCodec;
     }
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/CpuVideoTrackDecoder.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/CpuVideoTrackDecoder.java
index 96f3059..f57eacf 100644
--- a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/CpuVideoTrackDecoder.java
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/CpuVideoTrackDecoder.java
@@ -29,6 +29,7 @@
 import androidx.media.filterfw.FrameImage2D;
 import androidx.media.filterfw.PixelUtils;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -214,7 +215,13 @@
             return null;
         } else {
             String bestCodec = candidateCodecs.firstEntry().getValue();
-            return MediaCodec.createByCodecName(bestCodec);
+            try {
+                return MediaCodec.createByCodecName(bestCodec);
+            } catch (IOException e) {
+                throw new RuntimeException(
+                        "IOException in MediaCodec.createByCodecName for "
+                        + bestCodec, e);
+            }
         }
     }
 
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/GpuVideoTrackDecoder.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/GpuVideoTrackDecoder.java
index bbba9d8..546cdfc 100644
--- a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/GpuVideoTrackDecoder.java
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/decoder/GpuVideoTrackDecoder.java
@@ -28,6 +28,7 @@
 import androidx.media.filterfw.ImageShader;
 import androidx.media.filterfw.TextureSource;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
 /**
@@ -86,9 +87,16 @@
 
     @Override
     protected MediaCodec initMediaCodec(MediaFormat format) {
+        MediaCodec mediaCodec;
+        try {
+            mediaCodec = MediaCodec.createDecoderByType(
+                    format.getString(MediaFormat.KEY_MIME));
+        } catch (IOException e) {
+            throw new RuntimeException(
+                    "IOException in MediaCodec.createDecoderByType for "
+                    + format.getString(MediaFormat.KEY_MIME), e);
+        }
         Surface surface = new Surface(mSurfaceTexture);
-        MediaCodec mediaCodec = MediaCodec.createDecoderByType(
-                format.getString(MediaFormat.KEY_MIME));
         mediaCodec.configure(format, surface, null, 0);
         surface.release();
         return mediaCodec;