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:
@@ -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);
|
||||
|
||||
@@ -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 */);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user