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

Commit ccb7ac6b authored by Wonsik Kim's avatar Wonsik Kim
Browse files

media: MediaCodec buffer API revision

Bug: 136283874
Test: atest CtsMediaTestCases:MediaCodecBlockModelTest
Test: atest CtsMediaTestCases -- --module-arg CtsMediaTestCases:size:small
Change-Id: I3fb163be67112b28fa9998493b359f12d096e759
parent 2bb9f65c
Loading
Loading
Loading
Loading
+42 −0
Original line number Original line Diff line number Diff line
@@ -24737,7 +24737,9 @@ package android.media {
    method @Deprecated @NonNull public java.nio.ByteBuffer[] getOutputBuffers();
    method @Deprecated @NonNull public java.nio.ByteBuffer[] getOutputBuffers();
    method @NonNull public android.media.MediaFormat getOutputFormat();
    method @NonNull public android.media.MediaFormat getOutputFormat();
    method @NonNull public android.media.MediaFormat getOutputFormat(int);
    method @NonNull public android.media.MediaFormat getOutputFormat(int);
    method @NonNull public android.media.MediaCodec.OutputFrame getOutputFrame(int);
    method @Nullable public android.media.Image getOutputImage(int);
    method @Nullable public android.media.Image getOutputImage(int);
    method @NonNull public android.media.MediaCodec.QueueRequest getQueueRequest(int);
    method public void queueInputBuffer(int, int, int, long, int) throws android.media.MediaCodec.CryptoException;
    method public void queueInputBuffer(int, int, int, long, int) throws android.media.MediaCodec.CryptoException;
    method public void queueSecureInputBuffer(int, int, @NonNull android.media.MediaCodec.CryptoInfo, long, int) throws android.media.MediaCodec.CryptoException;
    method public void queueSecureInputBuffer(int, int, @NonNull android.media.MediaCodec.CryptoInfo, long, int) throws android.media.MediaCodec.CryptoException;
    method public void release();
    method public void release();
@@ -24761,6 +24763,7 @@ package android.media {
    field public static final int BUFFER_FLAG_PARTIAL_FRAME = 8; // 0x8
    field public static final int BUFFER_FLAG_PARTIAL_FRAME = 8; // 0x8
    field @Deprecated public static final int BUFFER_FLAG_SYNC_FRAME = 1; // 0x1
    field @Deprecated public static final int BUFFER_FLAG_SYNC_FRAME = 1; // 0x1
    field public static final int CONFIGURE_FLAG_ENCODE = 1; // 0x1
    field public static final int CONFIGURE_FLAG_ENCODE = 1; // 0x1
    field public static final int CONFIGURE_FLAG_USE_BLOCK_MODEL = 2; // 0x2
    field public static final int CRYPTO_MODE_AES_CBC = 2; // 0x2
    field public static final int CRYPTO_MODE_AES_CBC = 2; // 0x2
    field public static final int CRYPTO_MODE_AES_CTR = 1; // 0x1
    field public static final int CRYPTO_MODE_AES_CTR = 1; // 0x1
    field public static final int CRYPTO_MODE_UNENCRYPTED = 0; // 0x0
    field public static final int CRYPTO_MODE_UNENCRYPTED = 0; // 0x0
@@ -24837,6 +24840,24 @@ package android.media {
    method public void set(int, int);
    method public void set(int, int);
  }
  }
  public static final class MediaCodec.GraphicBlock {
    method protected void finalize();
    method public static boolean isCodecCopyFreeCompatible(@NonNull String[]);
    method public boolean isMappable();
    method @NonNull public android.media.Image map();
    method @NonNull public static android.media.MediaCodec.GraphicBlock obtain(int, int, int, long, @NonNull String[]);
    method public void recycle();
  }
  public static final class MediaCodec.LinearBlock {
    method protected void finalize();
    method public static boolean isCodecCopyFreeCompatible(@NonNull String[]);
    method public boolean isMappable();
    method @NonNull public java.nio.ByteBuffer map();
    method @Nullable public static android.media.MediaCodec.LinearBlock obtain(int, @NonNull String[]);
    method public void recycle();
  }
  public static final class MediaCodec.MetricsConstants {
  public static final class MediaCodec.MetricsConstants {
    field public static final String CODEC = "android.media.mediacodec.codec";
    field public static final String CODEC = "android.media.mediacodec.codec";
    field public static final String ENCODER = "android.media.mediacodec.encoder";
    field public static final String ENCODER = "android.media.mediacodec.encoder";
@@ -24854,6 +24875,27 @@ package android.media {
    method public void onFrameRendered(@NonNull android.media.MediaCodec, long, long);
    method public void onFrameRendered(@NonNull android.media.MediaCodec, long, long);
  }
  }
  public static final class MediaCodec.OutputFrame {
    method public void getChangedKeys(@NonNull java.util.Set<java.lang.String>);
    method public int getFlags();
    method @NonNull public android.media.MediaFormat getFormat();
    method @Nullable public android.media.MediaCodec.GraphicBlock getGraphicBlock();
    method @Nullable public android.media.MediaCodec.LinearBlock getLinearBlock();
    method public long getPresentationTimeUs();
  }
  public final class MediaCodec.QueueRequest {
    method public void queue();
    method @NonNull public android.media.MediaCodec.QueueRequest setByteBufferParameter(@NonNull String, @NonNull java.nio.ByteBuffer);
    method @NonNull public android.media.MediaCodec.QueueRequest setEncryptedLinearBlock(@NonNull android.media.MediaCodec.LinearBlock, int, @NonNull android.media.MediaCodec.CryptoInfo, long, int);
    method @NonNull public android.media.MediaCodec.QueueRequest setFloatParameter(@NonNull String, float);
    method @NonNull public android.media.MediaCodec.QueueRequest setGraphicBlock(@NonNull android.media.MediaCodec.GraphicBlock, long, int);
    method @NonNull public android.media.MediaCodec.QueueRequest setIntegerParameter(@NonNull String, int);
    method @NonNull public android.media.MediaCodec.QueueRequest setLinearBlock(@NonNull android.media.MediaCodec.LinearBlock, int, int, long, int);
    method @NonNull public android.media.MediaCodec.QueueRequest setLongParameter(@NonNull String, long);
    method @NonNull public android.media.MediaCodec.QueueRequest setStringParameter(@NonNull String, @NonNull String);
  }
  public final class MediaCodecInfo {
  public final class MediaCodecInfo {
    method @NonNull public String getCanonicalName();
    method @NonNull public String getCanonicalName();
    method public android.media.MediaCodecInfo.CodecCapabilities getCapabilitiesForType(String);
    method public android.media.MediaCodecInfo.CodecCapabilities getCapabilitiesForType(String);
+984 −33

File changed.

Preview size limit exceeded, changes collapsed.

+2 −0
Original line number Original line Diff line number Diff line
cc_library_shared {
cc_library_shared {
    name: "libmedia_jni",
    name: "libmedia_jni",


    defaults: ["libcodec2-internal-defaults"],

    srcs: [
    srcs: [
        "android_media_ImageWriter.cpp",
        "android_media_ImageWriter.cpp",
        "android_media_ImageReader.cpp",
        "android_media_ImageReader.cpp",
+1129 −192

File changed.

Preview size limit exceeded, changes collapsed.

+27 −10
Original line number Original line Diff line number Diff line
@@ -27,6 +27,8 @@
#include <media/stagefright/foundation/AHandler.h>
#include <media/stagefright/foundation/AHandler.h>
#include <utils/Errors.h>
#include <utils/Errors.h>


class C2Buffer;

namespace android {
namespace android {


struct ABuffer;
struct ABuffer;
@@ -39,6 +41,7 @@ struct MediaCodec;
struct PersistentSurface;
struct PersistentSurface;
class Surface;
class Surface;
namespace hardware {
namespace hardware {
class HidlMemory;
namespace cas {
namespace cas {
namespace native {
namespace native {
namespace V1_0 {
namespace V1_0 {
@@ -97,6 +100,26 @@ struct JMediaCodec : public AHandler {
            uint32_t flags,
            uint32_t flags,
            AString *errorDetailMsg);
            AString *errorDetailMsg);


    status_t queueBuffer(
            size_t index, const std::shared_ptr<C2Buffer> &buffer,
            int64_t timeUs, uint32_t flags, const sp<AMessage> &tunings,
            AString *errorDetailMsg);

    status_t queueEncryptedLinearBlock(
            size_t index,
            const sp<hardware::HidlMemory> &buffer,
            size_t offset,
            const CryptoPlugin::SubSample *subSamples,
            size_t numSubSamples,
            const uint8_t key[16],
            const uint8_t iv[16],
            CryptoPlugin::Mode mode,
            const CryptoPlugin::Pattern &pattern,
            int64_t presentationTimeUs,
            uint32_t flags,
            const sp<AMessage> &tunings,
            AString *errorDetailMsg);

    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs);
    status_t dequeueInputBuffer(size_t *index, int64_t timeoutUs);


    status_t dequeueOutputBuffer(
    status_t dequeueOutputBuffer(
@@ -120,6 +143,9 @@ struct JMediaCodec : public AHandler {
    status_t getImage(
    status_t getImage(
            JNIEnv *env, bool input, size_t index, jobject *image) const;
            JNIEnv *env, bool input, size_t index, jobject *image) const;


    status_t getOutputFrame(
            JNIEnv *env, jobject frame, size_t index) const;

    status_t getName(JNIEnv *env, jstring *name) const;
    status_t getName(JNIEnv *env, jstring *name) const;


    status_t getCodecInfo(JNIEnv *env, jobject *codecInfo) const;
    status_t getCodecInfo(JNIEnv *env, jobject *codecInfo) const;
@@ -147,17 +173,10 @@ private:
    jweak mObject;
    jweak mObject;
    sp<Surface> mSurfaceTextureClient;
    sp<Surface> mSurfaceTextureClient;


    // java objects cached
    jclass mByteBufferClass;
    jobject mNativeByteOrderObj;
    jmethodID mByteBufferOrderMethodID;
    jmethodID mByteBufferPositionMethodID;
    jmethodID mByteBufferLimitMethodID;
    jmethodID mByteBufferAsReadOnlyBufferMethodID;

    sp<ALooper> mLooper;
    sp<ALooper> mLooper;
    sp<MediaCodec> mCodec;
    sp<MediaCodec> mCodec;
    AString mNameAtCreation;
    AString mNameAtCreation;
    bool mGraphicOutput{false};
    std::once_flag mReleaseFlag;
    std::once_flag mReleaseFlag;


    sp<AMessage> mCallbackNotification;
    sp<AMessage> mCallbackNotification;
@@ -170,8 +189,6 @@ private:
            JNIEnv *env, bool readOnly, bool clearBuffer, const sp<T> &buffer,
            JNIEnv *env, bool readOnly, bool clearBuffer, const sp<T> &buffer,
            jobject *buf) const;
            jobject *buf) const;


    void cacheJavaObjects(JNIEnv *env);
    void deleteJavaObjects(JNIEnv *env);
    void handleCallback(const sp<AMessage> &msg);
    void handleCallback(const sp<AMessage> &msg);
    void handleFrameRenderedNotification(const sp<AMessage> &msg);
    void handleFrameRenderedNotification(const sp<AMessage> &msg);