diff options
7 files changed, 72 insertions, 17 deletions
diff --git a/api/current.txt b/api/current.txt index 745b33d93..e82d348 100644 --- a/api/current.txt +++ b/api/current.txt @@ -12597,9 +12597,9 @@ package android.media { 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.media.MediaFormat; 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 @@ import java.util.Map; * * 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 @@ import java.util.Map; * 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 @@ final public class MediaCodec { * </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 @@ final public class MediaCodec { * 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.Surface; 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 @@ public class DisplaySinkService extends Service implements SurfaceHolder.Callbac 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.os.Message; 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 @@ public class DisplaySourceService extends Service { 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 @@ public class AudioTrackDecoder extends TrackDecoder { @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.Frame; 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 @@ public class CpuVideoTrackDecoder extends VideoTrackDecoder { 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.FrameImage2D; import androidx.media.filterfw.ImageShader; import androidx.media.filterfw.TextureSource; +import java.io.IOException; import java.nio.ByteBuffer; /** @@ -86,9 +87,16 @@ public class GpuVideoTrackDecoder extends VideoTrackDecoder { @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; |