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 >= 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 >= 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 < 0 or wait up 41360d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber * to "timeoutUs" microseconds if timeoutUs > 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