Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83511d2f authored by Andy Hung's avatar Andy Hung
Browse files

Add "throws IOException" to MediaCodec factory methods



android.media.MediaCodec
(createByCodecName|createDecoderByType|createEncoderByType)
now explicitly throws IOException.

Requires changes to existing code for declaration compatibility.

Bug: 11364276
Change-Id: I105ecb7c4bd49bf803111253cd23bab161c988f9
Signed-off-by: default avatarAndy Hung <hunga@google.com>
parent 4a5eb8fe
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -12825,9 +12825,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);
+27 −6
Original line number Diff line number Diff line
@@ -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 */);
    }
+7 −1
Original line number Diff line number Diff line
@@ -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);
                try {
                    mCodec = MediaCodec.createDecoderByType("video/avc");
                } catch (IOException e) {
                    throw new RuntimeException(
                            "failed to create video/avc decoder", e);
                }
                mCodec.configure(format, mSurface, null, 0);
                mCodec.start();
                mCodecBufferInfo = new BufferInfo();
+8 −2
Original line number Diff line number Diff line
@@ -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(
                        "failed to create video/avc encoder", e);
            }
            codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
            Surface surface = codec.createInputSurface();
            codec.start();
+9 −2
Original line number Diff line number Diff line
@@ -59,8 +59,15 @@ public class AudioTrackDecoder extends TrackDecoder {

    @Override
    protected MediaCodec initMediaCodec(MediaFormat format) {
        MediaCodec mediaCodec = MediaCodec.createDecoderByType(
        MediaCodec mediaCodec;
        try {
            mediaCodec = MediaCodec.createDecoderByType(
                    format.getString(MediaFormat.KEY_MIME));
        } catch (IOException e) {
            throw new RuntimeException(
                    "failed to create decoder for "
                    + format.getString(MediaFormat.KEY_MIME), e);
        }
        mediaCodec.configure(format, null, null, 0);
        return mediaCodec;
    }
Loading