Add "throws IOException" to MediaCodec constructors (3)

Change to add "throws IOException" to android.media.MediaCodec
(createByCodecName|createDecoderByType|createEncoderByType).  The exception was
previously thrown through the native JNI, but not explicitly declared.

Requires changes to existing code for declaration compatibility.

Bug: 11364276
Change-Id: Ia0d3481397285cb1503bedde37d4651934b3a481
Signed-off-by: Andy Hung <hunga@google.com>
This commit is contained in:
Andy Hung
2013-11-04 14:42:09 -08:00
parent 2ea312c1bf
commit 52d8aa79a3
7 changed files with 72 additions and 17 deletions

View File

@@ -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);

View File

@@ -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 */);
}

View File

@@ -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();

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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);
}
}
}

View File

@@ -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;