diff --git a/media/ffvpx/libavcodec/avcodec.h b/media/ffvpx/libavcodec/avcodec.h
--- a/media/ffvpx/libavcodec/avcodec.h
+++ b/media/ffvpx/libavcodec/avcodec.h
@@ -2105,6 +2105,8 @@ typedef struct AVCodecContext {
      */
     AVFrameSideData  **decoded_side_data;
     int             nb_decoded_side_data;
+
+    void* moz_ndk_crypto;
 } AVCodecContext;
 
 /**
diff --git a/media/ffvpx/libavcodec/mediacodec_wrapper.c b/media/ffvpx/libavcodec/mediacodec_wrapper.c
--- a/media/ffvpx/libavcodec/mediacodec_wrapper.c
+++ b/media/ffvpx/libavcodec/mediacodec_wrapper.c
@@ -1537,6 +1537,11 @@ fail:
     return ret;
 }
 
+static int mediacodec_jni_queueSecureInputBuffer(FFAMediaCodec* ctx, size_t idx, off_t offset, void* cryptoInfo, uint64_t time, uint32_t flags)
+{
+    return AVERROR_PATCHWELCOME;
+}
+
 static ssize_t mediacodec_jni_dequeueOutputBuffer(FFAMediaCodec* ctx, FFAMediaCodecBufferInfo *info, int64_t timeoutUs)
 {
     int ret = 0;
@@ -1811,6 +1816,7 @@ static const FFAMediaCodec media_codec_jni = {
 
     .dequeueInputBuffer = mediacodec_jni_dequeueInputBuffer,
     .queueInputBuffer = mediacodec_jni_queueInputBuffer,
+    .queueSecureInputBuffer = mediacodec_jni_queueSecureInputBuffer,
 
     .dequeueOutputBuffer = mediacodec_jni_dequeueOutputBuffer,
     .getOutputFormat = mediacodec_jni_getOutputFormat,
@@ -2209,7 +2215,7 @@ static int mediacodec_ndk_configure(FFAMediaCodec* ctx,
             return AVERROR_EXTERNAL;
         }
     } else {
-        status = AMediaCodec_configure(codec->impl, format->impl, native_window, NULL, flags);
+        status = AMediaCodec_configure(codec->impl, format->impl, native_window, (AMediaCrypto*)crypto, flags);
         if (status != AMEDIA_OK) {
             av_log(codec, AV_LOG_ERROR, "Decoder configure failed, %d\n", status);
             return AVERROR_EXTERNAL;
@@ -2263,6 +2269,14 @@ static int mediacodec_ndk_queueInputBuffer(FFAMediaCodec *ctx, size_t idx,
     return AMediaCodec_queueInputBuffer(codec->impl, idx, offset, size, time, flags);
 }
 
+static int mediacodec_ndk_queueSecureInputBuffer(FFAMediaCodec *ctx, size_t idx,
+                                                 off_t offset, void* cryptoInfo,
+                                                 uint64_t time, uint32_t flags)
+{
+    FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx;
+    return AMediaCodec_queueSecureInputBuffer(codec->impl, idx, offset, (AMediaCodecCryptoInfo*)cryptoInfo, time, flags);
+}
+
 static ssize_t mediacodec_ndk_dequeueOutputBuffer(FFAMediaCodec* ctx, FFAMediaCodecBufferInfo *info, int64_t timeoutUs)
 {
     FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx;
@@ -2507,6 +2521,7 @@ static const FFAMediaCodec media_codec_ndk = {
 
     .dequeueInputBuffer = mediacodec_ndk_dequeueInputBuffer,
     .queueInputBuffer = mediacodec_ndk_queueInputBuffer,
+    .queueSecureInputBuffer = mediacodec_ndk_queueSecureInputBuffer,
 
     .dequeueOutputBuffer = mediacodec_ndk_dequeueOutputBuffer,
     .getOutputFormat = mediacodec_ndk_getOutputFormat,
diff --git a/media/ffvpx/libavcodec/mediacodec_wrapper.h b/media/ffvpx/libavcodec/mediacodec_wrapper.h
--- a/media/ffvpx/libavcodec/mediacodec_wrapper.h
+++ b/media/ffvpx/libavcodec/mediacodec_wrapper.h
@@ -214,6 +214,7 @@ struct FFAMediaCodec {
 
     ssize_t (*dequeueInputBuffer)(FFAMediaCodec* codec, int64_t timeoutUs);
     int (*queueInputBuffer)(FFAMediaCodec* codec, size_t idx, off_t offset, size_t size, uint64_t time, uint32_t flags);
+    int (*queueSecureInputBuffer)(FFAMediaCodec* codec, size_t idx, off_t offset, void* cryptoInfo, uint64_t time, uint32_t flags);
 
     ssize_t (*dequeueOutputBuffer)(FFAMediaCodec* codec, FFAMediaCodecBufferInfo *info, int64_t timeoutUs);
     FFAMediaFormat* (*getOutputFormat)(FFAMediaCodec* codec);
@@ -299,6 +300,11 @@ static inline int ff_AMediaCodec_queueInputBuffer(FFAMediaCodec *codec, size_t i
     return codec->queueInputBuffer(codec, idx, offset, size, time, flags);
 }
 
+static inline int ff_AMediaCodec_queueSecureInputBuffer(FFAMediaCodec *codec, size_t idx, off_t offset, void* cryptoInfo, uint64_t time, uint32_t flags)
+{
+    return codec->queueSecureInputBuffer(codec, idx, offset, cryptoInfo, time, flags);
+}
+
 static inline ssize_t ff_AMediaCodec_dequeueOutputBuffer(FFAMediaCodec* codec, FFAMediaCodecBufferInfo *info, int64_t timeoutUs)
 {
     return codec->dequeueOutputBuffer(codec, info, timeoutUs);
diff --git a/media/ffvpx/libavcodec/mediacodecdec_common.c b/media/ffvpx/libavcodec/mediacodecdec_common.c
--- a/media/ffvpx/libavcodec/mediacodecdec_common.c
+++ b/media/ffvpx/libavcodec/mediacodecdec_common.c
@@ -837,7 +837,7 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
     if (ret < 0)
         goto fail;
 
-    status = ff_AMediaCodec_configure(s->codec, format, s->surface, NULL, 0);
+    status = ff_AMediaCodec_configure(s->codec, format, s->surface, avctx->moz_ndk_crypto, 0);
     if (status < 0) {
         char *desc = ff_AMediaFormat_toString(format);
         av_log(avctx, AV_LOG_ERROR,
@@ -943,7 +943,11 @@ int ff_mediacodec_dec_send(AVCodecContext *avctx, MediaCodecDecContext *s,
 
             av_log(avctx, AV_LOG_DEBUG, "Sending End Of Stream signal\n");
 
-            status = ff_AMediaCodec_queueInputBuffer(codec, index, 0, 0, pts, flags);
+            if (pkt->moz_ndk_crypto_info) {
+                status = ff_AMediaCodec_queueSecureInputBuffer(codec, index, 0, pkt->moz_ndk_crypto_info, pts, flags);
+            } else {
+                status = ff_AMediaCodec_queueInputBuffer(codec, index, 0, 0, pts, flags);
+            }
             if (status < 0) {
                 av_log(avctx, AV_LOG_ERROR, "Failed to queue input empty buffer (status = %d)\n", status);
                 return AVERROR_EXTERNAL;
@@ -960,7 +964,11 @@ int ff_mediacodec_dec_send(AVCodecContext *avctx, MediaCodecDecContext *s,
         memcpy(data, pkt->data + offset, size);
         offset += size;
 
-        status = ff_AMediaCodec_queueInputBuffer(codec, index, 0, size, pts, 0);
+        if (pkt->moz_ndk_crypto_info) {
+            status = ff_AMediaCodec_queueSecureInputBuffer(codec, index, 0, pkt->moz_ndk_crypto_info, pts, 0);
+        } else {
+            status = ff_AMediaCodec_queueInputBuffer(codec, index, 0, size, pts, 0);
+        }
         if (status < 0) {
             av_log(avctx, AV_LOG_ERROR, "Failed to queue input buffer (status = %d)\n", status);
             return AVERROR_EXTERNAL;
diff --git a/media/ffvpx/libavcodec/packet.h b/media/ffvpx/libavcodec/packet.h
--- a/media/ffvpx/libavcodec/packet.h
+++ b/media/ffvpx/libavcodec/packet.h
@@ -581,6 +581,8 @@ typedef struct AVPacket {
      * or muxers.
      */
     AVRational time_base;
+
+    void* moz_ndk_crypto_info;
 } AVPacket;
 
 #if FF_API_INIT_PACKET
