Class ShadowMediaCodec

java.lang.Object
org.robolectric.shadows.ShadowMediaCodec

@Implements(value=android.media.MediaCodec.class, looseSignatures=true) public class ShadowMediaCodec extends Object
Implementation of MediaCodec which supports both asynchronous and synchronous modes.

By default for any encoded required, a 1 to 1 mapping will be used between the input and output buffers. Data from a queued input buffer will be copied to the output buffer. In the case that is it necessary so simulate some form of data compression, a custom encoder or decoder can be added via addEncoder(String, CodecConfig) and addDecoder(String, CodecConfig) respectively.

Asynchronous mode: Once the codec is started, a format change will be reported, switching to an empty MediaFormat with fake codec-specific info. Following this, the implementation will present an input buffer, which will be copied to an output buffer once queued, which will be subsequently presented to the callback handler.

  • Constructor Details

    • ShadowMediaCodec

      public ShadowMediaCodec()
  • Method Details

    • addEncoder

      public static void addEncoder(String type, ShadowMediaCodec.CodecConfig config)
      Add a fake encoding codec to the Shadow.
    • addDecoder

      public static void addDecoder(String type, ShadowMediaCodec.CodecConfig config)
      Add a fake decoding codec to the Shadow.
    • clearCodecs

      @Resetter public static void clearCodecs()
      Clears any previously added encoders and decoders.
    • __constructor__

      @Implementation protected void __constructor__(String name, boolean nameIsType, boolean encoder)
    • native_setCallback

      @Implementation protected void native_setCallback(MediaCodec.Callback callback)
      Saves the callback to allow use inside the shadow.
    • native_configure

      @Implementation(maxSdk=25) protected void native_configure(String[] keys, Object[] values, Surface surface, MediaCrypto crypto, int flags)
    • native_configure

      @Implementation(minSdk=26) protected void native_configure(Object keys, Object values, Object surface, Object crypto, Object descramblerBinder, Object flags)
    • native_start

      @Implementation protected void native_start()
      Starts the async encoding process, by first reporting a format change event, and then presenting an input buffer to the callback.
    • native_flush

      @Implementation protected void native_flush()
      Flushes the available output buffers.
    • getBuffers

      @Implementation protected ByteBuffer[] getBuffers(boolean input)
      Returns the shadow buffers used for input or output.
    • getBuffer

      @Implementation protected ByteBuffer getBuffer(boolean input, int index)
      Returns the input or output buffer corresponding to the given index, or null if invalid.
    • native_dequeueInputBuffer

      @Implementation protected int native_dequeueInputBuffer(long timeoutUs)
    • native_queueInputBuffer

      @Implementation protected void native_queueInputBuffer(int index, int offset, int size, long presentationTimeUs, int flags)
      Triggers presentation of the corresponding output buffer for the given input buffer, and passes the given metadata as buffer info.
    • native_dequeueOutputBuffer

      @Implementation protected int native_dequeueOutputBuffer(MediaCodec.BufferInfo info, long timeoutUs)
    • releaseOutputBuffer

      @Implementation protected void releaseOutputBuffer(int index, boolean renderer)
    • releaseOutputBuffer

      @Implementation protected void releaseOutputBuffer(int index, long renderTimestampNs)
    • invalidateByteBuffer

      @Implementation(maxSdk=33) protected void invalidateByteBuffer(ByteBuffer[] buffers, int index)
      Prevents calling Android-only methods on basic ByteBuffer objects.
    • invalidateByteBufferLocked

      @Implementation(minSdk=34) protected void invalidateByteBufferLocked(ByteBuffer[] buffers, int index, boolean input)
    • validateInputByteBuffer

      @Implementation(maxSdk=33) protected void validateInputByteBuffer(ByteBuffer[] buffers, int index)
      Prevents calling Android-only methods on basic ByteBuffer objects.
    • validateInputByteBufferLocked

      @Implementation(minSdk=34) protected void validateInputByteBufferLocked(ByteBuffer[] buffers, int index)
    • revalidateByteBuffer

      @Implementation(maxSdk=33) protected void revalidateByteBuffer(ByteBuffer[] buffers, int index)
      Prevents calling Android-only methods on basic ByteBuffer objects.
    • revalidateByteBuffer

      @Implementation(minSdk=34) protected void revalidateByteBuffer(ByteBuffer[] buffers, int index, boolean input)
    • validateOutputByteBuffer

      @Implementation(maxSdk=33) protected void validateOutputByteBuffer(ByteBuffer[] buffers, int index, MediaCodec.BufferInfo info)
      Prevents calling Android-only methods on basic ByteBuffer objects. Replicates existing behavior adjusting buffer positions and limits.
    • validateOutputByteBufferLocked

      @Implementation(minSdk=34) protected void validateOutputByteBufferLocked(ByteBuffer[] buffers, int index, MediaCodec.BufferInfo info)
    • invalidateByteBuffers

      @Implementation(maxSdk=33) protected void invalidateByteBuffers(ByteBuffer[] buffers)
      Prevents calling Android-only methods on basic ByteBuffer objects.
    • invalidateByteBuffersLocked

      @Implementation(minSdk=34) protected void invalidateByteBuffersLocked(ByteBuffer[] buffers)
    • freeByteBuffer

      @Implementation(maxSdk=33) protected void freeByteBuffer(ByteBuffer buffer)
      Prevents attempting to free non-direct ByteBuffer objects.
    • freeByteBufferLocked

      @Implementation(minSdk=34) protected void freeByteBufferLocked(ByteBuffer buffer)
    • getOutputFormat

      @Implementation protected MediaFormat getOutputFormat()
      Returns a default MediaFormat if not set via getOutputFormat().