188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber/*
288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Copyright (C) 2012 The Android Open Source Project
388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber *
488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * you may not use this file except in compliance with the License.
688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * You may obtain a copy of the License at
788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber *
888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber *
1088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Unless required by applicable law or agreed to in writing, software
1188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * See the License for the specific language governing permissions and
1488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * limitations under the License.
1588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber */
1688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
1788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberpackage android.media;
1888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
1907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberimport android.media.MediaCrypto;
2060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huberimport android.media.MediaFormat;
2188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberimport android.view.Surface;
2288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberimport java.nio.ByteBuffer;
2388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberimport java.util.Map;
2488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
2588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber/**
2688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * MediaCodec class can be used to access low-level media codec, i.e.
2788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * encoder/decoder components.
2807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *
2907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * <p>MediaCodec is generally used like this:
3007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * <pre>
3107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * MediaCodec codec = MediaCodec.createDecoderByType(type);
3207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * codec.configure(format, ...);
3307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * codec.start();
3407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * ByteBuffer[] inputBuffers = codec.getInputBuffers();
3507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * ByteBuffer[] outputBuffers = codec.getOutputBuffers();
3607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * for (;;) {
3707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *   int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);
3807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *   if (inputBufferIndex &gt;= 0) {
3907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *     // fill inputBuffers[inputBufferIndex] with valid data
4007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *     ...
4107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *     codec.queueInputBuffer(inputBufferIndex, ...);
4207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *   }
4307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *
4407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *   int outputBufferIndex = codec.dequeueOutputBuffer(timeoutUs);
4507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *   if (outputBufferIndex &gt;= 0) {
4607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *     // outputBuffer is ready to be processed or rendered.
4707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *     ...
4807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *     codec.releaseOutputBuffer(outputBufferIndex, ...);
4907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *   } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
5007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *     outputBuffers = codec.getOutputBuffers();
5107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *   } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
5207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *     // Subsequent data will conform to new format.
53b529e4c9ca8a6790162275ac2e481f768a6d585fMartin Storsjo *     MediaFormat format = codec.getOutputFormat();
5407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *     ...
5507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *   }
5607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * }
5707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * codec.stop();
5807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * codec.release();
5907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * codec = null;
6007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * </pre>
6107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *
6207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Each codec maintains a number of input and output buffers that are
6307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * referred to by index in API calls.
6407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * The contents of these buffers is represented by the ByteBuffer[] arrays
6507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * accessible through getInputBuffers() and getOutputBuffers().
6607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *
6707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * After a successful call to {@link #start} the client "owns" neither
6807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * input nor output buffers, subsequent calls to {@link #dequeueInputBuffer}
6907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * and {@link #dequeueOutputBuffer} then transfer ownership from the codec
7007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * to the client.<p>
7107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * The client is not required to resubmit/release buffers immediately
7207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * to the codec, the sample code above simply does this for simplicity's sake.<p>
7307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Once the client has an input buffer available it can fill it with data
7407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * and submit it it to the codec via a call to {@link #queueInputBuffer}.<p>
7507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * The codec in turn will return an output buffer to the client in response
7607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * to {@link #dequeueOutputBuffer}. After the output buffer has been processed
7707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * a call to {@link #releaseOutputBuffer} will return it to the codec.
7807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * If a video surface has been provided in the call to {@link #configure},
7907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * {@link #releaseOutputBuffer} optionally allows rendering of the buffer
8007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * to the surface.<p>
8107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *
8207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Input buffers (for decoders) and Output buffers (for encoders) contain
8307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * encoded data according to the format's type. For video types this data
8407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * is all the encoded data representing a single moment in time, for audio
8507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * data this is slightly relaxed in that a buffer may contain multiple
8607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * encoded frames of audio. In either case, buffers do not start and end on
8707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * arbitrary byte boundaries, this is not a stream of bytes, it's a stream
8807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * of access units.<p>
8907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *
9007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Most formats also require the actual data to be prefixed by a number
9107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * of buffers containing setup data, or codec specific data, i.e. the
9207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * first few buffers submitted to the codec object after starting it must
9360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * be codec specific data marked as such using the flag {@link #BUFFER_FLAG_CODEC_CONFIG}
9407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * in a call to {@link #queueInputBuffer}.
9507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *
968aa735f71e8921b93f2bb6fa5506d8ff414698a0Andreas Huber * Codec specific data included in the format passed to {@link #configure}
978aa735f71e8921b93f2bb6fa5506d8ff414698a0Andreas Huber * (in ByteBuffer entries with keys "csd-0", "csd-1", ...) is automatically
988aa735f71e8921b93f2bb6fa5506d8ff414698a0Andreas Huber * submitted to the codec, this data MUST NOT be submitted explicitly by the
998aa735f71e8921b93f2bb6fa5506d8ff414698a0Andreas Huber * client.
1008aa735f71e8921b93f2bb6fa5506d8ff414698a0Andreas Huber *
10107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Once the client reaches the end of the input data it signals the end of
10260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * the input stream by specifying a flag of {@link #BUFFER_FLAG_END_OF_STREAM} in the call to
10307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * {@link #queueInputBuffer}. The codec will continue to return output buffers
10407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * until it eventually signals the end of the output stream by specifying
10560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * the same flag ({@link #BUFFER_FLAG_END_OF_STREAM}) on the BufferInfo returned in
10607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * {@link #dequeueOutputBuffer}.
10707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *
10807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * In order to start decoding data that's not adjacent to previously submitted
10907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * data (i.e. after a seek) it is necessary to {@link #flush} the decoder.
11007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Any input or output buffers the client may own at the point of the flush are
11107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * immediately revoked, i.e. after a call to {@link #flush} the client does not
11207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * own any buffers anymore.
11307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * Note that the format of the data submitted after a flush must not change,
11407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * flush does not support format discontinuities,
11507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber * for this a full stop(), configure(), start() cycle is necessary.
11607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber *
11760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber */
1188240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberfinal public class MediaCodec {
11960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
12060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Per buffer metadata includes an offset and size specifying
12160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * the range of valid data in the associated codec buffer.
12260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
12388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public final static class BufferInfo {
12488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        public void set(
12507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber                int newOffset, int newSize, long newTimeUs, int newFlags) {
12607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber            offset = newOffset;
12707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber            size = newSize;
12807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber            presentationTimeUs = newTimeUs;
12907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber            flags = newFlags;
13088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        }
13188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
13207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        public int offset;
13307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        public int size;
13407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        public long presentationTimeUs;
13507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        public int flags;
13688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    };
13788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
1389e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber    // The follow flag constants MUST stay in sync with their equivalents
1399e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber    // in MediaCodec.h !
14007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
14160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
14260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * This indicates that the buffer marked as such contains the data
14360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * for a sync frame.
14460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
14560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    public static final int BUFFER_FLAG_SYNC_FRAME   = 1;
14607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
14760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
14860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * This indicated that the buffer marked as such contains codec
14960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * initialization / codec specific data instead of media data.
15060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
15160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    public static final int BUFFER_FLAG_CODEC_CONFIG = 2;
1529e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber
15360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
15460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * This signals the end of stream, i.e. no buffers will be available
15560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * after this, unless of course, {@link #flush} follows.
15660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
15760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    public static final int BUFFER_FLAG_END_OF_STREAM         = 4;
15888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
15960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
16060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Instantiate a decoder supporting input data of the given mime type.
16168b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     *
16268b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * The following is a partial list of defined mime types and their semantics:
16368b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <ul>
16468b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"video/x-vnd.on2.vp8" - VPX video (i.e. video in .webm)
16568b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"video/avc" - H.264/AVC video
16668b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"video/mp4v-es" - MPEG4 video
16768b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"video/3gpp" - H.263 video
16868b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"audio/3gpp" - AMR narrowband audio
16968b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"audio/amr-wb" - AMR wideband audio
17068b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"audio/mpeg" - MPEG1/2 audio layer III
17168b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"audio/mp4a-latm" - AAC audio
17268b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"audio/vorbis" - vorbis audio
17368b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"audio/g711-alaw" - G.711 alaw audio
17468b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * <li>"audio/g711-mlaw" - G.711 ulaw audio
17568b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     * </ul>
17668b1a6eed8479e16456f018663b1bcfaecc2a3f4Andreas Huber     *
17760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param type The mime type of the input data.
17860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
17907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    public static MediaCodec createDecoderByType(String type) {
18007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        return new MediaCodec(type, true /* nameIsType */, false /* encoder */);
18107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    }
18207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
18360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
18460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Instantiate an encoder supporting output data of the given mime type.
18560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param type The desired mime type of the output data.
18660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
18707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    public static MediaCodec createEncoderByType(String type) {
18807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        return new MediaCodec(type, true /* nameIsType */, true /* encoder */);
18988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
19088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
19160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
19260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * If you know the exact name of the component you want to instantiate
19360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * use this method to instantiate it. Use with caution.
19460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Likely to be used with information obtained from {@link android.media.MediaCodecList}
19560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param name The name of the codec to be instantiated.
19660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
19707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    public static MediaCodec createByCodecName(String name) {
19888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return new MediaCodec(
19988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber                name, false /* nameIsType */, false /* unused */);
20088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
20188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
20288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    private MediaCodec(
20388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            String name, boolean nameIsType, boolean encoder) {
20488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        native_setup(name, nameIsType, encoder);
20588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
20688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
20788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    @Override
20888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    protected void finalize() {
20988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        native_finalize();
21088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
21188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
21260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
21360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Make sure you call this when you're done to free up any opened
21460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * component instance instead of relying on the garbage collector
21560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * to do this for you at some point in the future.
21660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
21788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public native final void release();
21888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
21960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
22060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * If this codec is to be used as an encoder, pass this flag.
22160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
22260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    public static final int CONFIGURE_FLAG_ENCODE = 1;
22388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
22460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
22560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Configures a component.
22688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber     *
22760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param format The format of the input data (decoder) or the desired
22860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *               format of the output data (encoder).
22960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param surface Specify a surface on which to render the output of this
23060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *                decoder.
23160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param crypto  Specify a crypto object to facilitate secure decryption
23260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *                of the media data.
23360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param flags   Specify {@link #CONFIGURE_FLAG_ENCODE} to configure the
23460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *                component as an encoder.
23560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
23688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public void configure(
23760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber            MediaFormat format,
23807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber            Surface surface, MediaCrypto crypto, int flags) {
23960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber        Map<String, Object> formatMap = format.getMap();
24060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber
24188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        String[] keys = null;
24288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        Object[] values = null;
24388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
24488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        if (format != null) {
24560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber            keys = new String[formatMap.size()];
24660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber            values = new Object[formatMap.size()];
24788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
24888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            int i = 0;
24960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber            for (Map.Entry<String, Object> entry: formatMap.entrySet()) {
25088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber                keys[i] = entry.getKey();
25188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber                values[i] = entry.getValue();
25288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber                ++i;
25388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            }
25488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        }
25588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
2568240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber        native_configure(keys, values, surface, crypto, flags);
25788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
25888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
25988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    private native final void native_configure(
2608240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber            String[] keys, Object[] values,
26107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber            Surface surface, MediaCrypto crypto, int flags);
26288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
26360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
26460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * After successfully configuring the component, call start. On return
26560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * you can query the component for its input/output buffers.
26660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
26788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public native final void start();
26888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
26960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
27060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Finish the decode/encode session, note that the codec instance
27160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * remains active and ready to be {@link #start}ed again.
27260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * To ensure that it is available to other client call {@link #release}
27360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * and don't just rely on garbage collection to eventually do this for you.
27460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
27588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public native final void stop();
27688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
27760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
27860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Flush both input and output ports of the component, all indices
27960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * previously returned in calls to {@link #dequeueInputBuffer} and
28060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * {@link #dequeueOutputBuffer} become invalid.
28160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
28288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public native final void flush();
28388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
284bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber    public final static class CryptoException extends RuntimeException {
285bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber        public CryptoException(int errorCode, String detailMessage) {
286bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber            super(detailMessage);
287bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber            mErrorCode = errorCode;
288bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber        }
289bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber
290bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber        public int getErrorCode() {
291bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber            return mErrorCode;
292bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber        }
293bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber
294bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber        private int mErrorCode;
295bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber    }
296bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber
29760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
29860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * After filling a range of the input buffer at the specified index
29960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * submit it to the component.
300c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber     *
30160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Many decoders require the actual compressed data stream to be
30260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * preceded by "codec specific data", i.e. setup data used to initialize
30360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * the codec such as PPS/SPS in the case of AVC video or code tables
30460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * in the case of vorbis audio.
30560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * The class {@link android.media.MediaExtractor} provides codec
30660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * specific data as part of
30760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * the returned track format in entries named "csd-0", "csd-1" ...
308c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber     *
30960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * These buffers should be submitted using the flag {@link #BUFFER_FLAG_CODEC_CONFIG}.
310c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber     *
31160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * To indicate that this is the final piece of input data (or rather that
31260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * no more input data follows unless the decoder is subsequently flushed)
31360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * specify the flag {@link #BUFFER_FLAG_END_OF_STREAM}.
31407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber     *
31560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param index The index of a client-owned input buffer previously returned
31660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *              in a call to {@link #dequeueInputBuffer}.
31760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param offset The byte offset into the input buffer at which the data starts.
31860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param size The number of bytes of valid input data.
31960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param presentationTimeUs The time at which this buffer should be rendered.
32060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param flags A bitmask of flags {@link #BUFFER_FLAG_SYNC_FRAME},
32160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *              {@link #BUFFER_FLAG_CODEC_CONFIG} or {@link #BUFFER_FLAG_END_OF_STREAM}.
32260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @throws CryptoException if a crypto object has been specified in
32360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *         {@link #configure}
32460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
32588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public native final void queueInputBuffer(
32688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            int index,
327bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber            int offset, int size, long presentationTimeUs, int flags)
328bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber        throws CryptoException;
32988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
33060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    // The following mode constants MUST stay in sync with their equivalents
33160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    // in media/hardware/CryptoAPI.h !
33260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    public static final int CRYPTO_MODE_UNENCRYPTED = 0;
33360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    public static final int CRYPTO_MODE_AES_CTR     = 1;
33460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber
33560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
33660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Metadata describing the structure of a (at least partially) encrypted
33760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * input sample.
33860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * A buffer's data is considered to be partitioned into "subSamples",
33960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * each subSample starts with a (potentially empty) run of plain,
34060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * unencrypted bytes followed by a (also potentially empty) run of
34160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * encrypted bytes.
34260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * numBytesOfClearData can be null to indicate that all data is encrypted.
34360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * This information encapsulates per-sample metadata as outlined in
34460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * ISO/IEC FDIS 23001-7:2011 "Common encryption in ISO base media file format files".
34560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
34691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    public final static class CryptoInfo {
34791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        public void set(
34891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber                int newNumSubSamples,
34991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber                int[] newNumBytesOfClearData,
35091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber                int[] newNumBytesOfEncryptedData,
35191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber                byte[] newKey,
35291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber                byte[] newIV,
35391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber                int newMode) {
35491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            numSubSamples = newNumSubSamples;
35591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            numBytesOfClearData = newNumBytesOfClearData;
35691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            numBytesOfEncryptedData = newNumBytesOfEncryptedData;
35791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            key = newKey;
35891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            iv = newIV;
35991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            mode = newMode;
36091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        }
36191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
36260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber        /**
36360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         * The number of subSamples that make up the buffer's contents.
36460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         */
36591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        public int numSubSamples;
36660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber        /**
36760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         * The number of leading unencrypted bytes in each subSample.
36860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         */
36991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        public int[] numBytesOfClearData;
37060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber        /**
37160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         * The number of trailing encrypted bytes in each subSample.
37260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         */
37391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        public int[] numBytesOfEncryptedData;
37460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber        /**
37560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         * A 16-byte opaque key
37660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         */
37791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        public byte[] key;
37860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber        /**
37960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         * A 16-byte initialization vector
38060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         */
38191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        public byte[] iv;
38260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber        /**
38360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         * The type of encryption that has been applied,
38460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         * see {@link #CRYPTO_MODE_UNENCRYPTED} and {@link #CRYPTO_MODE_AES_CTR}.
38560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber         */
38691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        public int mode;
38791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    };
38891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
38960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
39060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Similar to {@link #queueInputBuffer} but submits a buffer that is
39160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * potentially encrypted.
39260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param index The index of a client-owned input buffer previously returned
39360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *              in a call to {@link #dequeueInputBuffer}.
39460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param offset The byte offset into the input buffer at which the data starts.
39560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param info Metadata required to facilitate decryption, the object can be
39660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *             reused immediately after this call returns.
39760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param presentationTimeUs The time at which this buffer should be rendered.
39860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param flags A bitmask of flags {@link #BUFFER_FLAG_SYNC_FRAME},
39960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *              {@link #BUFFER_FLAG_CODEC_CONFIG} or {@link #BUFFER_FLAG_END_OF_STREAM}.
4009e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber     */
4019e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber    public native final void queueSecureInputBuffer(
4029e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            int index,
4039e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            int offset,
40491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            CryptoInfo info,
4059e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber            long presentationTimeUs,
406bfc56f497de0d18125366a02a93e61cdc0891be4Andreas Huber            int flags) throws CryptoException;
4079e6bcce17d13bd4f7bba5f8fbcc2e6a0d695274bAndreas Huber
40860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
40960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Returns the index of an input buffer to be filled with valid data
41060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * or -1 if no such buffer is currently available.
41160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * This method will return immediately if timeoutUs == 0, wait indefinitely
41260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * for the availability of an input buffer if timeoutUs &lt; 0 or wait up
41360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * to "timeoutUs" microseconds if timeoutUs &gt; 0.
41460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param timeoutUs The timeout in microseconds, a negative timeout indicates "infinite".
41560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
41688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public native final int dequeueInputBuffer(long timeoutUs);
41788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
41860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
41960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * If a non-negative timeout had been specified in the call
42007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber     * to {@link #dequeueOutputBuffer}, indicates that the call timed out.
42160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
42288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public static final int INFO_TRY_AGAIN_LATER        = -1;
42307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
42460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
42560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * The output format has changed, subsequent data will follow the new
42660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * format. {@link #getOutputFormat} returns the new format.
42760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
42888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public static final int INFO_OUTPUT_FORMAT_CHANGED  = -2;
42907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
43060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
43160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * The output buffers have changed, the client must refer to the new
43260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * set of output buffers returned by {@link #getOutputBuffers} from
43360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * this point on.
43460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
43588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public static final int INFO_OUTPUT_BUFFERS_CHANGED = -3;
43688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
43760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
43860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Dequeue an output buffer, block at most "timeoutUs" microseconds.
43960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Returns the index of an output buffer that has been successfully
44060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * decoded or one of the INFO_* constants below.
44160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param info Will be filled with buffer meta data.
44260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param timeoutUs The timeout in microseconds, a negative timeout indicates "infinite".
44360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
44488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public native final int dequeueOutputBuffer(
44588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            BufferInfo info, long timeoutUs);
44688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
44760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
44860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * If you are done with a buffer, use this call to return the buffer to
44960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * the codec. If you previously specified a surface when configuring this
45060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * video decoder you can optionally render the buffer.
45160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param index The index of a client-owned output buffer previously returned
45260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *              in a call to {@link #dequeueOutputBuffer}.
45360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * @param render If a valid surface was specified when configuring the codec,
45460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     *               passing true renders this output buffer to the surface.
45560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
45688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    public native final void releaseOutputBuffer(int index, boolean render);
45788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
45860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
45960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Call this after dequeueOutputBuffer signals a format change by returning
46060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * {@link #INFO_OUTPUT_FORMAT_CHANGED}
46188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber     */
46260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    public final MediaFormat getOutputFormat() {
46360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber        return new MediaFormat(getOutputFormatNative());
46460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    }
46588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
46660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    private native final Map<String, Object> getOutputFormatNative();
46760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber
46860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
46960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Call this after start() returns.
470c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber     */
471c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    public ByteBuffer[] getInputBuffers() {
472c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        return getBuffers(true /* input */);
473c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    }
474c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber
47560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
47660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * Call this after start() returns and whenever dequeueOutputBuffer
47760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * signals an output buffer change by returning
47860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * {@link #INFO_OUTPUT_BUFFERS_CHANGED}
47988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber     */
480c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    public ByteBuffer[] getOutputBuffers() {
481c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        return getBuffers(false /* input */);
482c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    }
483c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber
48460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
48560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * The content is scaled to the surface dimensions
48660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
48748dc91b514844b04f1d8dec18a480f9591a2f989Andreas Huber    public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT               = 1;
488b12a5390694e8525ac61d7377e266e31d124c815Andreas Huber
48960d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
49060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * The content is scaled, maintaining its aspect ratio, the whole
49160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * surface area is used, content may be cropped
49260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
493b12a5390694e8525ac61d7377e266e31d124c815Andreas Huber    public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING = 2;
494b12a5390694e8525ac61d7377e266e31d124c815Andreas Huber
49560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    /**
49660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * If a surface has been specified in a previous call to {@link #configure}
49760d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     * specifies the scaling mode to use. The default is "scale to fit".
49860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber     */
499b12a5390694e8525ac61d7377e266e31d124c815Andreas Huber    public native final void setVideoScalingMode(int mode);
500b12a5390694e8525ac61d7377e266e31d124c815Andreas Huber
501c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    private native final ByteBuffer[] getBuffers(boolean input);
50288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
50388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    private static native final void native_init();
50488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
50588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    private native final void native_setup(
50688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber            String name, boolean nameIsType, boolean encoder);
50788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
50888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    private native final void native_finalize();
50988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
51088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    static {
51188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        System.loadLibrary("media_jni");
51288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        native_init();
51388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
51488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
51588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    private int mNativeContext;
51688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
517