IT. Expert System.

Android Reference

MediaCodec


android.media

Class MediaCodec



  • public final class MediaCodec
    extends Object
    MediaCodec class can be used to access low-level media codec, i.e. encoder/decoder components.

    MediaCodec is generally used like this:

     MediaCodec codec = MediaCodec.createDecoderByType(type);
     codec.configure(format, ...);
     codec.start();
     ByteBuffer[] inputBuffers = codec.getInputBuffers();
     ByteBuffer[] outputBuffers = codec.getOutputBuffers();
     for (;;) {
       int inputBufferIndex = codec.dequeueInputBuffer(timeoutUs);
       if (inputBufferIndex >= 0) {
         // fill inputBuffers[inputBufferIndex] with valid data
         ...
         codec.queueInputBuffer(inputBufferIndex, ...);
       }
    
       int outputBufferIndex = codec.dequeueOutputBuffer(timeoutUs);
       if (outputBufferIndex >= 0) {
         // outputBuffer is ready to be processed or rendered.
         ...
         codec.releaseOutputBuffer(outputBufferIndex, ...);
       } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
         outputBuffers = codec.getOutputBuffers();
       } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
         // Subsequent data will conform to new format.
         MediaFormat format = codec.getOutputFormat();
         ...
       }
     }
     codec.stop();
     codec.release();
     codec = null;
     
    Each codec maintains a number of input and output buffers that are referred to by index in API calls. The contents of these buffers is represented by the ByteBuffer[] arrays accessible through getInputBuffers() and getOutputBuffers(). After a successful call to start() the client "owns" neither input nor output buffers, subsequent calls to dequeueInputBuffer(long) and dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long) then transfer ownership from the codec to the client.

    The client is not required to resubmit/release buffers immediately to the codec, the sample code above simply does this for simplicity's sake.

    Once the client has an input buffer available it can fill it with data and submit it it to the codec via a call to queueInputBuffer(int, int, int, long, int).

    The codec in turn will return an output buffer to the client in response to dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long). After the output buffer has been processed a call to releaseOutputBuffer(int, boolean) will return it to the codec. If a video surface has been provided in the call to configure(android.media.MediaFormat, android.view.Surface, android.media.MediaCrypto, int), releaseOutputBuffer(int, boolean) optionally allows rendering of the buffer to the surface.

    Input buffers (for decoders) and Output buffers (for encoders) contain encoded data according to the format's type. For video types this data is all the encoded data representing a single moment in time, for audio data this is slightly relaxed in that a buffer may contain multiple encoded frames of audio. In either case, buffers do not start and end on arbitrary byte boundaries, this is not a stream of bytes, it's a stream of access units.

    Most formats also require the actual data to be prefixed by a number of buffers containing setup data, or codec specific data, i.e. the first few buffers submitted to the codec object after starting it must be codec specific data marked as such using the flag BUFFER_FLAG_CODEC_CONFIG in a call to queueInputBuffer(int, int, int, long, int). Codec specific data included in the format passed to configure(android.media.MediaFormat, android.view.Surface, android.media.MediaCrypto, int) (in ByteBuffer entries with keys "csd-0", "csd-1", ...) is automatically submitted to the codec, this data MUST NOT be submitted explicitly by the client. Once the client reaches the end of the input data it signals the end of the input stream by specifying a flag of BUFFER_FLAG_END_OF_STREAM in the call to queueInputBuffer(int, int, int, long, int). The codec will continue to return output buffers until it eventually signals the end of the output stream by specifying the same flag (BUFFER_FLAG_END_OF_STREAM) on the BufferInfo returned in dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long). In order to start decoding data that's not adjacent to previously submitted data (i.e. after a seek) it is necessary to flush() the decoder. Any input or output buffers the client may own at the point of the flush are immediately revoked, i.e. after a call to flush() the client does not own any buffers anymore. Note that the format of the data submitted after a flush must not change, flush does not support format discontinuities, for this a full stop(), configure(), start() cycle is necessary.

    • Field Detail

      • BUFFER_FLAG_SYNC_FRAME

        public static final int BUFFER_FLAG_SYNC_FRAME
        This indicates that the buffer marked as such contains the data for a sync frame.
        See Also:
        Constant Field Values
      • BUFFER_FLAG_CODEC_CONFIG

        public static final int BUFFER_FLAG_CODEC_CONFIG
        This indicated that the buffer marked as such contains codec initialization / codec specific data instead of media data.
        See Also:
        Constant Field Values
      • BUFFER_FLAG_END_OF_STREAM

        public static final int BUFFER_FLAG_END_OF_STREAM
        This signals the end of stream, i.e. no buffers will be available after this, unless of course, flush() follows.
        See Also:
        Constant Field Values
      • CONFIGURE_FLAG_ENCODE

        public static final int CONFIGURE_FLAG_ENCODE
        If this codec is to be used as an encoder, pass this flag.
        See Also:
        Constant Field Values
      • INFO_OUTPUT_FORMAT_CHANGED

        public static final int INFO_OUTPUT_FORMAT_CHANGED
        The output format has changed, subsequent data will follow the new format. getOutputFormat() returns the new format.
        See Also:
        Constant Field Values
      • INFO_OUTPUT_BUFFERS_CHANGED

        public static final int INFO_OUTPUT_BUFFERS_CHANGED
        The output buffers have changed, the client must refer to the new set of output buffers returned by getOutputBuffers() from this point on.
        See Also:
        Constant Field Values
      • VIDEO_SCALING_MODE_SCALE_TO_FIT

        public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT
        The content is scaled to the surface dimensions
        See Also:
        Constant Field Values
      • VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING

        public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING
        The content is scaled, maintaining its aspect ratio, the whole surface area is used, content may be cropped
        See Also:
        Constant Field Values
    • Method Detail

      • createDecoderByType

        public static MediaCodec createDecoderByType(String type)
        Instantiate a decoder supporting input data of the given mime type. The following is a partial list of defined mime types and their semantics:
        • "video/x-vnd.on2.vp8" - VPX video (i.e. video in .webm)
        • "video/avc" - H.264/AVC video
        • "video/mp4v-es" - MPEG4 video
        • "video/3gpp" - H.263 video
        • "audio/3gpp" - AMR narrowband audio
        • "audio/amr-wb" - AMR wideband audio
        • "audio/mpeg" - MPEG1/2 audio layer III
        • "audio/mp4a-latm" - AAC audio
        • "audio/vorbis" - vorbis audio
        • "audio/g711-alaw" - G.711 alaw audio
        • "audio/g711-mlaw" - G.711 ulaw audio
        Parameters:
        type - The mime type of the input data.
      • createEncoderByType

        public static MediaCodec createEncoderByType(String type)
        Instantiate an encoder supporting output data of the given mime type.
        Parameters:
        type - The desired mime type of the output data.
      • createByCodecName

        public static MediaCodec createByCodecName(String name)
        If you know the exact name of the component you want to instantiate use this method to instantiate it. Use with caution. Likely to be used with information obtained from MediaCodecList
        Parameters:
        name - The name of the codec to be instantiated.
      • finalize

        protected void finalize()
        Description copied from class: Object
        Invoked when the garbage collector has detected that this instance is no longer reachable. The default implementation does nothing, but this method can be overridden to free resources.

        Note that objects that override finalize are significantly more expensive than objects that don't. Finalizers may be run a long time after the object is no longer reachable, depending on memory pressure, so it's a bad idea to rely on them for cleanup. Note also that finalizers are run on a single VM-wide finalizer thread, so doing blocking work in a finalizer is a bad idea. A finalizer is usually only necessary for a class that has a native peer and needs to call a native method to destroy that peer. Even then, it's better to provide an explicit close method (and implement Closeable), and insist that callers manually dispose of instances. This works well for something like files, but less well for something like a BigInteger where typical calling code would have to deal with lots of temporaries. Unfortunately, code that creates lots of temporaries is the worst kind of code from the point of view of the single finalizer thread.

        If you must use finalizers, consider at least providing your own ReferenceQueue and having your own thread process that queue.

        Unlike constructors, finalizers are not automatically chained. You are responsible for calling super.finalize() yourself.

        Uncaught exceptions thrown by finalizers are ignored and do not terminate the finalizer thread. See Effective Java Item 7, "Avoid finalizers" for more.

        Overrides:
        finalize in class Object
      • release

        public final void release()
        Make sure you call this when you're done to free up any opened component instance instead of relying on the garbage collector to do this for you at some point in the future.
      • configure

        public void configure(MediaFormat format,
                     Surface surface,
                     MediaCrypto crypto,
                     int flags)
        Configures a component.
        Parameters:
        format - The format of the input data (decoder) or the desired format of the output data (encoder).
        surface - Specify a surface on which to render the output of this decoder.
        crypto - Specify a crypto object to facilitate secure decryption of the media data.
        flags - Specify CONFIGURE_FLAG_ENCODE to configure the component as an encoder.
      • start

        public final void start()
        After successfully configuring the component, call start. On return you can query the component for its input/output buffers.
      • stop

        public final void stop()
        Finish the decode/encode session, note that the codec instance remains active and ready to be start()ed again. To ensure that it is available to other client call release() and don't just rely on garbage collection to eventually do this for you.
      • dequeueInputBuffer

        public final int dequeueInputBuffer(long timeoutUs)
        Returns the index of an input buffer to be filled with valid data or -1 if no such buffer is currently available. This method will return immediately if timeoutUs == 0, wait indefinitely for the availability of an input buffer if timeoutUs < 0 or wait up to "timeoutUs" microseconds if timeoutUs > 0.
        Parameters:
        timeoutUs - The timeout in microseconds, a negative timeout indicates "infinite".
      • dequeueOutputBuffer

        public final int dequeueOutputBuffer(MediaCodec.BufferInfo info,
                              long timeoutUs)
        Dequeue an output buffer, block at most "timeoutUs" microseconds. Returns the index of an output buffer that has been successfully decoded or one of the INFO_* constants below.
        Parameters:
        info - Will be filled with buffer meta data.
        timeoutUs - The timeout in microseconds, a negative timeout indicates "infinite".
      • releaseOutputBuffer

        public final void releaseOutputBuffer(int index,
                               boolean render)
        If you are done with a buffer, use this call to return the buffer to the codec. If you previously specified a surface when configuring this video decoder you can optionally render the buffer.
        Parameters:
        index - The index of a client-owned output buffer previously returned in a call to dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long).
        render - If a valid surface was specified when configuring the codec, passing true renders this output buffer to the surface.
      • getInputBuffers

        public ByteBuffer[] getInputBuffers()
        Call this after start() returns.
      • getOutputBuffers

        public ByteBuffer[] getOutputBuffers()
        Call this after start() returns and whenever dequeueOutputBuffer signals an output buffer change by returning INFO_OUTPUT_BUFFERS_CHANGED


Content

Android Reference

Java basics

Java Enterprise Edition (EE)

Java Standard Edition (SE)

SQL

HTML

PHP

CSS

Java Script

MYSQL

JQUERY

VBS

REGEX

C

C++

C#

Design patterns

RFC (standard status)

RFC (proposed standard status)

RFC (draft standard status)

RFC (informational status)

RFC (experimental status)

RFC (best current practice status)

RFC (historic status)

RFC (unknown status)

IT dictionary

License.
All information of this service is derived from the free sources and is provided solely in the form of quotations. This service provides information and interfaces solely for the familiarization (not ownership) and under the "as is" condition.
Copyright 2016 © ELTASK.COM. All rights reserved.
Site is optimized for mobile devices.
Downloads: 381 / . Delta: 0.04182 с