Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] Add Mediacodec audio decoders support
@ 2024-06-12 13:42 Matthieu Bouron
  2024-06-12 13:42 ` [FFmpeg-devel] [PATCH 1/2] avcodec/mediacodecdec_common: ensure input buffer timestamp is positive Matthieu Bouron
                   ` (3 more replies)
  0 siblings, 4 replies; 23+ messages in thread
From: Matthieu Bouron @ 2024-06-12 13:42 UTC (permalink / raw)
  To: ffmpeg-devel

Hello,

This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
MP3, FLAC, VORBIS and OPUS are supported.

This is mainly useful to avoid shipping Android builds of FFmpeg that are
subjects to licensing/patents (due to AAC and AMR).

Best regards,
Matthieu

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [FFmpeg-devel] [PATCH 1/2] avcodec/mediacodecdec_common: ensure input buffer timestamp is positive
  2024-06-12 13:42 [FFmpeg-devel] Add Mediacodec audio decoders support Matthieu Bouron
@ 2024-06-12 13:42 ` Matthieu Bouron
  2024-06-12 13:42 ` [FFmpeg-devel] [PATCH 2/2] avcodec: add Mediacodec audio decoders support Matthieu Bouron
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 23+ messages in thread
From: Matthieu Bouron @ 2024-06-12 13:42 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Matthieu Bouron

Submitting a buffer with a negative timestamp seems to stall the Mediacodec audio
decoders.
---
 libavcodec/mediacodecdec_common.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c
index d6f91e6e89..4d22db8ecf 100644
--- a/libavcodec/mediacodecdec_common.c
+++ b/libavcodec/mediacodecdec_common.c
@@ -658,6 +658,8 @@ int ff_mediacodec_dec_send(AVCodecContext *avctx, MediaCodecDecContext *s,
         if (pts && avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
             pts = av_rescale_q(pts, avctx->pkt_timebase, AV_TIME_BASE_Q);
         }
+        if (pts < 0)
+            pts = 0;
 
         if (need_draining) {
             uint32_t flags = ff_AMediaCodec_getBufferFlagEndOfStream(codec);
-- 
2.45.2

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* [FFmpeg-devel] [PATCH 2/2] avcodec: add Mediacodec audio decoders support
  2024-06-12 13:42 [FFmpeg-devel] Add Mediacodec audio decoders support Matthieu Bouron
  2024-06-12 13:42 ` [FFmpeg-devel] [PATCH 1/2] avcodec/mediacodecdec_common: ensure input buffer timestamp is positive Matthieu Bouron
@ 2024-06-12 13:42 ` Matthieu Bouron
  2024-07-10  8:47   ` Matthieu Bouron
  2024-07-28 15:23   ` Zhao Zhili
  2024-06-12 14:00 ` [FFmpeg-devel] Add " Paul B Mahol
  2024-07-10 13:54 ` Zhao Zhili
  3 siblings, 2 replies; 23+ messages in thread
From: Matthieu Bouron @ 2024-06-12 13:42 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Matthieu Bouron

---
 configure                         |  14 ++
 libavcodec/Makefile               |   7 +
 libavcodec/allcodecs.c            |   7 +
 libavcodec/mediacodecdec.c        | 215 ++++++++++++++++++-
 libavcodec/mediacodecdec_common.c | 333 +++++++++++++++++++++++++++---
 5 files changed, 545 insertions(+), 31 deletions(-)

diff --git a/configure b/configure
index 83284427df..d7de3b73ed 100755
--- a/configure
+++ b/configure
@@ -3321,14 +3321,22 @@ amf_deps_any="libdl LoadLibrary"
 nvenc_deps="ffnvcodec"
 nvenc_deps_any="libdl LoadLibrary"
 
+aac_mediacodec_decoder_deps="mediacodec"
+aac_mediacodec_decoder_select="aac_adtstoasc_bsf aac_parser"
 aac_mf_encoder_deps="mediafoundation"
 ac3_mf_encoder_deps="mediafoundation"
+amrnb_mediacodec_decoder_deps="mediacodec"
+amrnb_mediacodec_decoder_select="amr_parser"
+amrwb_mediacodec_decoder_deps="mediacodec"
+amrwb_mediacodec_decoder_select="amr_parser"
 av1_cuvid_decoder_deps="cuvid CUVIDAV1PICPARAMS"
 av1_mediacodec_decoder_deps="mediacodec"
 av1_mediacodec_encoder_deps="mediacodec"
 av1_mediacodec_encoder_select="extract_extradata_bsf"
 av1_nvenc_encoder_deps="nvenc NV_ENC_PIC_PARAMS_AV1"
 av1_nvenc_encoder_select="atsc_a53"
+flac_mediacodec_decoder_deps="mediacodec"
+flac_mediacodec_decoder_select="flac_parser"
 h263_v4l2m2m_decoder_deps="v4l2_m2m h263_v4l2_m2m"
 h263_v4l2m2m_encoder_deps="v4l2_m2m h263_v4l2_m2m"
 h264_amf_encoder_deps="amf"
@@ -3377,6 +3385,8 @@ mjpeg_qsv_encoder_select="qsvenc"
 mjpeg_vaapi_encoder_deps="VAEncPictureParameterBufferJPEG"
 mjpeg_vaapi_encoder_select="cbs_jpeg jpegtables vaapi_encode"
 mp3_mf_encoder_deps="mediafoundation"
+mp3_mediacodec_decoder_deps="mediacodec"
+mp3_mediacodec_decoder_select="mpegaudioheader"
 mpeg1_cuvid_decoder_deps="cuvid"
 mpeg1_v4l2m2m_decoder_deps="v4l2_m2m mpeg1_v4l2_m2m"
 mpeg2_cuvid_decoder_deps="cuvid"
@@ -3394,10 +3404,14 @@ mpeg4_mmal_decoder_deps="mmal"
 mpeg4_omx_encoder_deps="omx"
 mpeg4_v4l2m2m_decoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
 mpeg4_v4l2m2m_encoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
+opus_mediacodec_decoder_deps="mediacodec"
+opus_mediacodec_decoder_select="opus_parser"
 vc1_cuvid_decoder_deps="cuvid"
 vc1_mmal_decoder_deps="mmal"
 vc1_qsv_decoder_select="qsvdec"
 vc1_v4l2m2m_decoder_deps="v4l2_m2m vc1_v4l2_m2m"
+vorbis_mediacodec_decoder_deps="mediacodec"
+vorbis_mediacodec_decoder_select="vorbis_parser"
 vp8_cuvid_decoder_deps="cuvid"
 vp8_mediacodec_decoder_deps="mediacodec"
 vp8_mediacodec_encoder_deps="mediacodec"
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 1a44352906..64771b9944 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -196,6 +196,7 @@ OBJS-$(CONFIG_AAC_ENCODER)             += aacenc.o aaccoder.o aacenctab.o    \
                                           aacenc_pred.o \
                                           psymodel.o kbdwin.o \
                                           mpeg4audio_sample_rates.o
+OBJS-$(CONFIG_AAC_MEDIACODEC_DECODER)  += mediacodecdec.o
 OBJS-$(CONFIG_AAC_MF_ENCODER)          += mfenc.o mf_utils.o
 OBJS-$(CONFIG_AASC_DECODER)            += aasc.o msrledec.o
 OBJS-$(CONFIG_AC3_DECODER)             += ac3dec_float.o ac3dec_data.o ac3.o \
@@ -222,6 +223,8 @@ OBJS-$(CONFIG_AMRWB_DECODER)           += amrwbdec.o celp_filters.o   \
                                           celp_math.o acelp_filters.o \
                                           acelp_vectors.o             \
                                           acelp_pitch_delay.o
+OBJS-$(CONFIG_AMRNB_MEDIACODEC_DECODER) += mediacodecdec.o
+OBJS-$(CONFIG_AMRWB_MEDIACODEC_DECODER) += mediacodecdec.o
 OBJS-$(CONFIG_AMV_ENCODER)             += mjpegenc.o mjpegenc_common.o
 OBJS-$(CONFIG_ANM_DECODER)             += anm.o
 OBJS-$(CONFIG_ANULL_DECODER)           += null.o
@@ -367,6 +370,7 @@ OBJS-$(CONFIG_FIC_DECODER)             += fic.o
 OBJS-$(CONFIG_FITS_DECODER)            += fitsdec.o fits.o
 OBJS-$(CONFIG_FITS_ENCODER)            += fitsenc.o
 OBJS-$(CONFIG_FLAC_DECODER)            += flacdec.o flacdata.o flacdsp.o flac.o
+OBJS-$(CONFIG_FLAC_MEDIACODEC_DECODER) += mediacodecdec.o
 OBJS-$(CONFIG_FLAC_ENCODER)            += flacenc.o flacdata.o flacencdsp.o
 OBJS-$(CONFIG_FLASHSV_DECODER)         += flashsv.o
 OBJS-$(CONFIG_FLASHSV_ENCODER)         += flashsvenc.o
@@ -518,6 +522,7 @@ OBJS-$(CONFIG_MP2FIXED_ENCODER)        += mpegaudioenc_fixed.o mpegaudio.o \
                                           mpegaudiotabs.o
 OBJS-$(CONFIG_MP2FLOAT_DECODER)        += mpegaudiodec_float.o
 OBJS-$(CONFIG_MP3_DECODER)             += mpegaudiodec_fixed.o
+OBJS-$(CONFIG_MP3_MEDIACODEC_DECODER)  += mediacodecdec.o
 OBJS-$(CONFIG_MP3_MF_ENCODER)          += mfenc.o mf_utils.o
 OBJS-$(CONFIG_MP3ADU_DECODER)          += mpegaudiodec_fixed.o
 OBJS-$(CONFIG_MP3ADUFLOAT_DECODER)     += mpegaudiodec_float.o
@@ -578,6 +583,7 @@ OBJS-$(CONFIG_OPUS_DECODER)            += opusdec.o opusdec_celt.o opus_celt.o \
                                           opusdsp.o opus_parse.o opus_rc.o
 OBJS-$(CONFIG_OPUS_ENCODER)            += opusenc.o opusenc_psy.o opus_celt.o \
                                           opus_pvq.o opus_rc.o opustab.o
+OBJS-$(CONFIG_OPUS_MEDIACODEC_DECODER) += mediacodecdec.o
 OBJS-$(CONFIG_OSQ_DECODER)             += osq.o
 OBJS-$(CONFIG_PAF_AUDIO_DECODER)       += pafaudio.o
 OBJS-$(CONFIG_PAF_VIDEO_DECODER)       += pafvideo.o
@@ -765,6 +771,7 @@ OBJS-$(CONFIG_VORBIS_DECODER)          += vorbisdec.o vorbisdsp.o vorbis.o \
                                           vorbis_data.o
 OBJS-$(CONFIG_VORBIS_ENCODER)          += vorbisenc.o vorbis.o \
                                           vorbis_data.o
+OBJS-$(CONFIG_VORBIS_MEDIACODEC_DECODER) += mediacodecdec.o
 OBJS-$(CONFIG_VP3_DECODER)             += vp3.o jpegquanttables.o
 OBJS-$(CONFIG_VP5_DECODER)             += vp5.o vp56.o vp56data.o vpx_rac.o
 OBJS-$(CONFIG_VP6_DECODER)             += vp6.o vp56.o vp56data.o \
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index b102a8069e..e5ab657ef6 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -821,8 +821,11 @@ extern const FFCodec ff_idf_decoder;
 
 /* external libraries, that shouldn't be used by default if one of the
  * above is available */
+extern const FFCodec ff_aac_mediacodec_decoder;
 extern const FFCodec ff_aac_mf_encoder;
 extern const FFCodec ff_ac3_mf_encoder;
+extern const FFCodec ff_amrnb_mediacodec_decoder;
+extern const FFCodec ff_amrwb_mediacodec_decoder;
 extern const FFCodec ff_h263_v4l2m2m_encoder;
 extern const FFCodec ff_libaom_av1_decoder;
 /* hwaccel hooks only, so prefer external decoders */
@@ -835,6 +838,7 @@ extern const FFCodec ff_av1_qsv_decoder;
 extern const FFCodec ff_av1_qsv_encoder;
 extern const FFCodec ff_av1_amf_encoder;
 extern const FFCodec ff_av1_vaapi_encoder;
+extern const FFCodec ff_flac_mediacodec_decoder;
 extern const FFCodec ff_libopenh264_encoder;
 extern const FFCodec ff_libopenh264_decoder;
 extern const FFCodec ff_h264_amf_encoder;
@@ -861,6 +865,7 @@ extern const FFCodec ff_mjpeg_cuvid_decoder;
 extern const FFCodec ff_mjpeg_qsv_encoder;
 extern const FFCodec ff_mjpeg_qsv_decoder;
 extern const FFCodec ff_mjpeg_vaapi_encoder;
+extern const FFCodec ff_mp3_mediacodec_decoder;
 extern const FFCodec ff_mp3_mf_encoder;
 extern const FFCodec ff_mpeg1_cuvid_decoder;
 extern const FFCodec ff_mpeg2_cuvid_decoder;
@@ -871,8 +876,10 @@ extern const FFCodec ff_mpeg4_mediacodec_decoder;
 extern const FFCodec ff_mpeg4_mediacodec_encoder;
 extern const FFCodec ff_mpeg4_omx_encoder;
 extern const FFCodec ff_mpeg4_v4l2m2m_encoder;
+extern const FFCodec ff_opus_mediacodec_decoder;
 extern const FFCodec ff_prores_videotoolbox_encoder;
 extern const FFCodec ff_vc1_cuvid_decoder;
+extern const FFCodec ff_vorbis_mediacodec_decoder;
 extern const FFCodec ff_vp8_cuvid_decoder;
 extern const FFCodec ff_vp8_mediacodec_decoder;
 extern const FFCodec ff_vp8_mediacodec_encoder;
diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
index 6d8dc600fe..dabf71cc04 100644
--- a/libavcodec/mediacodecdec.c
+++ b/libavcodec/mediacodecdec.c
@@ -36,6 +36,7 @@
 #include "avcodec.h"
 #include "codec_internal.h"
 #include "decode.h"
+#include "flac_parse.h"
 #include "h264_parse.h"
 #include "h264_ps.h"
 #include "hevc/parse.h"
@@ -44,6 +45,7 @@
 #include "jni.h"
 #include "mediacodec_wrapper.h"
 #include "mediacodecdec_common.h"
+#include "xiph.h"
 
 typedef struct MediaCodecH264DecContext {
 
@@ -287,11 +289,87 @@ done:
 }
 #endif
 
+#if CONFIG_FLAC_MEDIACODEC_DECODER
+static int flac_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
+{
+    uint8_t *streaminfo;
+    uint8_t buffer[42];
+
+    if (!avctx->extradata) {
+        return 0;
+    }
+
+    if (!ff_flac_is_extradata_valid(avctx, &streaminfo))
+        return AVERROR_INVALIDDATA;
+
+    buffer[0] = 'f';
+    buffer[1] = 'L';
+    buffer[2] = 'a';
+    buffer[3] = 'C';
+    buffer[4] = 0x80;
+    buffer[5] = 0;
+    buffer[6] = 0;
+    buffer[7] = 0x22;
+    memcpy(buffer + 8, streaminfo, 34);
+
+    /* csd-0: fLaC + streaminfo */
+    ff_AMediaFormat_setBuffer(format, "csd-0", buffer, 42);
+
+    return 0;
+}
+#endif
+
+#if CONFIG_OPUS_MEDIACODEC_DECODER
+static int opus_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
+{
+    if (!avctx->extradata_size) {
+        return 0;
+    }
+
+    if (avctx->extradata_size < 19) {
+        return AVERROR_INVALIDDATA;
+    }
+
+    ff_AMediaFormat_setBuffer(format, "csd-0", avctx->extradata, 19);
+
+    return 0;
+}
+#endif
+
+#if CONFIG_VORBIS_MEDIACODEC_DECODER
+static int vorbis_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
+{
+    int ret;
+    const uint8_t *header_start[3];
+    int header_len[3];
+
+    if (!avctx->extradata) {
+        return 0;
+    }
+
+    ret = avpriv_split_xiph_headers(avctx->extradata, avctx->extradata_size, 30, header_start, header_len);
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Could not parse extradata\n");
+        return ret;
+    }
+
+    /* csd-0: identification header, csd-1: setup header */
+    ff_AMediaFormat_setBuffer(format, "csd-0", header_start[0], header_len[0]);
+    ff_AMediaFormat_setBuffer(format, "csd-1", header_start[2], header_len[2]);
+
+    return 0;
+}
+#endif
+
 #if CONFIG_MPEG2_MEDIACODEC_DECODER || \
     CONFIG_MPEG4_MEDIACODEC_DECODER || \
     CONFIG_VP8_MEDIACODEC_DECODER   || \
     CONFIG_VP9_MEDIACODEC_DECODER   || \
-    CONFIG_AV1_MEDIACODEC_DECODER
+    CONFIG_AV1_MEDIACODEC_DECODER   || \
+    CONFIG_AAC_MEDIACODEC_DECODER   || \
+    CONFIG_AMRNB_MEDIACODEC_DECODER || \
+    CONFIG_AMRWB_MEDIACODEC_DECODER || \
+    CONFIG_MP3_MEDIACODEC_DECODER
 static int common_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
 {
     int ret = 0;
@@ -387,14 +465,83 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
         if (ret < 0)
             goto done;
         break;
+#endif
+#if CONFIG_AAC_MEDIACODEC_DECODER
+    case AV_CODEC_ID_AAC:
+        codec_mime = "audio/mp4a-latm";
+
+        ret = common_set_extradata(avctx, format);
+        if (ret < 0)
+            goto done;
+        break;
+#endif
+#if CONFIG_AMRNB_MEDIACODEC_DECODER
+    case AV_CODEC_ID_AMR_NB:
+        codec_mime = "audio/3gpp";
+
+        ret = common_set_extradata(avctx, format);
+        if (ret < 0)
+            goto done;
+        break;
+#endif
+#if CONFIG_AMRWB_MEDIACODEC_DECODER
+    case AV_CODEC_ID_AMR_WB:
+        codec_mime = "audio/amr-wb";
+
+        ret = common_set_extradata(avctx, format);
+        if (ret < 0)
+            goto done;
+        break;
+#endif
+#if CONFIG_FLAC_MEDIACODEC_DECODER
+    case AV_CODEC_ID_FLAC:
+        codec_mime = "audio/flac";
+
+        ret = flac_set_extradata(avctx, format);
+        if (ret < 0)
+            goto done;
+        break;
+#endif
+#if CONFIG_MP3_MEDIACODEC_DECODER
+    case AV_CODEC_ID_MP3:
+        codec_mime = "audio/mpeg";
+
+        ret = common_set_extradata(avctx, format);
+        if (ret < 0)
+            goto done;
+        break;
+#endif
+#if CONFIG_OPUS_MEDIACODEC_DECODER
+    case AV_CODEC_ID_OPUS:
+        codec_mime = "audio/opus";
+
+        ret = opus_set_extradata(avctx, format);
+        if (ret < 0)
+            goto done;
+        break;
+#endif
+#if CONFIG_VORBIS_MEDIACODEC_DECODER
+    case AV_CODEC_ID_VORBIS:
+        codec_mime = "audio/vorbis";
+
+        ret = vorbis_set_extradata(avctx, format);
+        if (ret < 0)
+            goto done;
+        break;
 #endif
     default:
         av_assert0(0);
     }
 
     ff_AMediaFormat_setString(format, "mime", codec_mime);
-    ff_AMediaFormat_setInt32(format, "width", avctx->width);
-    ff_AMediaFormat_setInt32(format, "height", avctx->height);
+
+    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+        ff_AMediaFormat_setInt32(format, "width", avctx->width);
+        ff_AMediaFormat_setInt32(format, "height", avctx->height);
+    } else {
+        ff_AMediaFormat_setInt32(format, "channel-count", avctx->ch_layout.nb_channels);
+        ff_AMediaFormat_setInt32(format, "sample-rate", avctx->sample_rate);
+    }
 
     s->ctx = av_mallocz(sizeof(*s->ctx));
     if (!s->ctx) {
@@ -611,3 +758,65 @@ DECLARE_MEDIACODEC_VDEC(vp9, "VP9", AV_CODEC_ID_VP9, NULL)
 #if CONFIG_AV1_MEDIACODEC_DECODER
 DECLARE_MEDIACODEC_VDEC(av1, "AV1", AV_CODEC_ID_AV1, NULL)
 #endif
+
+#define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM
+static const AVOption ff_mediacodec_adec_options[] = {
+    { "ndk_codec", "Use MediaCodec from NDK",
+                   OFFSET(use_ndk_codec), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, AD },
+    { NULL }
+};
+
+#define DECLARE_MEDIACODEC_ACLASS(short_name)                   \
+static const AVClass ff_##short_name##_mediacodec_dec_class = { \
+    .class_name = #short_name "_mediacodec",                    \
+    .item_name  = av_default_item_name,                         \
+    .option     = ff_mediacodec_adec_options,                   \
+    .version    = LIBAVUTIL_VERSION_INT,                        \
+};
+
+#define DECLARE_MEDIACODEC_ADEC(short_name, full_name, codec_id, bsf)                          \
+DECLARE_MEDIACODEC_VCLASS(short_name)                                                          \
+const FFCodec ff_ ## short_name ## _mediacodec_decoder = {                                     \
+    .p.name         = #short_name "_mediacodec",                                               \
+    CODEC_LONG_NAME(full_name " Android MediaCodec decoder"),                                  \
+    .p.type         = AVMEDIA_TYPE_AUDIO,                                                      \
+    .p.id           = codec_id,                                                                \
+    .p.priv_class   = &ff_##short_name##_mediacodec_dec_class,                                 \
+    .priv_data_size = sizeof(MediaCodecH264DecContext),                                        \
+    .init           = mediacodec_decode_init,                                                  \
+    FF_CODEC_RECEIVE_FRAME_CB(mediacodec_receive_frame),                                       \
+    .flush          = mediacodec_decode_flush,                                                 \
+    .close          = mediacodec_decode_close,                                                 \
+    .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,                              \
+    .caps_internal  = FF_CODEC_CAP_NOT_INIT_THREADSAFE,                                        \
+    .bsfs           = bsf,                                                                     \
+    .p.wrapper_name = "mediacodec",                                                            \
+};                                                                                             \
+
+#if CONFIG_AAC_MEDIACODEC_DECODER
+DECLARE_MEDIACODEC_ADEC(aac, "AAC", AV_CODEC_ID_AAC, "aac_adtstoasc")
+#endif
+
+#if CONFIG_AMRNB_MEDIACODEC_DECODER
+DECLARE_MEDIACODEC_ADEC(amrnb, "AMR-NB", AV_CODEC_ID_AMR_NB, NULL)
+#endif
+
+#if CONFIG_AMRWB_MEDIACODEC_DECODER
+DECLARE_MEDIACODEC_ADEC(amrwb, "AMR-WB", AV_CODEC_ID_AMR_WB, NULL)
+#endif
+
+#if CONFIG_FLAC_MEDIACODEC_DECODER
+DECLARE_MEDIACODEC_ADEC(flac, "FLAC", AV_CODEC_ID_FLAC, NULL)
+#endif
+
+#if CONFIG_MP3_MEDIACODEC_DECODER
+DECLARE_MEDIACODEC_ADEC(mp3, "MP3", AV_CODEC_ID_MP3, NULL)
+#endif
+
+#if CONFIG_OPUS_MEDIACODEC_DECODER
+DECLARE_MEDIACODEC_ADEC(opus, "OPUS", AV_CODEC_ID_OPUS, NULL)
+#endif
+
+#if CONFIG_VORBIS_MEDIACODEC_DECODER
+DECLARE_MEDIACODEC_ADEC(vorbis, "VORBIS", AV_CODEC_ID_VORBIS, NULL)
+#endif
diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c
index 4d22db8ecf..4bdd0128c2 100644
--- a/libavcodec/mediacodecdec_common.c
+++ b/libavcodec/mediacodecdec_common.c
@@ -23,6 +23,7 @@
 #include <string.h>
 #include <sys/types.h>
 
+#include "libavutil/avassert.h"
 #include "libavutil/common.h"
 #include "libavutil/hwcontext_mediacodec.h"
 #include "libavutil/mem.h"
@@ -30,6 +31,7 @@
 #include "libavutil/pixfmt.h"
 #include "libavutil/time.h"
 #include "libavutil/timestamp.h"
+#include "libavutil/channel_layout.h"
 
 #include "avcodec.h"
 #include "decode.h"
@@ -85,6 +87,110 @@
 #define OUTPUT_DEQUEUE_TIMEOUT_US 8000
 #define OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US 1000000
 
+enum {
+    ENCODING_PCM_16BIT        = 0x00000002,
+    ENCODING_PCM_8BIT         = 0x00000003,
+    ENCODING_PCM_FLOAT        = 0x00000004,
+    ENCODING_PCM_24BIT_PACKED = 0x00000015,
+    ENCODING_PCM_32BIT        = 0x00000016,
+};
+
+static const struct {
+
+    int pcm_format;
+    enum AVSampleFormat sample_format;
+
+} sample_formats[] = {
+
+    { ENCODING_PCM_16BIT,        AV_SAMPLE_FMT_S16 },
+    { ENCODING_PCM_8BIT,         AV_SAMPLE_FMT_U8  },
+    { ENCODING_PCM_FLOAT,        AV_SAMPLE_FMT_FLT },
+    { ENCODING_PCM_24BIT_PACKED, AV_SAMPLE_FMT_S32 },
+    { ENCODING_PCM_32BIT,        AV_SAMPLE_FMT_S32 },
+    { 0 }
+};
+
+static enum AVSampleFormat mcdec_map_pcm_format(AVCodecContext *avctx,
+                                               MediaCodecDecContext *s,
+                                               int pcm_format)
+{
+    int i;
+    enum AVSampleFormat ret = AV_SAMPLE_FMT_NONE;
+
+    for (i = 0; i < FF_ARRAY_ELEMS(sample_formats); i++) {
+        if (sample_formats[i].pcm_format == pcm_format) {
+            return sample_formats[i].sample_format;
+        }
+    }
+
+    av_log(avctx, AV_LOG_ERROR, "Output sample format 0x%x (value=%d) is not supported\n",
+           pcm_format, pcm_format);
+
+    return ret;
+}
+
+enum
+{
+  CHANNEL_OUT_FRONT_LEFT                 = 0x4,
+  CHANNEL_OUT_FRONT_RIGHT                = 0x8,
+  CHANNEL_OUT_FRONT_CENTER               = 0x10,
+  CHANNEL_OUT_LOW_FREQUENCY              = 0x20,
+  CHANNEL_OUT_BACK_LEFT                  = 0x40,
+  CHANNEL_OUT_BACK_RIGHT                 = 0x80,
+  CHANNEL_OUT_FRONT_LEFT_OF_CENTER       = 0x100,
+  CHANNEL_OUT_FRONT_RIGHT_OF_CENTER      = 0x200,
+  CHANNEL_OUT_BACK_CENTER                = 0x400,
+  CHANNEL_OUT_SIDE_LEFT                  = 0x800,
+  CHANNEL_OUT_SIDE_RIGHT                 = 0x1000,
+  CHANNEL_OUT_TOP_CENTER                 = 0x2000,
+  CHANNEL_OUT_TOP_FRONT_LEFT             = 0x4000,
+  CHANNEL_OUT_TOP_FRONT_CENTER           = 0x8000,
+  CHANNEL_OUT_TOP_FRONT_RIGHT            = 0x10000,
+  CHANNEL_OUT_TOP_BACK_LEFT              = 0x20000,
+  CHANNEL_OUT_TOP_BACK_CENTER            = 0x40000,
+  CHANNEL_OUT_TOP_BACK_RIGHT             = 0x80000,
+};
+
+static const struct {
+
+    int mask;
+    uint64_t layout;
+
+} channel_masks[] = {
+    { CHANNEL_OUT_FRONT_LEFT,            AV_CH_FRONT_LEFT },
+    { CHANNEL_OUT_FRONT_RIGHT,           AV_CH_FRONT_RIGHT },
+    { CHANNEL_OUT_FRONT_CENTER,          AV_CH_FRONT_CENTER },
+    { CHANNEL_OUT_LOW_FREQUENCY,         AV_CH_LOW_FREQUENCY },
+    { CHANNEL_OUT_BACK_LEFT,             AV_CH_BACK_LEFT },
+    { CHANNEL_OUT_BACK_RIGHT,            AV_CH_BACK_RIGHT },
+    { CHANNEL_OUT_FRONT_LEFT_OF_CENTER,  AV_CH_FRONT_LEFT_OF_CENTER },
+    { CHANNEL_OUT_FRONT_RIGHT_OF_CENTER, AV_CH_FRONT_RIGHT_OF_CENTER },
+    { CHANNEL_OUT_BACK_CENTER,           AV_CH_BACK_CENTER },
+    { CHANNEL_OUT_SIDE_LEFT,             AV_CH_SIDE_LEFT },
+    { CHANNEL_OUT_SIDE_RIGHT,            AV_CH_SIDE_RIGHT },
+    { CHANNEL_OUT_TOP_CENTER,            AV_CH_TOP_CENTER },
+    { CHANNEL_OUT_TOP_FRONT_LEFT,        AV_CH_TOP_FRONT_LEFT },
+    { CHANNEL_OUT_TOP_FRONT_CENTER,      AV_CH_TOP_FRONT_CENTER },
+    { CHANNEL_OUT_TOP_FRONT_RIGHT,       AV_CH_TOP_FRONT_RIGHT },
+    { CHANNEL_OUT_TOP_BACK_LEFT,         AV_CH_TOP_BACK_LEFT },
+    { CHANNEL_OUT_TOP_BACK_CENTER,       AV_CH_TOP_BACK_CENTER },
+    { CHANNEL_OUT_TOP_BACK_RIGHT,        AV_CH_TOP_BACK_RIGHT },
+};
+
+static uint64_t mcdec_map_channel_mask(AVCodecContext *avctx,
+                                       int channel_mask)
+{
+    int i;
+    uint64_t channel_layout = 0;
+
+    for (i = 0; i < FF_ARRAY_ELEMS(channel_masks); i++) {
+        if (channel_mask & channel_masks[i].mask)
+            channel_layout |= channel_masks[i].layout;
+    }
+
+    return channel_layout;
+}
+
 enum {
     COLOR_FormatYUV420Planar                              = 0x13,
     COLOR_FormatYUV420SemiPlanar                          = 0x15,
@@ -265,13 +371,77 @@ fail:
     return ret;
 }
 
-static int mediacodec_wrap_sw_buffer(AVCodecContext *avctx,
-                                  MediaCodecDecContext *s,
-                                  uint8_t *data,
-                                  size_t size,
-                                  ssize_t index,
-                                  FFAMediaCodecBufferInfo *info,
-                                  AVFrame *frame)
+static int mediacodec_wrap_sw_audio_buffer(AVCodecContext *avctx,
+                                           MediaCodecDecContext *s,
+                                           uint8_t *data,
+                                           size_t size,
+                                           ssize_t index,
+                                           FFAMediaCodecBufferInfo *info,
+                                           AVFrame *frame)
+{
+    int ret = 0;
+    int status = 0;
+    const int sample_size = av_get_bytes_per_sample(avctx->sample_fmt);
+    if (!sample_size) {
+        av_log(avctx, AV_LOG_ERROR, "Could not get bytes per sample\n");
+        goto done;
+    }
+
+    frame->format = avctx->sample_fmt;
+    frame->sample_rate = avctx->sample_rate;
+    frame->nb_samples = info->size / (sample_size * avctx->ch_layout.nb_channels);
+
+    ret = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Could not copy channel layout\n");
+        goto done;
+    }
+
+    /* MediaCodec buffers needs to be copied to our own refcounted buffers
+     * because the flush command invalidates all input and output buffers.
+     */
+    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer\n");
+        goto done;
+    }
+
+    /* Override frame->pts as ff_get_buffer will override its value based
+     * on the last avpacket received which is not in sync with the frame:
+     *   * N avpackets can be pushed before 1 frame is actually returned
+     *   * 0-sized avpackets are pushed to flush remaining frames at EOS */
+    if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
+        frame->pts = av_rescale_q(info->presentationTimeUs,
+                                      AV_TIME_BASE_Q,
+                                      avctx->pkt_timebase);
+    } else {
+        frame->pts = info->presentationTimeUs;
+    }
+    frame->pkt_dts = AV_NOPTS_VALUE;
+
+    av_log(avctx, AV_LOG_TRACE,
+           "Frame: format=%d channels=%d sample_rate=%d nb_samples=%d",
+           avctx->sample_fmt, avctx->ch_layout.nb_channels, avctx->sample_rate, frame->nb_samples);
+
+    memcpy(frame->data[0], data, info->size);
+
+    ret = 0;
+done:
+    status = ff_AMediaCodec_releaseOutputBuffer(s->codec, index, 0);
+    if (status < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to release output buffer\n");
+        ret = AVERROR_EXTERNAL;
+    }
+
+    return ret;
+}
+
+static int mediacodec_wrap_sw_video_buffer(AVCodecContext *avctx,
+                                           MediaCodecDecContext *s,
+                                           uint8_t *data,
+                                           size_t size,
+                                           ssize_t index,
+                                           FFAMediaCodecBufferInfo *info,
+                                           AVFrame *frame)
 {
     int ret = 0;
     int status = 0;
@@ -343,6 +513,22 @@ done:
     return ret;
 }
 
+static int mediacodec_wrap_sw_buffer(AVCodecContext *avctx,
+                                     MediaCodecDecContext *s,
+                                     uint8_t *data,
+                                     size_t size,
+                                     ssize_t index,
+                                     FFAMediaCodecBufferInfo *info,
+                                     AVFrame *frame)
+{
+    if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
+        return mediacodec_wrap_sw_audio_buffer(avctx, s, data, size, index, info, frame);
+    else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
+        return mediacodec_wrap_sw_video_buffer(avctx, s, data, size, index, info, frame);
+    else
+        av_assert0(0);
+}
+
 #define AMEDIAFORMAT_GET_INT32(name, key, mandatory) do {                              \
     int32_t value = 0;                                                                 \
     if (ff_AMediaFormat_getInt32(s->format, key, &value)) {                            \
@@ -354,7 +540,7 @@ done:
     }                                                                                  \
 } while (0)                                                                            \
 
-static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecContext *s)
+static int mediacodec_dec_parse_video_format(AVCodecContext *avctx, MediaCodecDecContext *s)
 {
     int ret = 0;
     int width = 0;
@@ -463,6 +649,63 @@ fail:
     return ret;
 }
 
+static int mediacodec_dec_parse_audio_format(AVCodecContext *avctx, MediaCodecDecContext *s)
+{
+    int ret = 0;
+    int sample_rate = 0;
+    int channel_count = 0;
+    int channel_mask = 0;
+    int pcm_encoding = 0;
+    char *format = NULL;
+
+    if (!s->format) {
+        av_log(avctx, AV_LOG_ERROR, "Output MediaFormat is not set\n");
+        return AVERROR(EINVAL);
+    }
+
+    format = ff_AMediaFormat_toString(s->format);
+    if (!format) {
+        return AVERROR_EXTERNAL;
+    }
+    av_log(avctx, AV_LOG_DEBUG, "Parsing MediaFormat %s\n", format);
+
+    /* Mandatory fields */
+    AMEDIAFORMAT_GET_INT32(channel_count, "channel-count", 1);
+    AMEDIAFORMAT_GET_INT32(sample_rate,   "sample-rate",   1);
+
+    AMEDIAFORMAT_GET_INT32(pcm_encoding, "pcm-encoding", 0);
+    if (pcm_encoding)
+        avctx->sample_fmt  = mcdec_map_pcm_format(avctx, s, pcm_encoding);
+    else
+        avctx->sample_fmt = AV_SAMPLE_FMT_S16;
+
+    avctx->sample_rate = sample_rate;
+
+    AMEDIAFORMAT_GET_INT32(channel_mask, "channel-mask", 0);
+    if (channel_mask)
+        av_channel_layout_from_mask(&avctx->ch_layout, mcdec_map_channel_mask(avctx, channel_mask));
+    else
+        av_channel_layout_default(&avctx->ch_layout, channel_count);
+
+    av_log(avctx, AV_LOG_INFO,
+        "Output parameters channel-count=%d channel-layout=%x sample-rate=%d\n",
+        channel_count, channel_mask, sample_rate);
+
+fail:
+    av_freep(&format);
+    return ret;
+}
+
+static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecContext *s)
+{
+    if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
+        return mediacodec_dec_parse_audio_format(avctx, s);
+    else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
+        return mediacodec_dec_parse_video_format(avctx, s);
+    else
+        av_assert0(0);
+}
+
 static int mediacodec_dec_flush_codec(AVCodecContext *avctx, MediaCodecDecContext *s)
 {
     FFAMediaCodec *codec = s->codec;
@@ -486,11 +729,9 @@ static int mediacodec_dec_flush_codec(AVCodecContext *avctx, MediaCodecDecContex
     return 0;
 }
 
-int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
-                           const char *mime, FFAMediaFormat *format)
+static int mediacodec_dec_get_video_codec(AVCodecContext *avctx, MediaCodecDecContext *s,
+                                          const char *mime, FFAMediaFormat *format)
 {
-    int ret = 0;
-    int status;
     int profile;
 
     enum AVPixelFormat pix_fmt;
@@ -499,12 +740,6 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
         AV_PIX_FMT_NONE,
     };
 
-    s->avctx = avctx;
-    atomic_init(&s->refcount, 1);
-    atomic_init(&s->hw_buffer_count, 0);
-    atomic_init(&s->serial, 1);
-    s->current_input_buffer = -1;
-
     pix_fmt = ff_get_format(avctx, pix_fmts);
     if (pix_fmt == AV_PIX_FMT_MEDIACODEC) {
         AVMediaCodecContext *user_ctx = avctx->hwaccel_context;
@@ -536,8 +771,7 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
         // getCodecNameByType() can fail due to missing JVM, while NDK
         // mediacodec can be used without JVM.
         if (!s->use_ndk_codec) {
-            ret = AVERROR_EXTERNAL;
-            goto fail;
+            return AVERROR_EXTERNAL;
         }
         av_log(avctx, AV_LOG_INFO, "Failed to getCodecNameByType\n");
     } else {
@@ -556,10 +790,51 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
     }
     if (!s->codec) {
         av_log(avctx, AV_LOG_ERROR, "Failed to create media decoder for type %s and name %s\n", mime, s->codec_name);
-        ret = AVERROR_EXTERNAL;
-        goto fail;
+        return AVERROR_EXTERNAL;
+    }
+
+    return 0;
+}
+
+static int mediacodec_dec_get_audio_codec(AVCodecContext *avctx, MediaCodecDecContext *s,
+                                          const char *mime, FFAMediaFormat *format)
+{
+    s->codec = ff_AMediaCodec_createDecoderByType(mime, s->use_ndk_codec);
+    if (!s->codec) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to create media decoder for mime %s\n", mime);
+        return AVERROR_EXTERNAL;
+    }
+
+    s->codec_name = ff_AMediaCodec_getName(s->codec);
+    if (!s->codec_name) {
+        av_log(avctx, AV_LOG_ERROR, "Failed to get codec name");
+        return AVERROR_EXTERNAL;
     }
 
+    return 0;
+}
+
+int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
+                           const char *mime, FFAMediaFormat *format)
+{
+    int ret;
+    int status;
+
+    s->avctx = avctx;
+    atomic_init(&s->refcount, 1);
+    atomic_init(&s->hw_buffer_count, 0);
+    atomic_init(&s->serial, 1);
+    s->current_input_buffer = -1;
+
+    if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
+        ret = mediacodec_dec_get_audio_codec(avctx, s, mime, format);
+    else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
+        ret = mediacodec_dec_get_video_codec(avctx, s, mime, format);
+    else
+        av_assert0(0);
+    if (ret < 0)
+        goto fail;
+
     status = ff_AMediaCodec_configure(s->codec, format, s->surface, NULL, 0);
     if (status < 0) {
         char *desc = ff_AMediaFormat_toString(format);
@@ -583,12 +858,14 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
         goto fail;
     }
 
-    s->format = ff_AMediaCodec_getOutputFormat(s->codec);
-    if (s->format) {
-        if ((ret = mediacodec_dec_parse_format(avctx, s)) < 0) {
-            av_log(avctx, AV_LOG_ERROR,
-                "Failed to configure context\n");
-            goto fail;
+    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
+        s->format = ff_AMediaCodec_getOutputFormat(s->codec);
+        if (s->format) {
+            if ((ret = mediacodec_dec_parse_format(avctx, s)) < 0) {
+                av_log(avctx, AV_LOG_ERROR,
+                    "Failed to configure context\n");
+                goto fail;
+            }
         }
     }
 
-- 
2.45.2

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-06-12 13:42 [FFmpeg-devel] Add Mediacodec audio decoders support Matthieu Bouron
  2024-06-12 13:42 ` [FFmpeg-devel] [PATCH 1/2] avcodec/mediacodecdec_common: ensure input buffer timestamp is positive Matthieu Bouron
  2024-06-12 13:42 ` [FFmpeg-devel] [PATCH 2/2] avcodec: add Mediacodec audio decoders support Matthieu Bouron
@ 2024-06-12 14:00 ` Paul B Mahol
  2024-07-10 13:54 ` Zhao Zhili
  3 siblings, 0 replies; 23+ messages in thread
From: Paul B Mahol @ 2024-06-12 14:00 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

FFmpeg RIP
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] [PATCH 2/2] avcodec: add Mediacodec audio decoders support
  2024-06-12 13:42 ` [FFmpeg-devel] [PATCH 2/2] avcodec: add Mediacodec audio decoders support Matthieu Bouron
@ 2024-07-10  8:47   ` Matthieu Bouron
  2024-07-28 15:23   ` Zhao Zhili
  1 sibling, 0 replies; 23+ messages in thread
From: Matthieu Bouron @ 2024-07-10  8:47 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Le mer. 12 juin 2024, 3:47 PM, Matthieu Bouron <matthieu.bouron@gmail.com>
a écrit :

> ---
>  configure                         |  14 ++
>  libavcodec/Makefile               |   7 +
>  libavcodec/allcodecs.c            |   7 +
>  libavcodec/mediacodecdec.c        | 215 ++++++++++++++++++-
>  libavcodec/mediacodecdec_common.c | 333 +++++++++++++++++++++++++++---
>  5 files changed, 545 insertions(+), 31 deletions(-)
>
> diff --git a/configure b/configure
> index 83284427df..d7de3b73ed 100755
> --- a/configure
> +++ b/configure
> @@ -3321,14 +3321,22 @@ amf_deps_any="libdl LoadLibrary"
>  nvenc_deps="ffnvcodec"
>  nvenc_deps_any="libdl LoadLibrary"
>
> +aac_mediacodec_decoder_deps="mediacodec"
> +aac_mediacodec_decoder_select="aac_adtstoasc_bsf aac_parser"
>  aac_mf_encoder_deps="mediafoundation"
>  ac3_mf_encoder_deps="mediafoundation"
> +amrnb_mediacodec_decoder_deps="mediacodec"
> +amrnb_mediacodec_decoder_select="amr_parser"
> +amrwb_mediacodec_decoder_deps="mediacodec"
> +amrwb_mediacodec_decoder_select="amr_parser"
>  av1_cuvid_decoder_deps="cuvid CUVIDAV1PICPARAMS"
>  av1_mediacodec_decoder_deps="mediacodec"
>  av1_mediacodec_encoder_deps="mediacodec"
>  av1_mediacodec_encoder_select="extract_extradata_bsf"
>  av1_nvenc_encoder_deps="nvenc NV_ENC_PIC_PARAMS_AV1"
>  av1_nvenc_encoder_select="atsc_a53"
> +flac_mediacodec_decoder_deps="mediacodec"
> +flac_mediacodec_decoder_select="flac_parser"
>  h263_v4l2m2m_decoder_deps="v4l2_m2m h263_v4l2_m2m"
>  h263_v4l2m2m_encoder_deps="v4l2_m2m h263_v4l2_m2m"
>  h264_amf_encoder_deps="amf"
> @@ -3377,6 +3385,8 @@ mjpeg_qsv_encoder_select="qsvenc"
>  mjpeg_vaapi_encoder_deps="VAEncPictureParameterBufferJPEG"
>  mjpeg_vaapi_encoder_select="cbs_jpeg jpegtables vaapi_encode"
>  mp3_mf_encoder_deps="mediafoundation"
> +mp3_mediacodec_decoder_deps="mediacodec"
> +mp3_mediacodec_decoder_select="mpegaudioheader"
>  mpeg1_cuvid_decoder_deps="cuvid"
>  mpeg1_v4l2m2m_decoder_deps="v4l2_m2m mpeg1_v4l2_m2m"
>  mpeg2_cuvid_decoder_deps="cuvid"
> @@ -3394,10 +3404,14 @@ mpeg4_mmal_decoder_deps="mmal"
>  mpeg4_omx_encoder_deps="omx"
>  mpeg4_v4l2m2m_decoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
>  mpeg4_v4l2m2m_encoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
> +opus_mediacodec_decoder_deps="mediacodec"
> +opus_mediacodec_decoder_select="opus_parser"
>  vc1_cuvid_decoder_deps="cuvid"
>  vc1_mmal_decoder_deps="mmal"
>  vc1_qsv_decoder_select="qsvdec"
>  vc1_v4l2m2m_decoder_deps="v4l2_m2m vc1_v4l2_m2m"
> +vorbis_mediacodec_decoder_deps="mediacodec"
> +vorbis_mediacodec_decoder_select="vorbis_parser"
>  vp8_cuvid_decoder_deps="cuvid"
>  vp8_mediacodec_decoder_deps="mediacodec"
>  vp8_mediacodec_encoder_deps="mediacodec"
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index 1a44352906..64771b9944 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -196,6 +196,7 @@ OBJS-$(CONFIG_AAC_ENCODER)             += aacenc.o
> aaccoder.o aacenctab.o    \
>                                            aacenc_pred.o \
>                                            psymodel.o kbdwin.o \
>                                            mpeg4audio_sample_rates.o
> +OBJS-$(CONFIG_AAC_MEDIACODEC_DECODER)  += mediacodecdec.o
>  OBJS-$(CONFIG_AAC_MF_ENCODER)          += mfenc.o mf_utils.o
>  OBJS-$(CONFIG_AASC_DECODER)            += aasc.o msrledec.o
>  OBJS-$(CONFIG_AC3_DECODER)             += ac3dec_float.o ac3dec_data.o
> ac3.o \
> @@ -222,6 +223,8 @@ OBJS-$(CONFIG_AMRWB_DECODER)           += amrwbdec.o
> celp_filters.o   \
>                                            celp_math.o acelp_filters.o \
>                                            acelp_vectors.o             \
>                                            acelp_pitch_delay.o
> +OBJS-$(CONFIG_AMRNB_MEDIACODEC_DECODER) += mediacodecdec.o
> +OBJS-$(CONFIG_AMRWB_MEDIACODEC_DECODER) += mediacodecdec.o
>  OBJS-$(CONFIG_AMV_ENCODER)             += mjpegenc.o mjpegenc_common.o
>  OBJS-$(CONFIG_ANM_DECODER)             += anm.o
>  OBJS-$(CONFIG_ANULL_DECODER)           += null.o
> @@ -367,6 +370,7 @@ OBJS-$(CONFIG_FIC_DECODER)             += fic.o
>  OBJS-$(CONFIG_FITS_DECODER)            += fitsdec.o fits.o
>  OBJS-$(CONFIG_FITS_ENCODER)            += fitsenc.o
>  OBJS-$(CONFIG_FLAC_DECODER)            += flacdec.o flacdata.o flacdsp.o
> flac.o
> +OBJS-$(CONFIG_FLAC_MEDIACODEC_DECODER) += mediacodecdec.o
>  OBJS-$(CONFIG_FLAC_ENCODER)            += flacenc.o flacdata.o
> flacencdsp.o
>  OBJS-$(CONFIG_FLASHSV_DECODER)         += flashsv.o
>  OBJS-$(CONFIG_FLASHSV_ENCODER)         += flashsvenc.o
> @@ -518,6 +522,7 @@ OBJS-$(CONFIG_MP2FIXED_ENCODER)        +=
> mpegaudioenc_fixed.o mpegaudio.o \
>                                            mpegaudiotabs.o
>  OBJS-$(CONFIG_MP2FLOAT_DECODER)        += mpegaudiodec_float.o
>  OBJS-$(CONFIG_MP3_DECODER)             += mpegaudiodec_fixed.o
> +OBJS-$(CONFIG_MP3_MEDIACODEC_DECODER)  += mediacodecdec.o
>  OBJS-$(CONFIG_MP3_MF_ENCODER)          += mfenc.o mf_utils.o
>  OBJS-$(CONFIG_MP3ADU_DECODER)          += mpegaudiodec_fixed.o
>  OBJS-$(CONFIG_MP3ADUFLOAT_DECODER)     += mpegaudiodec_float.o
> @@ -578,6 +583,7 @@ OBJS-$(CONFIG_OPUS_DECODER)            += opusdec.o
> opusdec_celt.o opus_celt.o \
>                                            opusdsp.o opus_parse.o opus_rc.o
>  OBJS-$(CONFIG_OPUS_ENCODER)            += opusenc.o opusenc_psy.o
> opus_celt.o \
>                                            opus_pvq.o opus_rc.o opustab.o
> +OBJS-$(CONFIG_OPUS_MEDIACODEC_DECODER) += mediacodecdec.o
>  OBJS-$(CONFIG_OSQ_DECODER)             += osq.o
>  OBJS-$(CONFIG_PAF_AUDIO_DECODER)       += pafaudio.o
>  OBJS-$(CONFIG_PAF_VIDEO_DECODER)       += pafvideo.o
> @@ -765,6 +771,7 @@ OBJS-$(CONFIG_VORBIS_DECODER)          += vorbisdec.o
> vorbisdsp.o vorbis.o \
>                                            vorbis_data.o
>  OBJS-$(CONFIG_VORBIS_ENCODER)          += vorbisenc.o vorbis.o \
>                                            vorbis_data.o
> +OBJS-$(CONFIG_VORBIS_MEDIACODEC_DECODER) += mediacodecdec.o
>  OBJS-$(CONFIG_VP3_DECODER)             += vp3.o jpegquanttables.o
>  OBJS-$(CONFIG_VP5_DECODER)             += vp5.o vp56.o vp56data.o
> vpx_rac.o
>  OBJS-$(CONFIG_VP6_DECODER)             += vp6.o vp56.o vp56data.o \
> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> index b102a8069e..e5ab657ef6 100644
> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -821,8 +821,11 @@ extern const FFCodec ff_idf_decoder;
>
>  /* external libraries, that shouldn't be used by default if one of the
>   * above is available */
> +extern const FFCodec ff_aac_mediacodec_decoder;
>  extern const FFCodec ff_aac_mf_encoder;
>  extern const FFCodec ff_ac3_mf_encoder;
> +extern const FFCodec ff_amrnb_mediacodec_decoder;
> +extern const FFCodec ff_amrwb_mediacodec_decoder;
>  extern const FFCodec ff_h263_v4l2m2m_encoder;
>  extern const FFCodec ff_libaom_av1_decoder;
>  /* hwaccel hooks only, so prefer external decoders */
> @@ -835,6 +838,7 @@ extern const FFCodec ff_av1_qsv_decoder;
>  extern const FFCodec ff_av1_qsv_encoder;
>  extern const FFCodec ff_av1_amf_encoder;
>  extern const FFCodec ff_av1_vaapi_encoder;
> +extern const FFCodec ff_flac_mediacodec_decoder;
>  extern const FFCodec ff_libopenh264_encoder;
>  extern const FFCodec ff_libopenh264_decoder;
>  extern const FFCodec ff_h264_amf_encoder;
> @@ -861,6 +865,7 @@ extern const FFCodec ff_mjpeg_cuvid_decoder;
>  extern const FFCodec ff_mjpeg_qsv_encoder;
>  extern const FFCodec ff_mjpeg_qsv_decoder;
>  extern const FFCodec ff_mjpeg_vaapi_encoder;
> +extern const FFCodec ff_mp3_mediacodec_decoder;
>  extern const FFCodec ff_mp3_mf_encoder;
>  extern const FFCodec ff_mpeg1_cuvid_decoder;
>  extern const FFCodec ff_mpeg2_cuvid_decoder;
> @@ -871,8 +876,10 @@ extern const FFCodec ff_mpeg4_mediacodec_decoder;
>  extern const FFCodec ff_mpeg4_mediacodec_encoder;
>  extern const FFCodec ff_mpeg4_omx_encoder;
>  extern const FFCodec ff_mpeg4_v4l2m2m_encoder;
> +extern const FFCodec ff_opus_mediacodec_decoder;
>  extern const FFCodec ff_prores_videotoolbox_encoder;
>  extern const FFCodec ff_vc1_cuvid_decoder;
> +extern const FFCodec ff_vorbis_mediacodec_decoder;
>  extern const FFCodec ff_vp8_cuvid_decoder;
>  extern const FFCodec ff_vp8_mediacodec_decoder;
>  extern const FFCodec ff_vp8_mediacodec_encoder;
> diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
> index 6d8dc600fe..dabf71cc04 100644
> --- a/libavcodec/mediacodecdec.c
> +++ b/libavcodec/mediacodecdec.c
> @@ -36,6 +36,7 @@
>  #include "avcodec.h"
>  #include "codec_internal.h"
>  #include "decode.h"
> +#include "flac_parse.h"
>  #include "h264_parse.h"
>  #include "h264_ps.h"
>  #include "hevc/parse.h"
> @@ -44,6 +45,7 @@
>  #include "jni.h"
>  #include "mediacodec_wrapper.h"
>  #include "mediacodecdec_common.h"
> +#include "xiph.h"
>
>  typedef struct MediaCodecH264DecContext {
>
> @@ -287,11 +289,87 @@ done:
>  }
>  #endif
>
> +#if CONFIG_FLAC_MEDIACODEC_DECODER
> +static int flac_set_extradata(AVCodecContext *avctx, FFAMediaFormat
> *format)
> +{
> +    uint8_t *streaminfo;
> +    uint8_t buffer[42];
> +
> +    if (!avctx->extradata) {
> +        return 0;
> +    }
> +
> +    if (!ff_flac_is_extradata_valid(avctx, &streaminfo))
> +        return AVERROR_INVALIDDATA;
> +
> +    buffer[0] = 'f';
> +    buffer[1] = 'L';
> +    buffer[2] = 'a';
> +    buffer[3] = 'C';
> +    buffer[4] = 0x80;
> +    buffer[5] = 0;
> +    buffer[6] = 0;
> +    buffer[7] = 0x22;
> +    memcpy(buffer + 8, streaminfo, 34);
> +
> +    /* csd-0: fLaC + streaminfo */
> +    ff_AMediaFormat_setBuffer(format, "csd-0", buffer, 42);
> +
> +    return 0;
> +}
> +#endif
> +
> +#if CONFIG_OPUS_MEDIACODEC_DECODER
> +static int opus_set_extradata(AVCodecContext *avctx, FFAMediaFormat
> *format)
> +{
> +    if (!avctx->extradata_size) {
> +        return 0;
> +    }
> +
> +    if (avctx->extradata_size < 19) {
> +        return AVERROR_INVALIDDATA;
> +    }
> +
> +    ff_AMediaFormat_setBuffer(format, "csd-0", avctx->extradata, 19);
> +
> +    return 0;
> +}
> +#endif
> +
> +#if CONFIG_VORBIS_MEDIACODEC_DECODER
> +static int vorbis_set_extradata(AVCodecContext *avctx, FFAMediaFormat
> *format)
> +{
> +    int ret;
> +    const uint8_t *header_start[3];
> +    int header_len[3];
> +
> +    if (!avctx->extradata) {
> +        return 0;
> +    }
> +
> +    ret = avpriv_split_xiph_headers(avctx->extradata,
> avctx->extradata_size, 30, header_start, header_len);
> +    if (ret < 0) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not parse extradata\n");
> +        return ret;
> +    }
> +
> +    /* csd-0: identification header, csd-1: setup header */
> +    ff_AMediaFormat_setBuffer(format, "csd-0", header_start[0],
> header_len[0]);
> +    ff_AMediaFormat_setBuffer(format, "csd-1", header_start[2],
> header_len[2]);
> +
> +    return 0;
> +}
> +#endif
> +
>  #if CONFIG_MPEG2_MEDIACODEC_DECODER || \
>      CONFIG_MPEG4_MEDIACODEC_DECODER || \
>      CONFIG_VP8_MEDIACODEC_DECODER   || \
>      CONFIG_VP9_MEDIACODEC_DECODER   || \
> -    CONFIG_AV1_MEDIACODEC_DECODER
> +    CONFIG_AV1_MEDIACODEC_DECODER   || \
> +    CONFIG_AAC_MEDIACODEC_DECODER   || \
> +    CONFIG_AMRNB_MEDIACODEC_DECODER || \
> +    CONFIG_AMRWB_MEDIACODEC_DECODER || \
> +    CONFIG_MP3_MEDIACODEC_DECODER
>  static int common_set_extradata(AVCodecContext *avctx, FFAMediaFormat
> *format)
>  {
>      int ret = 0;
> @@ -387,14 +465,83 @@ static av_cold int
> mediacodec_decode_init(AVCodecContext *avctx)
>          if (ret < 0)
>              goto done;
>          break;
> +#endif
> +#if CONFIG_AAC_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_AAC:
> +        codec_mime = "audio/mp4a-latm";
> +
> +        ret = common_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_AMRNB_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_AMR_NB:
> +        codec_mime = "audio/3gpp";
> +
> +        ret = common_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_AMRWB_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_AMR_WB:
> +        codec_mime = "audio/amr-wb";
> +
> +        ret = common_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_FLAC_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_FLAC:
> +        codec_mime = "audio/flac";
> +
> +        ret = flac_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_MP3_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_MP3:
> +        codec_mime = "audio/mpeg";
> +
> +        ret = common_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_OPUS_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_OPUS:
> +        codec_mime = "audio/opus";
> +
> +        ret = opus_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_VORBIS_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_VORBIS:
> +        codec_mime = "audio/vorbis";
> +
> +        ret = vorbis_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
>  #endif
>      default:
>          av_assert0(0);
>      }
>
>      ff_AMediaFormat_setString(format, "mime", codec_mime);
> -    ff_AMediaFormat_setInt32(format, "width", avctx->width);
> -    ff_AMediaFormat_setInt32(format, "height", avctx->height);
> +
> +    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
> +        ff_AMediaFormat_setInt32(format, "width", avctx->width);
> +        ff_AMediaFormat_setInt32(format, "height", avctx->height);
> +    } else {
> +        ff_AMediaFormat_setInt32(format, "channel-count",
> avctx->ch_layout.nb_channels);
> +        ff_AMediaFormat_setInt32(format, "sample-rate",
> avctx->sample_rate);
> +    }
>
>      s->ctx = av_mallocz(sizeof(*s->ctx));
>      if (!s->ctx) {
> @@ -611,3 +758,65 @@ DECLARE_MEDIACODEC_VDEC(vp9, "VP9", AV_CODEC_ID_VP9,
> NULL)
>  #if CONFIG_AV1_MEDIACODEC_DECODER
>  DECLARE_MEDIACODEC_VDEC(av1, "AV1", AV_CODEC_ID_AV1, NULL)
>  #endif
> +
> +#define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM
> +static const AVOption ff_mediacodec_adec_options[] = {
> +    { "ndk_codec", "Use MediaCodec from NDK",
> +                   OFFSET(use_ndk_codec), AV_OPT_TYPE_BOOL, {.i64 = -1},
> -1, 1, AD },
> +    { NULL }
> +};
> +
> +#define DECLARE_MEDIACODEC_ACLASS(short_name)                   \
> +static const AVClass ff_##short_name##_mediacodec_dec_class = { \
> +    .class_name = #short_name "_mediacodec",                    \
> +    .item_name  = av_default_item_name,                         \
> +    .option     = ff_mediacodec_adec_options,                   \
> +    .version    = LIBAVUTIL_VERSION_INT,                        \
> +};
> +
> +#define DECLARE_MEDIACODEC_ADEC(short_name, full_name, codec_id, bsf)
>                       \
> +DECLARE_MEDIACODEC_VCLASS(short_name)
>                       \
> +const FFCodec ff_ ## short_name ## _mediacodec_decoder = {
>                      \
> +    .p.name         = #short_name "_mediacodec",
>                        \
> +    CODEC_LONG_NAME(full_name " Android MediaCodec decoder"),
>                       \
> +    .p.type         = AVMEDIA_TYPE_AUDIO,
>                       \
> +    .p.id           = codec_id,
>                       \
> +    .p.priv_class   = &ff_##short_name##_mediacodec_dec_class,
>                      \
> +    .priv_data_size = sizeof(MediaCodecH264DecContext),
>                       \
> +    .init           = mediacodec_decode_init,
>                       \
> +    FF_CODEC_RECEIVE_FRAME_CB(mediacodec_receive_frame),
>                      \
> +    .flush          = mediacodec_decode_flush,
>                      \
> +    .close          = mediacodec_decode_close,
>                      \
> +    .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,
>                       \
> +    .caps_internal  = FF_CODEC_CAP_NOT_INIT_THREADSAFE,
>                       \
> +    .bsfs           = bsf,
>                      \
> +    .p.wrapper_name = "mediacodec",
>                       \
> +};
>                      \
> +
> +#if CONFIG_AAC_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(aac, "AAC", AV_CODEC_ID_AAC, "aac_adtstoasc")
> +#endif
> +
> +#if CONFIG_AMRNB_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(amrnb, "AMR-NB", AV_CODEC_ID_AMR_NB, NULL)
> +#endif
> +
> +#if CONFIG_AMRWB_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(amrwb, "AMR-WB", AV_CODEC_ID_AMR_WB, NULL)
> +#endif
> +
> +#if CONFIG_FLAC_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(flac, "FLAC", AV_CODEC_ID_FLAC, NULL)
> +#endif
> +
> +#if CONFIG_MP3_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(mp3, "MP3", AV_CODEC_ID_MP3, NULL)
> +#endif
> +
> +#if CONFIG_OPUS_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(opus, "OPUS", AV_CODEC_ID_OPUS, NULL)
> +#endif
> +
> +#if CONFIG_VORBIS_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(vorbis, "VORBIS", AV_CODEC_ID_VORBIS, NULL)
> +#endif
> diff --git a/libavcodec/mediacodecdec_common.c
> b/libavcodec/mediacodecdec_common.c
> index 4d22db8ecf..4bdd0128c2 100644
> --- a/libavcodec/mediacodecdec_common.c
> +++ b/libavcodec/mediacodecdec_common.c
> @@ -23,6 +23,7 @@
>  #include <string.h>
>  #include <sys/types.h>
>
> +#include "libavutil/avassert.h"
>  #include "libavutil/common.h"
>  #include "libavutil/hwcontext_mediacodec.h"
>  #include "libavutil/mem.h"
> @@ -30,6 +31,7 @@
>  #include "libavutil/pixfmt.h"
>  #include "libavutil/time.h"
>  #include "libavutil/timestamp.h"
> +#include "libavutil/channel_layout.h"
>
>  #include "avcodec.h"
>  #include "decode.h"
> @@ -85,6 +87,110 @@
>  #define OUTPUT_DEQUEUE_TIMEOUT_US 8000
>  #define OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US 1000000
>
> +enum {
> +    ENCODING_PCM_16BIT        = 0x00000002,
> +    ENCODING_PCM_8BIT         = 0x00000003,
> +    ENCODING_PCM_FLOAT        = 0x00000004,
> +    ENCODING_PCM_24BIT_PACKED = 0x00000015,
> +    ENCODING_PCM_32BIT        = 0x00000016,
> +};
> +
> +static const struct {
> +
> +    int pcm_format;
> +    enum AVSampleFormat sample_format;
> +
> +} sample_formats[] = {
> +
> +    { ENCODING_PCM_16BIT,        AV_SAMPLE_FMT_S16 },
> +    { ENCODING_PCM_8BIT,         AV_SAMPLE_FMT_U8  },
> +    { ENCODING_PCM_FLOAT,        AV_SAMPLE_FMT_FLT },
> +    { ENCODING_PCM_24BIT_PACKED, AV_SAMPLE_FMT_S32 },
> +    { ENCODING_PCM_32BIT,        AV_SAMPLE_FMT_S32 },
> +    { 0 }
> +};
> +
> +static enum AVSampleFormat mcdec_map_pcm_format(AVCodecContext *avctx,
> +                                               MediaCodecDecContext *s,
> +                                               int pcm_format)
> +{
> +    int i;
> +    enum AVSampleFormat ret = AV_SAMPLE_FMT_NONE;
> +
> +    for (i = 0; i < FF_ARRAY_ELEMS(sample_formats); i++) {
> +        if (sample_formats[i].pcm_format == pcm_format) {
> +            return sample_formats[i].sample_format;
> +        }
> +    }
> +
> +    av_log(avctx, AV_LOG_ERROR, "Output sample format 0x%x (value=%d) is
> not supported\n",
> +           pcm_format, pcm_format);
> +
> +    return ret;
> +}
> +
> +enum
> +{
> +  CHANNEL_OUT_FRONT_LEFT                 = 0x4,
> +  CHANNEL_OUT_FRONT_RIGHT                = 0x8,
> +  CHANNEL_OUT_FRONT_CENTER               = 0x10,
> +  CHANNEL_OUT_LOW_FREQUENCY              = 0x20,
> +  CHANNEL_OUT_BACK_LEFT                  = 0x40,
> +  CHANNEL_OUT_BACK_RIGHT                 = 0x80,
> +  CHANNEL_OUT_FRONT_LEFT_OF_CENTER       = 0x100,
> +  CHANNEL_OUT_FRONT_RIGHT_OF_CENTER      = 0x200,
> +  CHANNEL_OUT_BACK_CENTER                = 0x400,
> +  CHANNEL_OUT_SIDE_LEFT                  = 0x800,
> +  CHANNEL_OUT_SIDE_RIGHT                 = 0x1000,
> +  CHANNEL_OUT_TOP_CENTER                 = 0x2000,
> +  CHANNEL_OUT_TOP_FRONT_LEFT             = 0x4000,
> +  CHANNEL_OUT_TOP_FRONT_CENTER           = 0x8000,
> +  CHANNEL_OUT_TOP_FRONT_RIGHT            = 0x10000,
> +  CHANNEL_OUT_TOP_BACK_LEFT              = 0x20000,
> +  CHANNEL_OUT_TOP_BACK_CENTER            = 0x40000,
> +  CHANNEL_OUT_TOP_BACK_RIGHT             = 0x80000,
> +};
> +
> +static const struct {
> +
> +    int mask;
> +    uint64_t layout;
> +
> +} channel_masks[] = {
> +    { CHANNEL_OUT_FRONT_LEFT,            AV_CH_FRONT_LEFT },
> +    { CHANNEL_OUT_FRONT_RIGHT,           AV_CH_FRONT_RIGHT },
> +    { CHANNEL_OUT_FRONT_CENTER,          AV_CH_FRONT_CENTER },
> +    { CHANNEL_OUT_LOW_FREQUENCY,         AV_CH_LOW_FREQUENCY },
> +    { CHANNEL_OUT_BACK_LEFT,             AV_CH_BACK_LEFT },
> +    { CHANNEL_OUT_BACK_RIGHT,            AV_CH_BACK_RIGHT },
> +    { CHANNEL_OUT_FRONT_LEFT_OF_CENTER,  AV_CH_FRONT_LEFT_OF_CENTER },
> +    { CHANNEL_OUT_FRONT_RIGHT_OF_CENTER, AV_CH_FRONT_RIGHT_OF_CENTER },
> +    { CHANNEL_OUT_BACK_CENTER,           AV_CH_BACK_CENTER },
> +    { CHANNEL_OUT_SIDE_LEFT,             AV_CH_SIDE_LEFT },
> +    { CHANNEL_OUT_SIDE_RIGHT,            AV_CH_SIDE_RIGHT },
> +    { CHANNEL_OUT_TOP_CENTER,            AV_CH_TOP_CENTER },
> +    { CHANNEL_OUT_TOP_FRONT_LEFT,        AV_CH_TOP_FRONT_LEFT },
> +    { CHANNEL_OUT_TOP_FRONT_CENTER,      AV_CH_TOP_FRONT_CENTER },
> +    { CHANNEL_OUT_TOP_FRONT_RIGHT,       AV_CH_TOP_FRONT_RIGHT },
> +    { CHANNEL_OUT_TOP_BACK_LEFT,         AV_CH_TOP_BACK_LEFT },
> +    { CHANNEL_OUT_TOP_BACK_CENTER,       AV_CH_TOP_BACK_CENTER },
> +    { CHANNEL_OUT_TOP_BACK_RIGHT,        AV_CH_TOP_BACK_RIGHT },
> +};
> +
> +static uint64_t mcdec_map_channel_mask(AVCodecContext *avctx,
> +                                       int channel_mask)
> +{
> +    int i;
> +    uint64_t channel_layout = 0;
> +
> +    for (i = 0; i < FF_ARRAY_ELEMS(channel_masks); i++) {
> +        if (channel_mask & channel_masks[i].mask)
> +            channel_layout |= channel_masks[i].layout;
> +    }
> +
> +    return channel_layout;
> +}
> +
>  enum {
>      COLOR_FormatYUV420Planar                              = 0x13,
>      COLOR_FormatYUV420SemiPlanar                          = 0x15,
> @@ -265,13 +371,77 @@ fail:
>      return ret;
>  }
>
> -static int mediacodec_wrap_sw_buffer(AVCodecContext *avctx,
> -                                  MediaCodecDecContext *s,
> -                                  uint8_t *data,
> -                                  size_t size,
> -                                  ssize_t index,
> -                                  FFAMediaCodecBufferInfo *info,
> -                                  AVFrame *frame)
> +static int mediacodec_wrap_sw_audio_buffer(AVCodecContext *avctx,
> +                                           MediaCodecDecContext *s,
> +                                           uint8_t *data,
> +                                           size_t size,
> +                                           ssize_t index,
> +                                           FFAMediaCodecBufferInfo *info,
> +                                           AVFrame *frame)
> +{
> +    int ret = 0;
> +    int status = 0;
> +    const int sample_size = av_get_bytes_per_sample(avctx->sample_fmt);
> +    if (!sample_size) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not get bytes per sample\n");
> +        goto done;
> +    }
> +
> +    frame->format = avctx->sample_fmt;
> +    frame->sample_rate = avctx->sample_rate;
> +    frame->nb_samples = info->size / (sample_size *
> avctx->ch_layout.nb_channels);
> +
> +    ret = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);
> +    if (ret < 0) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not copy channel layout\n");
> +        goto done;
> +    }
> +
> +    /* MediaCodec buffers needs to be copied to our own refcounted buffers
> +     * because the flush command invalidates all input and output buffers.
> +     */
> +    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer\n");
> +        goto done;
> +    }
> +
> +    /* Override frame->pts as ff_get_buffer will override its value based
> +     * on the last avpacket received which is not in sync with the frame:
> +     *   * N avpackets can be pushed before 1 frame is actually returned
> +     *   * 0-sized avpackets are pushed to flush remaining frames at EOS
> */
> +    if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
> +        frame->pts = av_rescale_q(info->presentationTimeUs,
> +                                      AV_TIME_BASE_Q,
> +                                      avctx->pkt_timebase);
> +    } else {
> +        frame->pts = info->presentationTimeUs;
> +    }
> +    frame->pkt_dts = AV_NOPTS_VALUE;
> +
> +    av_log(avctx, AV_LOG_TRACE,
> +           "Frame: format=%d channels=%d sample_rate=%d nb_samples=%d",
> +           avctx->sample_fmt, avctx->ch_layout.nb_channels,
> avctx->sample_rate, frame->nb_samples);
> +
> +    memcpy(frame->data[0], data, info->size);
> +
> +    ret = 0;
> +done:
> +    status = ff_AMediaCodec_releaseOutputBuffer(s->codec, index, 0);
> +    if (status < 0) {
> +        av_log(avctx, AV_LOG_ERROR, "Failed to release output buffer\n");
> +        ret = AVERROR_EXTERNAL;
> +    }
> +
> +    return ret;
> +}
> +
> +static int mediacodec_wrap_sw_video_buffer(AVCodecContext *avctx,
> +                                           MediaCodecDecContext *s,
> +                                           uint8_t *data,
> +                                           size_t size,
> +                                           ssize_t index,
> +                                           FFAMediaCodecBufferInfo *info,
> +                                           AVFrame *frame)
>  {
>      int ret = 0;
>      int status = 0;
> @@ -343,6 +513,22 @@ done:
>      return ret;
>  }
>
> +static int mediacodec_wrap_sw_buffer(AVCodecContext *avctx,
> +                                     MediaCodecDecContext *s,
> +                                     uint8_t *data,
> +                                     size_t size,
> +                                     ssize_t index,
> +                                     FFAMediaCodecBufferInfo *info,
> +                                     AVFrame *frame)
> +{
> +    if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
> +        return mediacodec_wrap_sw_audio_buffer(avctx, s, data, size,
> index, info, frame);
> +    else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
> +        return mediacodec_wrap_sw_video_buffer(avctx, s, data, size,
> index, info, frame);
> +    else
> +        av_assert0(0);
> +}
> +
>  #define AMEDIAFORMAT_GET_INT32(name, key, mandatory) do {
>               \
>      int32_t value = 0;
>              \
>      if (ff_AMediaFormat_getInt32(s->format, key, &value)) {
>               \
> @@ -354,7 +540,7 @@ done:
>      }
>               \
>  } while (0)
>               \
>
> -static int mediacodec_dec_parse_format(AVCodecContext *avctx,
> MediaCodecDecContext *s)
> +static int mediacodec_dec_parse_video_format(AVCodecContext *avctx,
> MediaCodecDecContext *s)
>  {
>      int ret = 0;
>      int width = 0;
> @@ -463,6 +649,63 @@ fail:
>      return ret;
>  }
>
> +static int mediacodec_dec_parse_audio_format(AVCodecContext *avctx,
> MediaCodecDecContext *s)
> +{
> +    int ret = 0;
> +    int sample_rate = 0;
> +    int channel_count = 0;
> +    int channel_mask = 0;
> +    int pcm_encoding = 0;
> +    char *format = NULL;
> +
> +    if (!s->format) {
> +        av_log(avctx, AV_LOG_ERROR, "Output MediaFormat is not set\n");
> +        return AVERROR(EINVAL);
> +    }
> +
> +    format = ff_AMediaFormat_toString(s->format);
> +    if (!format) {
> +        return AVERROR_EXTERNAL;
> +    }
> +    av_log(avctx, AV_LOG_DEBUG, "Parsing MediaFormat %s\n", format);
> +
> +    /* Mandatory fields */
> +    AMEDIAFORMAT_GET_INT32(channel_count, "channel-count", 1);
> +    AMEDIAFORMAT_GET_INT32(sample_rate,   "sample-rate",   1);
> +
> +    AMEDIAFORMAT_GET_INT32(pcm_encoding, "pcm-encoding", 0);
> +    if (pcm_encoding)
> +        avctx->sample_fmt  = mcdec_map_pcm_format(avctx, s, pcm_encoding);
> +    else
> +        avctx->sample_fmt = AV_SAMPLE_FMT_S16;
> +
> +    avctx->sample_rate = sample_rate;
> +
> +    AMEDIAFORMAT_GET_INT32(channel_mask, "channel-mask", 0);
> +    if (channel_mask)
> +        av_channel_layout_from_mask(&avctx->ch_layout,
> mcdec_map_channel_mask(avctx, channel_mask));
> +    else
> +        av_channel_layout_default(&avctx->ch_layout, channel_count);
> +
> +    av_log(avctx, AV_LOG_INFO,
> +        "Output parameters channel-count=%d channel-layout=%x
> sample-rate=%d\n",
> +        channel_count, channel_mask, sample_rate);
> +
> +fail:
> +    av_freep(&format);
> +    return ret;
> +}
> +
> +static int mediacodec_dec_parse_format(AVCodecContext *avctx,
> MediaCodecDecContext *s)
> +{
> +    if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
> +        return mediacodec_dec_parse_audio_format(avctx, s);
> +    else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
> +        return mediacodec_dec_parse_video_format(avctx, s);
> +    else
> +        av_assert0(0);
> +}
> +
>  static int mediacodec_dec_flush_codec(AVCodecContext *avctx,
> MediaCodecDecContext *s)
>  {
>      FFAMediaCodec *codec = s->codec;
> @@ -486,11 +729,9 @@ static int mediacodec_dec_flush_codec(AVCodecContext
> *avctx, MediaCodecDecContex
>      return 0;
>  }
>
> -int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
> -                           const char *mime, FFAMediaFormat *format)
> +static int mediacodec_dec_get_video_codec(AVCodecContext *avctx,
> MediaCodecDecContext *s,
> +                                          const char *mime,
> FFAMediaFormat *format)
>  {
> -    int ret = 0;
> -    int status;
>      int profile;
>
>      enum AVPixelFormat pix_fmt;
> @@ -499,12 +740,6 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx,
> MediaCodecDecContext *s,
>          AV_PIX_FMT_NONE,
>      };
>
> -    s->avctx = avctx;
> -    atomic_init(&s->refcount, 1);
> -    atomic_init(&s->hw_buffer_count, 0);
> -    atomic_init(&s->serial, 1);
> -    s->current_input_buffer = -1;
> -
>      pix_fmt = ff_get_format(avctx, pix_fmts);
>      if (pix_fmt == AV_PIX_FMT_MEDIACODEC) {
>          AVMediaCodecContext *user_ctx = avctx->hwaccel_context;
> @@ -536,8 +771,7 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx,
> MediaCodecDecContext *s,
>          // getCodecNameByType() can fail due to missing JVM, while NDK
>          // mediacodec can be used without JVM.
>          if (!s->use_ndk_codec) {
> -            ret = AVERROR_EXTERNAL;
> -            goto fail;
> +            return AVERROR_EXTERNAL;
>          }
>          av_log(avctx, AV_LOG_INFO, "Failed to getCodecNameByType\n");
>      } else {
> @@ -556,10 +790,51 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx,
> MediaCodecDecContext *s,
>      }
>      if (!s->codec) {
>          av_log(avctx, AV_LOG_ERROR, "Failed to create media decoder for
> type %s and name %s\n", mime, s->codec_name);
> -        ret = AVERROR_EXTERNAL;
> -        goto fail;
> +        return AVERROR_EXTERNAL;
> +    }
> +
> +    return 0;
> +}
> +
> +static int mediacodec_dec_get_audio_codec(AVCodecContext *avctx,
> MediaCodecDecContext *s,
> +                                          const char *mime,
> FFAMediaFormat *format)
> +{
> +    s->codec = ff_AMediaCodec_createDecoderByType(mime, s->use_ndk_codec);
> +    if (!s->codec) {
> +        av_log(avctx, AV_LOG_ERROR, "Failed to create media decoder for
> mime %s\n", mime);
> +        return AVERROR_EXTERNAL;
> +    }
> +
> +    s->codec_name = ff_AMediaCodec_getName(s->codec);
> +    if (!s->codec_name) {
> +        av_log(avctx, AV_LOG_ERROR, "Failed to get codec name");
> +        return AVERROR_EXTERNAL;
>      }
>
> +    return 0;
> +}
> +
> +int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
> +                           const char *mime, FFAMediaFormat *format)
> +{
> +    int ret;
> +    int status;
> +
> +    s->avctx = avctx;
> +    atomic_init(&s->refcount, 1);
> +    atomic_init(&s->hw_buffer_count, 0);
> +    atomic_init(&s->serial, 1);
> +    s->current_input_buffer = -1;
> +
> +    if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
> +        ret = mediacodec_dec_get_audio_codec(avctx, s, mime, format);
> +    else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
> +        ret = mediacodec_dec_get_video_codec(avctx, s, mime, format);
> +    else
> +        av_assert0(0);
> +    if (ret < 0)
> +        goto fail;
> +
>      status = ff_AMediaCodec_configure(s->codec, format, s->surface, NULL,
> 0);
>      if (status < 0) {
>          char *desc = ff_AMediaFormat_toString(format);
> @@ -583,12 +858,14 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx,
> MediaCodecDecContext *s,
>          goto fail;
>      }
>
> -    s->format = ff_AMediaCodec_getOutputFormat(s->codec);
> -    if (s->format) {
> -        if ((ret = mediacodec_dec_parse_format(avctx, s)) < 0) {
> -            av_log(avctx, AV_LOG_ERROR,
> -                "Failed to configure context\n");
> -            goto fail;
> +    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
> +        s->format = ff_AMediaCodec_getOutputFormat(s->codec);
> +        if (s->format) {
> +            if ((ret = mediacodec_dec_parse_format(avctx, s)) < 0) {
> +                av_log(avctx, AV_LOG_ERROR,
> +                    "Failed to configure context\n");
> +                goto fail;
> +            }
>          }
>      }
>
> --
> 2.45.2
>

Ping
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-06-12 13:42 [FFmpeg-devel] Add Mediacodec audio decoders support Matthieu Bouron
                   ` (2 preceding siblings ...)
  2024-06-12 14:00 ` [FFmpeg-devel] Add " Paul B Mahol
@ 2024-07-10 13:54 ` Zhao Zhili
  2024-07-10 16:31   ` Matthieu Bouron
  2024-07-23 11:35   ` Martin Storsjö
  3 siblings, 2 replies; 23+ messages in thread
From: Zhao Zhili @ 2024-07-10 13:54 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


> On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
> 
> Hello,
> 
> This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
> MP3, FLAC, VORBIS and OPUS are supported.
> 
> This is mainly useful to avoid shipping Android builds of FFmpeg that are
> subjects to licensing/patents (due to AAC and AMR).

I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg. They don’t bring
new features, they don’t improve performance. I know these type of wrapper exist in current
project, but I’m not sure if it’s a good idea to add more.

This is a policy issue rather than technique issue, it requires more people to discuss and
decide.

> 
> Best regards,
> Matthieu
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-10 13:54 ` Zhao Zhili
@ 2024-07-10 16:31   ` Matthieu Bouron
  2024-07-16 13:20     ` Matthieu Bouron
  2024-07-23 11:35   ` Martin Storsjö
  1 sibling, 1 reply; 23+ messages in thread
From: Matthieu Bouron @ 2024-07-10 16:31 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On Wed, Jul 10, 2024 at 4:04 PM Zhao Zhili <quinkblack@foxmail.com> wrote:
>
>
> > On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
> >
> > Hello,
> >
> > This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
> > MP3, FLAC, VORBIS and OPUS are supported.
> >
> > This is mainly useful to avoid shipping Android builds of FFmpeg that are
> > subjects to licensing/patents (due to AAC and AMR).
>
> I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg. They don’t bring
> new features, they don’t improve performance. I know these type of wrapper exist in current
> project, but I’m not sure if it’s a good idea to add more.

I agree that on the technical side it doesn't bring new features nor
performance improvements. It's all about avoiding licensing/patents
issues with AAC and AMR here.
In this specific case we already have the wrapper infrastructure, the
audio part only needs small adjustments to work.
Moreover, if that helps, I can reduce the scope of the patch to AAC
and AMR only and get rid of mp3/flac/vorbis/opus support. What do you
think ?

>
> This is a policy issue rather than technique issue, it requires more people to discuss and
> decide.
>

[...]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-10 16:31   ` Matthieu Bouron
@ 2024-07-16 13:20     ` Matthieu Bouron
  2024-07-16 14:58       ` Zhao Zhili
  0 siblings, 1 reply; 23+ messages in thread
From: Matthieu Bouron @ 2024-07-16 13:20 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On Wed, Jul 10, 2024 at 6:31 PM Matthieu Bouron
<matthieu.bouron@gmail.com> wrote:
>
> On Wed, Jul 10, 2024 at 4:04 PM Zhao Zhili <quinkblack@foxmail.com> wrote:
> >
> >
> > > On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
> > >
> > > Hello,
> > >
> > > This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
> > > MP3, FLAC, VORBIS and OPUS are supported.
> > >
> > > This is mainly useful to avoid shipping Android builds of FFmpeg that are
> > > subjects to licensing/patents (due to AAC and AMR).
> >
> > I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg. They don’t bring
> > new features, they don’t improve performance. I know these type of wrapper exist in current
> > project, but I’m not sure if it’s a good idea to add more.
>
> I agree that on the technical side it doesn't bring new features nor
> performance improvements. It's all about avoiding licensing/patents
> issues with AAC and AMR here.
> In this specific case we already have the wrapper infrastructure, the
> audio part only needs small adjustments to work.
> Moreover, if that helps, I can reduce the scope of the patch to AAC
> and AMR only and get rid of mp3/flac/vorbis/opus support. What do you
> think ?

Ping.

IMHO, this benefits users wanting to ship an Android app that relies
on FFmpeg upstream in countries that are subject to AAC/AMR licensing.
While I agree that it's not great from a purely technical pov since we
already have better native decoders, it will allow the use of FFmpeg
in such situation without the need to use or create another FFmpeg
fork dedicated to Android. Plus, as I said above, we already have the
wrapper and the additional code to make it work for audio is
relatively small and scoped. Restricting the wrapper to AAC/AMR seems
like a good compromise to me.

[...]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-16 13:20     ` Matthieu Bouron
@ 2024-07-16 14:58       ` Zhao Zhili
       [not found]         ` <2009DBEE-686A-42F6-A5DF-35147272EEF0@cosmin.at>
  0 siblings, 1 reply; 23+ messages in thread
From: Zhao Zhili @ 2024-07-16 14:58 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: tc



> On Jul 16, 2024, at 21:20, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
> 
> On Wed, Jul 10, 2024 at 6:31 PM Matthieu Bouron
> <matthieu.bouron@gmail.com> wrote:
>> 
>> On Wed, Jul 10, 2024 at 4:04 PM Zhao Zhili <quinkblack@foxmail.com> wrote:
>>> 
>>> 
>>>> On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
>>>> 
>>>> Hello,
>>>> 
>>>> This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
>>>> MP3, FLAC, VORBIS and OPUS are supported.
>>>> 
>>>> This is mainly useful to avoid shipping Android builds of FFmpeg that are
>>>> subjects to licensing/patents (due to AAC and AMR).
>>> 
>>> I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg. They don’t bring
>>> new features, they don’t improve performance. I know these type of wrapper exist in current
>>> project, but I’m not sure if it’s a good idea to add more.
>> 
>> I agree that on the technical side it doesn't bring new features nor
>> performance improvements. It's all about avoiding licensing/patents
>> issues with AAC and AMR here.
>> In this specific case we already have the wrapper infrastructure, the
>> audio part only needs small adjustments to work.
>> Moreover, if that helps, I can reduce the scope of the patch to AAC
>> and AMR only and get rid of mp3/flac/vorbis/opus support. What do you
>> think ?
> 
> Ping.
> 
> IMHO, this benefits users wanting to ship an Android app that relies
> on FFmpeg upstream in countries that are subject to AAC/AMR licensing.
> While I agree that it's not great from a purely technical pov since we
> already have better native decoders, it will allow the use of FFmpeg
> in such situation without the need to use or create another FFmpeg
> fork dedicated to Android. Plus, as I said above, we already have the
> wrapper and the additional code to make it work for audio is
> relatively small and scoped. Restricting the wrapper to AAC/AMR seems
> like a good compromise to me.

Sounds reasonable, but I’d like to get more opinions. cc TC.

> 
> [...]
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
       [not found]         ` <2009DBEE-686A-42F6-A5DF-35147272EEF0@cosmin.at>
@ 2024-07-16 15:48           ` Cosmin Stejerean via ffmpeg-devel
  2024-07-16 16:04             ` Zhao Zhili
                               ` (2 more replies)
  0 siblings, 3 replies; 23+ messages in thread
From: Cosmin Stejerean via ffmpeg-devel @ 2024-07-16 15:48 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Cosmin Stejerean, tc



> On Jul 16, 2024, at 4:58 PM, Zhao Zhili <quinkblack@foxmail.com> wrote:
> 
> 
> 
>> On Jul 16, 2024, at 21:20, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
>> 
>> On Wed, Jul 10, 2024 at 6:31 PM Matthieu Bouron
>> <matthieu.bouron@gmail.com> wrote:
>>> 
>>> On Wed, Jul 10, 2024 at 4:04 PM Zhao Zhili <quinkblack@foxmail.com> wrote:
>>>> 
>>>> 
>>>>> On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
>>>>> 
>>>>> Hello,
>>>>> 
>>>>> This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
>>>>> MP3, FLAC, VORBIS and OPUS are supported.
>>>>> 
>>>>> This is mainly useful to avoid shipping Android builds of FFmpeg that are
>>>>> subjects to licensing/patents (due to AAC and AMR).
>>>> 
>>>> I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg. They don’t bring
>>>> new features, they don’t improve performance. I know these type of wrapper exist in current
>>>> project, but I’m not sure if it’s a good idea to add more.
>>> 
>>> I agree that on the technical side it doesn't bring new features nor
>>> performance improvements. It's all about avoiding licensing/patents
>>> issues with AAC and AMR here.
>>> In this specific case we already have the wrapper infrastructure, the
>>> audio part only needs small adjustments to work.
>>> Moreover, if that helps, I can reduce the scope of the patch to AAC
>>> and AMR only and get rid of mp3/flac/vorbis/opus support. What do you
>>> think ?
>> 
>> Ping.
>> 
>> IMHO, this benefits users wanting to ship an Android app that relies
>> on FFmpeg upstream in countries that are subject to AAC/AMR licensing.
>> While I agree that it's not great from a purely technical pov since we
>> already have better native decoders, it will allow the use of FFmpeg
>> in such situation without the need to use or create another FFmpeg
>> fork dedicated to Android. Plus, as I said above, we already have the
>> wrapper and the additional code to make it work for audio is
>> relatively small and scoped. Restricting the wrapper to AAC/AMR seems
>> like a good compromise to me.
> 
> Sounds reasonable, but I’d like to get more opinions. cc TC.

To add another data point, the platform decoders might also be more secure due to sandboxing. I believe as of Android Q the software decoders provided by MediaCodec have been moved to run within a constrained sandbox.

- Cosmin


_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-16 15:48           ` Cosmin Stejerean via ffmpeg-devel
@ 2024-07-16 16:04             ` Zhao Zhili
       [not found]               ` <057FD6DF-E71C-49D0-8D11-7A7E4D5FB5CC@cosmin.at>
  2024-07-16 18:24             ` Rémi Denis-Courmont
  2024-07-17 15:39             ` Paul B Mahol
  2 siblings, 1 reply; 23+ messages in thread
From: Zhao Zhili @ 2024-07-16 16:04 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: tc



> On Jul 16, 2024, at 23:48, Cosmin Stejerean via ffmpeg-devel <ffmpeg-devel@ffmpeg.org> wrote:
> 
> 
> 
>> On Jul 16, 2024, at 4:58 PM, Zhao Zhili <quinkblack@foxmail.com> wrote:
>> 
>> 
>> 
>>> On Jul 16, 2024, at 21:20, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
>>> 
>>> On Wed, Jul 10, 2024 at 6:31 PM Matthieu Bouron
>>> <matthieu.bouron@gmail.com> wrote:
>>>> 
>>>> On Wed, Jul 10, 2024 at 4:04 PM Zhao Zhili <quinkblack@foxmail.com> wrote:
>>>>> 
>>>>> 
>>>>>> On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
>>>>>> 
>>>>>> Hello,
>>>>>> 
>>>>>> This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
>>>>>> MP3, FLAC, VORBIS and OPUS are supported.
>>>>>> 
>>>>>> This is mainly useful to avoid shipping Android builds of FFmpeg that are
>>>>>> subjects to licensing/patents (due to AAC and AMR).
>>>>> 
>>>>> I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg. They don’t bring
>>>>> new features, they don’t improve performance. I know these type of wrapper exist in current
>>>>> project, but I’m not sure if it’s a good idea to add more.
>>>> 
>>>> I agree that on the technical side it doesn't bring new features nor
>>>> performance improvements. It's all about avoiding licensing/patents
>>>> issues with AAC and AMR here.
>>>> In this specific case we already have the wrapper infrastructure, the
>>>> audio part only needs small adjustments to work.
>>>> Moreover, if that helps, I can reduce the scope of the patch to AAC
>>>> and AMR only and get rid of mp3/flac/vorbis/opus support. What do you
>>>> think ?
>>> 
>>> Ping.
>>> 
>>> IMHO, this benefits users wanting to ship an Android app that relies
>>> on FFmpeg upstream in countries that are subject to AAC/AMR licensing.
>>> While I agree that it's not great from a purely technical pov since we
>>> already have better native decoders, it will allow the use of FFmpeg
>>> in such situation without the need to use or create another FFmpeg
>>> fork dedicated to Android. Plus, as I said above, we already have the
>>> wrapper and the additional code to make it work for audio is
>>> relatively small and scoped. Restricting the wrapper to AAC/AMR seems
>>> like a good compromise to me.
>> 
>> Sounds reasonable, but I’d like to get more opinions. cc TC.
> 
> To add another data point, the platform decoders might also be more secure due to sandboxing. I believe as of Android Q the software decoders provided by MediaCodec have been moved to run within a constrained sandbox.

I don’t think what Android says “secure” apply to use. The sandbox means not to
break the OS and leak information from one APP to another APP, because mediacodec
service is shared by all APP. An APP with FFmpeg inside and use software decoder/encoder
don’t have such issues since the APP don’t share decoders/encoders with other APP.

> 
> - Cosmin
> 
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
       [not found]               ` <057FD6DF-E71C-49D0-8D11-7A7E4D5FB5CC@cosmin.at>
@ 2024-07-16 16:42                 ` Cosmin Stejerean via ffmpeg-devel
  0 siblings, 0 replies; 23+ messages in thread
From: Cosmin Stejerean via ffmpeg-devel @ 2024-07-16 16:42 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Cosmin Stejerean, tc



> On Jul 16, 2024, at 6:04 PM, Zhao Zhili <quinkblack@foxmail.com> wrote:
> 
> 
> 
>> On Jul 16, 2024, at 23:48, Cosmin Stejerean via ffmpeg-devel <ffmpeg-devel@ffmpeg.org> wrote:
>> 
>> 
>> 
>>> On Jul 16, 2024, at 4:58 PM, Zhao Zhili <quinkblack@foxmail.com> wrote:
>>> 
>>> 
>>> 
>>>> On Jul 16, 2024, at 21:20, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
>>>> 
>>>> On Wed, Jul 10, 2024 at 6:31 PM Matthieu Bouron
>>>> <matthieu.bouron@gmail.com> wrote:
>>>>> 
>>>>> On Wed, Jul 10, 2024 at 4:04 PM Zhao Zhili <quinkblack@foxmail.com> wrote:
>>>>>> 
>>>>>> 
>>>>>>> On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
>>>>>>> 
>>>>>>> Hello,
>>>>>>> 
>>>>>>> This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
>>>>>>> MP3, FLAC, VORBIS and OPUS are supported.
>>>>>>> 
>>>>>>> This is mainly useful to avoid shipping Android builds of FFmpeg that are
>>>>>>> subjects to licensing/patents (due to AAC and AMR).
>>>>>> 
>>>>>> I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg. They don’t bring
>>>>>> new features, they don’t improve performance. I know these type of wrapper exist in current
>>>>>> project, but I’m not sure if it’s a good idea to add more.
>>>>> 
>>>>> I agree that on the technical side it doesn't bring new features nor
>>>>> performance improvements. It's all about avoiding licensing/patents
>>>>> issues with AAC and AMR here.
>>>>> In this specific case we already have the wrapper infrastructure, the
>>>>> audio part only needs small adjustments to work.
>>>>> Moreover, if that helps, I can reduce the scope of the patch to AAC
>>>>> and AMR only and get rid of mp3/flac/vorbis/opus support. What do you
>>>>> think ?
>>>> 
>>>> Ping.
>>>> 
>>>> IMHO, this benefits users wanting to ship an Android app that relies
>>>> on FFmpeg upstream in countries that are subject to AAC/AMR licensing.
>>>> While I agree that it's not great from a purely technical pov since we
>>>> already have better native decoders, it will allow the use of FFmpeg
>>>> in such situation without the need to use or create another FFmpeg
>>>> fork dedicated to Android. Plus, as I said above, we already have the
>>>> wrapper and the additional code to make it work for audio is
>>>> relatively small and scoped. Restricting the wrapper to AAC/AMR seems
>>>> like a good compromise to me.
>>> 
>>> Sounds reasonable, but I’d like to get more opinions. cc TC.
>> 
>> To add another data point, the platform decoders might also be more secure due to sandboxing. I believe as of Android Q the software decoders provided by MediaCodec have been moved to run within a constrained sandbox.
> 
> I don’t think what Android says “secure” apply to use. The sandbox means not to
> break the OS and leak information from one APP to another APP, because mediacodec
> service is shared by all APP. An APP with FFmpeg inside and use software decoder/encoder
> don’t have such issues since the APP don’t share decoders/encoders with other APP.
> 

It's still an issue if a vulnerability in a software decoder gives an attacker access to the same app's data, even if per app sandboxing keeps a compromised application from accessing data from other apps. 

For example consider a messaging app. If you receive a message containing media that exploits a vulnerability in a software decoder and that gives the attacker access to all of your contacts and messages within the app, that's definitely a security issue. 
The app itself might also have other permissions to system wide resources, etc. 


- Cosmin
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-16 15:48           ` Cosmin Stejerean via ffmpeg-devel
  2024-07-16 16:04             ` Zhao Zhili
@ 2024-07-16 18:24             ` Rémi Denis-Courmont
       [not found]               ` <205EB89E-F6F9-438D-A9BC-E76E5439C7C7@cosmin.at>
  2024-07-17 15:39             ` Paul B Mahol
  2 siblings, 1 reply; 23+ messages in thread
From: Rémi Denis-Courmont @ 2024-07-16 18:24 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Le tiistaina 16. heinäkuuta 2024, 18.48.06 EEST Cosmin Stejerean via ffmpeg-
devel a écrit :
> To add another data point, the platform decoders might also be more secure
> due to sandboxing. I believe as of Android Q the software decoders provided
> by MediaCodec have been moved to run within a constrained sandbox.

Platform decoders are in all likelihood strictly less secure than software 
decoders. Software decoders will run in a user-space sandboxed within their 
respective application. Platform decoders will run in a more privileged system 
service, with direct access to a kernel driver in EL1, through that to the 
firmware running on the video DSP.

More performant and energy-efficient. But also way way less secure.

The only viewpoint whence this is more secure, is the content publisher's: 
this model enables DRM with hardware pass-through (but that does not even 
apply if you use FFmpeg as the front end).

-- 
雷米‧德尼-库尔蒙
http://www.remlab.net/



_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
       [not found]               ` <205EB89E-F6F9-438D-A9BC-E76E5439C7C7@cosmin.at>
@ 2024-07-16 20:14                 ` Cosmin Stejerean via ffmpeg-devel
  2024-07-17  9:38                   ` Anton Khirnov
  0 siblings, 1 reply; 23+ messages in thread
From: Cosmin Stejerean via ffmpeg-devel @ 2024-07-16 20:14 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Cosmin Stejerean



> On Jul 16, 2024, at 8:24 PM, Rémi Denis-Courmont <remi@remlab.net> wrote:
> 
> Le tiistaina 16. heinäkuuta 2024, 18.48.06 EEST Cosmin Stejerean via ffmpeg-
> devel a écrit :
>> To add another data point, the platform decoders might also be more secure
>> due to sandboxing. I believe as of Android Q the software decoders provided
>> by MediaCodec have been moved to run within a constrained sandbox.
> 
> Platform decoders are in all likelihood strictly less secure than software 
> decoders. Software decoders will run in a user-space sandboxed within their 
> respective application. Platform decoders will run in a more privileged system 
> service, with direct access to a kernel driver in EL1, through that to the 
> firmware running on the video DSP.
> 
> More performant and energy-efficient. But also way way less secure.
> 
> The only viewpoint whence this is more secure, is the content publisher's: 
> this model enables DRM with hardware pass-through (but that does not even 
> apply if you use FFmpeg as the front end).
> 

Platform provided *software* decoders should be more secure than bundled software decoders due to the sandboxing of software decoders in recent versions of Android.

Hardware decoders might very well not be for the reasons you mentioned.

- Cosmin
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-16 20:14                 ` Cosmin Stejerean via ffmpeg-devel
@ 2024-07-17  9:38                   ` Anton Khirnov
  2024-07-17 12:19                     ` Michael Niedermayer
  2024-07-19 19:59                     ` Martin Storsjö
  0 siblings, 2 replies; 23+ messages in thread
From: Anton Khirnov @ 2024-07-17  9:38 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Cosmin Stejerean

Quoting Cosmin Stejerean via ffmpeg-devel (2024-07-16 22:14:19)
> 
> 
> > On Jul 16, 2024, at 8:24 PM, Rémi Denis-Courmont <remi@remlab.net> wrote:
> > 
> > Le tiistaina 16. heinäkuuta 2024, 18.48.06 EEST Cosmin Stejerean via ffmpeg-
> > devel a écrit :
> >> To add another data point, the platform decoders might also be more secure
> >> due to sandboxing. I believe as of Android Q the software decoders provided
> >> by MediaCodec have been moved to run within a constrained sandbox.
> > 
> > Platform decoders are in all likelihood strictly less secure than software 
> > decoders. Software decoders will run in a user-space sandboxed within their 
> > respective application. Platform decoders will run in a more privileged system 
> > service, with direct access to a kernel driver in EL1, through that to the 
> > firmware running on the video DSP.
> > 
> > More performant and energy-efficient. But also way way less secure.
> > 
> > The only viewpoint whence this is more secure, is the content publisher's: 
> > this model enables DRM with hardware pass-through (but that does not even 
> > apply if you use FFmpeg as the front end).
> > 
> 
> Platform provided *software* decoders should be more secure than bundled software decoders due to the sandboxing of software decoders in recent versions of Android.

If that is such an important feature to someone then it is not
inconceivable to implement some sort of sandboxing inside avcodec.

I'm not a big fan of the argument "we should provide passthrough to
proprietary decoders because they are more secure".

-- 
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-17  9:38                   ` Anton Khirnov
@ 2024-07-17 12:19                     ` Michael Niedermayer
  2024-07-19 19:59                     ` Martin Storsjö
  1 sibling, 0 replies; 23+ messages in thread
From: Michael Niedermayer @ 2024-07-17 12:19 UTC (permalink / raw)
  To: FFmpeg development discussions and patches, Cosmin Stejerean


[-- Attachment #1.1: Type: text/plain, Size: 2096 bytes --]

On Wed, Jul 17, 2024 at 11:38:33AM +0200, Anton Khirnov wrote:
> Quoting Cosmin Stejerean via ffmpeg-devel (2024-07-16 22:14:19)
> > 
> > 
> > > On Jul 16, 2024, at 8:24 PM, Rémi Denis-Courmont <remi@remlab.net> wrote:
> > > 
> > > Le tiistaina 16. heinäkuuta 2024, 18.48.06 EEST Cosmin Stejerean via ffmpeg-
> > > devel a écrit :
> > >> To add another data point, the platform decoders might also be more secure
> > >> due to sandboxing. I believe as of Android Q the software decoders provided
> > >> by MediaCodec have been moved to run within a constrained sandbox.
> > > 
> > > Platform decoders are in all likelihood strictly less secure than software 
> > > decoders. Software decoders will run in a user-space sandboxed within their 
> > > respective application. Platform decoders will run in a more privileged system 
> > > service, with direct access to a kernel driver in EL1, through that to the 
> > > firmware running on the video DSP.
> > > 
> > > More performant and energy-efficient. But also way way less secure.
> > > 
> > > The only viewpoint whence this is more secure, is the content publisher's: 
> > > this model enables DRM with hardware pass-through (but that does not even 
> > > apply if you use FFmpeg as the front end).
> > > 
> > 
> > Platform provided *software* decoders should be more secure than bundled software decoders due to the sandboxing of software decoders in recent versions of Android.
> 

> If that is such an important feature to someone then it is not
> inconceivable to implement some sort of sandboxing inside avcodec.
> 
> I'm not a big fan of the argument "we should provide passthrough to
> proprietary decoders because they are more secure".

+1

thx

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Dictatorship: All citizens are under surveillance, all their steps and
actions recorded, for the politicians to enforce control.
Democracy: All politicians are under surveillance, all their steps and
actions recorded, for the citizens to enforce control.

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-16 15:48           ` Cosmin Stejerean via ffmpeg-devel
  2024-07-16 16:04             ` Zhao Zhili
  2024-07-16 18:24             ` Rémi Denis-Courmont
@ 2024-07-17 15:39             ` Paul B Mahol
       [not found]               ` <4F1B9768-96C8-4708-92ED-AC8E1C9FC46F@cosmin.at>
  2 siblings, 1 reply; 23+ messages in thread
From: Paul B Mahol @ 2024-07-17 15:39 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Cosmin Stejerean, tc

On Tue, Jul 16, 2024 at 5:56 PM Cosmin Stejerean via ffmpeg-devel <
ffmpeg-devel@ffmpeg.org> wrote:

>
>
> > On Jul 16, 2024, at 4:58 PM, Zhao Zhili <quinkblack@foxmail.com> wrote:
> >
> >
> >
> >> On Jul 16, 2024, at 21:20, Matthieu Bouron <matthieu.bouron@gmail.com>
> wrote:
> >>
> >> On Wed, Jul 10, 2024 at 6:31 PM Matthieu Bouron
> >> <matthieu.bouron@gmail.com> wrote:
> >>>
> >>> On Wed, Jul 10, 2024 at 4:04 PM Zhao Zhili <quinkblack@foxmail.com>
> wrote:
> >>>>
> >>>>
> >>>>> On Jun 12, 2024, at 21:42, Matthieu Bouron <
> matthieu.bouron@gmail.com> wrote:
> >>>>>
> >>>>> Hello,
> >>>>>
> >>>>> This patchset adds Mediacodec audio decoders support. Currently,
> only AAC, AMR,
> >>>>> MP3, FLAC, VORBIS and OPUS are supported.
> >>>>>
> >>>>> This is mainly useful to avoid shipping Android builds of FFmpeg
> that are
> >>>>> subjects to licensing/patents (due to AAC and AMR).
> >>>>
> >>>> I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg.
> They don’t bring
> >>>> new features, they don’t improve performance. I know these type of
> wrapper exist in current
> >>>> project, but I’m not sure if it’s a good idea to add more.
> >>>
> >>> I agree that on the technical side it doesn't bring new features nor
> >>> performance improvements. It's all about avoiding licensing/patents
> >>> issues with AAC and AMR here.
> >>> In this specific case we already have the wrapper infrastructure, the
> >>> audio part only needs small adjustments to work.
> >>> Moreover, if that helps, I can reduce the scope of the patch to AAC
> >>> and AMR only and get rid of mp3/flac/vorbis/opus support. What do you
> >>> think ?
> >>
> >> Ping.
> >>
> >> IMHO, this benefits users wanting to ship an Android app that relies
> >> on FFmpeg upstream in countries that are subject to AAC/AMR licensing.
> >> While I agree that it's not great from a purely technical pov since we
> >> already have better native decoders, it will allow the use of FFmpeg
> >> in such situation without the need to use or create another FFmpeg
> >> fork dedicated to Android. Plus, as I said above, we already have the
> >> wrapper and the additional code to make it work for audio is
> >> relatively small and scoped. Restricting the wrapper to AAC/AMR seems
> >> like a good compromise to me.
> >
> > Sounds reasonable, but I’d like to get more opinions. cc TC.
>
> To add another data point, the platform decoders might also be more secure
> due to sandboxing. I believe as of Android Q the software decoders provided
> by MediaCodec have been moved to run within a constrained sandbox.
>

"May".
Need citations and exact repeatable scientific proof.


> - Cosmin
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
       [not found]               ` <4F1B9768-96C8-4708-92ED-AC8E1C9FC46F@cosmin.at>
@ 2024-07-17 17:35                 ` Cosmin Stejerean via ffmpeg-devel
  0 siblings, 0 replies; 23+ messages in thread
From: Cosmin Stejerean via ffmpeg-devel @ 2024-07-17 17:35 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Cosmin Stejerean, tc



> On Jul 17, 2024, at 5:39 PM, Paul B Mahol <onemda@gmail.com> wrote:
> 
> On Tue, Jul 16, 2024 at 5:56 PM Cosmin Stejerean via ffmpeg-devel <
> ffmpeg-devel@ffmpeg.org> wrote:
> 
>> 
>> 
>>> On Jul 16, 2024, at 4:58 PM, Zhao Zhili <quinkblack@foxmail.com> wrote:
>>> 
>>> 
>>> 
>>>> On Jul 16, 2024, at 21:20, Matthieu Bouron <matthieu.bouron@gmail.com>
>> wrote:
>>>> 
>>>> On Wed, Jul 10, 2024 at 6:31 PM Matthieu Bouron
>>>> <matthieu.bouron@gmail.com> wrote:
>>>>> 
>>>>> On Wed, Jul 10, 2024 at 4:04 PM Zhao Zhili <quinkblack@foxmail.com>
>> wrote:
>>>>>> 
>>>>>> 
>>>>>>> On Jun 12, 2024, at 21:42, Matthieu Bouron <
>> matthieu.bouron@gmail.com> wrote:
>>>>>>> 
>>>>>>> Hello,
>>>>>>> 
>>>>>>> This patchset adds Mediacodec audio decoders support. Currently,
>> only AAC, AMR,
>>>>>>> MP3, FLAC, VORBIS and OPUS are supported.
>>>>>>> 
>>>>>>> This is mainly useful to avoid shipping Android builds of FFmpeg
>> that are
>>>>>>> subjects to licensing/patents (due to AAC and AMR).
>>>>>> 
>>>>>> I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg.
>> They don’t bring
>>>>>> new features, they don’t improve performance. I know these type of
>> wrapper exist in current
>>>>>> project, but I’m not sure if it’s a good idea to add more.
>>>>> 
>>>>> I agree that on the technical side it doesn't bring new features nor
>>>>> performance improvements. It's all about avoiding licensing/patents
>>>>> issues with AAC and AMR here.
>>>>> In this specific case we already have the wrapper infrastructure, the
>>>>> audio part only needs small adjustments to work.
>>>>> Moreover, if that helps, I can reduce the scope of the patch to AAC
>>>>> and AMR only and get rid of mp3/flac/vorbis/opus support. What do you
>>>>> think ?
>>>> 
>>>> Ping.
>>>> 
>>>> IMHO, this benefits users wanting to ship an Android app that relies
>>>> on FFmpeg upstream in countries that are subject to AAC/AMR licensing.
>>>> While I agree that it's not great from a purely technical pov since we
>>>> already have better native decoders, it will allow the use of FFmpeg
>>>> in such situation without the need to use or create another FFmpeg
>>>> fork dedicated to Android. Plus, as I said above, we already have the
>>>> wrapper and the additional code to make it work for audio is
>>>> relatively small and scoped. Restricting the wrapper to AAC/AMR seems
>>>> like a good compromise to me.
>>> 
>>> Sounds reasonable, but I’d like to get more opinions. cc TC.
>> 
>> To add another data point, the platform decoders might also be more secure
>> due to sandboxing. I believe as of Android Q the software decoders provided
>> by MediaCodec have been moved to run within a constrained sandbox.
>> 
> 
> "May".
> Need citations and exact repeatable scientific proof.
> 

Citation https://android-developers.googleblog.com/2019/05/queue-hardening-enhancements.html#:~:text=In%20Android%20Q%2C%20we%20moved,components%20into%20less%20privileged%20sandboxes.

See the section titled "A Constrained Sandbox for Software Codecs"

- Cosmin
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-17  9:38                   ` Anton Khirnov
  2024-07-17 12:19                     ` Michael Niedermayer
@ 2024-07-19 19:59                     ` Martin Storsjö
  1 sibling, 0 replies; 23+ messages in thread
From: Martin Storsjö @ 2024-07-19 19:59 UTC (permalink / raw)
  To: FFmpeg development discussions and patches,
	FFmpeg development discussions and patches, Cosmin Stejerean

On Wed, 17 Jul 2024, Anton Khirnov wrote:

> Quoting Cosmin Stejerean via ffmpeg-devel (2024-07-16 22:14:19)
>> 
>> 
>> > On Jul 16, 2024, at 8:24 PM, Rémi Denis-Courmont <remi@remlab.net> wrote:
>> > 
>> > Le tiistaina 16. heinäkuuta 2024, 18.48.06 EEST Cosmin Stejerean via ffmpeg-
>> > devel a écrit :
>> >> To add another data point, the platform decoders might also be more secure
>> >> due to sandboxing. I believe as of Android Q the software decoders provided
>> >> by MediaCodec have been moved to run within a constrained sandbox.
>> > 
>> > Platform decoders are in all likelihood strictly less secure than software 
>> > decoders. Software decoders will run in a user-space sandboxed within their 
>> > respective application. Platform decoders will run in a more privileged system 
>> > service, with direct access to a kernel driver in EL1, through that to the 
>> > firmware running on the video DSP.
>> > 
>> > More performant and energy-efficient. But also way way less secure.
>> > 
>> > The only viewpoint whence this is more secure, is the content publisher's: 
>> > this model enables DRM with hardware pass-through (but that does not even 
>> > apply if you use FFmpeg as the front end).
>> > 
>> 
>> Platform provided *software* decoders should be more secure than bundled software decoders due to the sandboxing of software decoders in recent versions of Android.
>
> If that is such an important feature to someone then it is not
> inconceivable to implement some sort of sandboxing inside avcodec.
>
> I'm not a big fan of the argument "we should provide passthrough to
> proprietary decoders because they are more secure".

My 2 cents on this matter: I don't care much about the arguments about 
more secure or less secure here - I don't see that as affecting the 
decision either way.

We generally don't add wrappings of third party proprietary 
encoders/decoders.

But for codecs shipped as part of the OS, I don't see an issue with us 
allowing accessing those codecs. It's not like we're favouring any 
specific third party, we're just facilitating access to whatever is 
already there.

And especially in this case, we already have the general code for 
accessing the MediaCodec API for codecs on Android - I don't have a 
problem with extending this to a few more codecs, as that's not much more 
than just providing mappings to the codec identifiers.

Similarly, we already allow decoding and encoding of a long range of 
codecs via AudioToolbox on Apple platforms - I don't see MediaCodec on 
Android as any different than that.

// Martin
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-10 13:54 ` Zhao Zhili
  2024-07-10 16:31   ` Matthieu Bouron
@ 2024-07-23 11:35   ` Martin Storsjö
  2024-07-23 11:44     ` Zhao Zhili
  1 sibling, 1 reply; 23+ messages in thread
From: Martin Storsjö @ 2024-07-23 11:35 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On Wed, 10 Jul 2024, Zhao Zhili wrote:

>
>> On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
>> 
>> Hello,
>> 
>> This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
>> MP3, FLAC, VORBIS and OPUS are supported.
>> 
>> This is mainly useful to avoid shipping Android builds of FFmpeg that are
>> subjects to licensing/patents (due to AAC and AMR).
>
> I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg. They 
> don’t bring new features, they don’t improve performance. I know these 
> type of wrapper exist in current project, but I’m not sure if it’s a 
> good idea to add more.

I don't see a problem with it. It doesn't add much extra code, we already 
have MediaCodec interfacing in place, it allows users to set up whichever 
configuration they want. We have this for other OS codec interfaces as 
well, I don't see a problem with adding this one as well - no need for the 
further arguments about security and sandboxes.

// Martin
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-23 11:35   ` Martin Storsjö
@ 2024-07-23 11:44     ` Zhao Zhili
  2024-07-23 13:43       ` Anton Khirnov
  0 siblings, 1 reply; 23+ messages in thread
From: Zhao Zhili @ 2024-07-23 11:44 UTC (permalink / raw)
  To: FFmpeg development discussions and patches



> On Jul 23, 2024, at 19:35, Martin Storsjö <martin@martin.st> wrote:
> 
> On Wed, 10 Jul 2024, Zhao Zhili wrote:
> 
>> 
>>> On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
>>> Hello,
>>> This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
>>> MP3, FLAC, VORBIS and OPUS are supported.
>>> This is mainly useful to avoid shipping Android builds of FFmpeg that are
>>> subjects to licensing/patents (due to AAC and AMR).
>> 
>> I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg. They don’t bring new features, they don’t improve performance. I know these type of wrapper exist in current project, but I’m not sure if it’s a good idea to add more.
> 
> I don't see a problem with it. It doesn't add much extra code, we already have MediaCodec interfacing in place, it allows users to set up whichever configuration they want. We have this for other OS codec interfaces as well, I don't see a problem with adding this one as well - no need for the further arguments about security and sandboxes.

OK. Security isn’t what I’m concerned. I wasn’t clear on the policy side concern than technique issues.

I will do a review and test as soon as possible.

> 
> // Martin
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] Add Mediacodec audio decoders support
  2024-07-23 11:44     ` Zhao Zhili
@ 2024-07-23 13:43       ` Anton Khirnov
  0 siblings, 0 replies; 23+ messages in thread
From: Anton Khirnov @ 2024-07-23 13:43 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Quoting Zhao Zhili (2024-07-23 13:44:37)
> > On Jul 23, 2024, at 19:35, Martin Storsjö <martin@martin.st> wrote:
> > 
> > On Wed, 10 Jul 2024, Zhao Zhili wrote:
> > 
> >> 
> >>> On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
> >>> Hello,
> >>> This patchset adds Mediacodec audio decoders support. Currently, only AAC, AMR,
> >>> MP3, FLAC, VORBIS and OPUS are supported.
> >>> This is mainly useful to avoid shipping Android builds of FFmpeg that are
> >>> subjects to licensing/patents (due to AAC and AMR).
> >> 
> >> I’m not keen on put OS audio decoder/encoder wrapper into FFmpeg. They don’t bring new features, they don’t improve performance. I know these type of wrapper exist in current project, but I’m not sure if it’s a good idea to add more.
> > 
> > I don't see a problem with it. It doesn't add much extra code, we already have MediaCodec interfacing in place, it allows users to set up whichever configuration they want. We have this for other OS codec interfaces as well, I don't see a problem with adding this one as well - no need for the further arguments about security and sandboxes.
> 
> OK. Security isn’t what I’m concerned. I wasn’t clear on the policy side concern than technique issues.
> 
> I will do a review and test as soon as possible.

I don't think we should add wrappers for random decoders just because
they are there, without a good reason. And if the reason here is
patents, then it does not apply to flac, vorbis, or opus.

-- 
Anton Khirnov
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

* Re: [FFmpeg-devel] [PATCH 2/2] avcodec: add Mediacodec audio decoders support
  2024-06-12 13:42 ` [FFmpeg-devel] [PATCH 2/2] avcodec: add Mediacodec audio decoders support Matthieu Bouron
  2024-07-10  8:47   ` Matthieu Bouron
@ 2024-07-28 15:23   ` Zhao Zhili
  1 sibling, 0 replies; 23+ messages in thread
From: Zhao Zhili @ 2024-07-28 15:23 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Matthieu Bouron



> On Jun 12, 2024, at 21:42, Matthieu Bouron <matthieu.bouron@gmail.com> wrote:
> 
> ---
> configure                         |  14 ++
> libavcodec/Makefile               |   7 +
> libavcodec/allcodecs.c            |   7 +
> libavcodec/mediacodecdec.c        | 215 ++++++++++++++++++-
> libavcodec/mediacodecdec_common.c | 333 +++++++++++++++++++++++++++---
> 5 files changed, 545 insertions(+), 31 deletions(-)
> 
> diff --git a/configure b/configure
> index 83284427df..d7de3b73ed 100755
> --- a/configure
> +++ b/configure
> @@ -3321,14 +3321,22 @@ amf_deps_any="libdl LoadLibrary"
> nvenc_deps="ffnvcodec"
> nvenc_deps_any="libdl LoadLibrary"
> 
> +aac_mediacodec_decoder_deps="mediacodec"
> +aac_mediacodec_decoder_select="aac_adtstoasc_bsf aac_parser"
> aac_mf_encoder_deps="mediafoundation"
> ac3_mf_encoder_deps="mediafoundation"
> +amrnb_mediacodec_decoder_deps="mediacodec"
> +amrnb_mediacodec_decoder_select="amr_parser"
> +amrwb_mediacodec_decoder_deps="mediacodec"
> +amrwb_mediacodec_decoder_select="amr_parser"
> av1_cuvid_decoder_deps="cuvid CUVIDAV1PICPARAMS"
> av1_mediacodec_decoder_deps="mediacodec"
> av1_mediacodec_encoder_deps="mediacodec"
> av1_mediacodec_encoder_select="extract_extradata_bsf"
> av1_nvenc_encoder_deps="nvenc NV_ENC_PIC_PARAMS_AV1"
> av1_nvenc_encoder_select="atsc_a53"
> +flac_mediacodec_decoder_deps="mediacodec"
> +flac_mediacodec_decoder_select="flac_parser"
> h263_v4l2m2m_decoder_deps="v4l2_m2m h263_v4l2_m2m"
> h263_v4l2m2m_encoder_deps="v4l2_m2m h263_v4l2_m2m"
> h264_amf_encoder_deps="amf"
> @@ -3377,6 +3385,8 @@ mjpeg_qsv_encoder_select="qsvenc"
> mjpeg_vaapi_encoder_deps="VAEncPictureParameterBufferJPEG"
> mjpeg_vaapi_encoder_select="cbs_jpeg jpegtables vaapi_encode"
> mp3_mf_encoder_deps="mediafoundation"
> +mp3_mediacodec_decoder_deps="mediacodec"
> +mp3_mediacodec_decoder_select="mpegaudioheader"
> mpeg1_cuvid_decoder_deps="cuvid"
> mpeg1_v4l2m2m_decoder_deps="v4l2_m2m mpeg1_v4l2_m2m"
> mpeg2_cuvid_decoder_deps="cuvid"
> @@ -3394,10 +3404,14 @@ mpeg4_mmal_decoder_deps="mmal"
> mpeg4_omx_encoder_deps="omx"
> mpeg4_v4l2m2m_decoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
> mpeg4_v4l2m2m_encoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
> +opus_mediacodec_decoder_deps="mediacodec"
> +opus_mediacodec_decoder_select="opus_parser"
> vc1_cuvid_decoder_deps="cuvid"
> vc1_mmal_decoder_deps="mmal"
> vc1_qsv_decoder_select="qsvdec"
> vc1_v4l2m2m_decoder_deps="v4l2_m2m vc1_v4l2_m2m"
> +vorbis_mediacodec_decoder_deps="mediacodec"
> +vorbis_mediacodec_decoder_select="vorbis_parser"
> vp8_cuvid_decoder_deps="cuvid"
> vp8_mediacodec_decoder_deps="mediacodec"
> vp8_mediacodec_encoder_deps="mediacodec"
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index 1a44352906..64771b9944 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -196,6 +196,7 @@ OBJS-$(CONFIG_AAC_ENCODER)             += aacenc.o aaccoder.o aacenctab.o    \
>                                           aacenc_pred.o \
>                                           psymodel.o kbdwin.o \
>                                           mpeg4audio_sample_rates.o
> +OBJS-$(CONFIG_AAC_MEDIACODEC_DECODER)  += mediacodecdec.o
> OBJS-$(CONFIG_AAC_MF_ENCODER)          += mfenc.o mf_utils.o
> OBJS-$(CONFIG_AASC_DECODER)            += aasc.o msrledec.o
> OBJS-$(CONFIG_AC3_DECODER)             += ac3dec_float.o ac3dec_data.o ac3.o \
> @@ -222,6 +223,8 @@ OBJS-$(CONFIG_AMRWB_DECODER)           += amrwbdec.o celp_filters.o   \
>                                           celp_math.o acelp_filters.o \
>                                           acelp_vectors.o             \
>                                           acelp_pitch_delay.o
> +OBJS-$(CONFIG_AMRNB_MEDIACODEC_DECODER) += mediacodecdec.o
> +OBJS-$(CONFIG_AMRWB_MEDIACODEC_DECODER) += mediacodecdec.o
> OBJS-$(CONFIG_AMV_ENCODER)             += mjpegenc.o mjpegenc_common.o
> OBJS-$(CONFIG_ANM_DECODER)             += anm.o
> OBJS-$(CONFIG_ANULL_DECODER)           += null.o
> @@ -367,6 +370,7 @@ OBJS-$(CONFIG_FIC_DECODER)             += fic.o
> OBJS-$(CONFIG_FITS_DECODER)            += fitsdec.o fits.o
> OBJS-$(CONFIG_FITS_ENCODER)            += fitsenc.o
> OBJS-$(CONFIG_FLAC_DECODER)            += flacdec.o flacdata.o flacdsp.o flac.o
> +OBJS-$(CONFIG_FLAC_MEDIACODEC_DECODER) += mediacodecdec.o
> OBJS-$(CONFIG_FLAC_ENCODER)            += flacenc.o flacdata.o flacencdsp.o
> OBJS-$(CONFIG_FLASHSV_DECODER)         += flashsv.o
> OBJS-$(CONFIG_FLASHSV_ENCODER)         += flashsvenc.o
> @@ -518,6 +522,7 @@ OBJS-$(CONFIG_MP2FIXED_ENCODER)        += mpegaudioenc_fixed.o mpegaudio.o \
>                                           mpegaudiotabs.o
> OBJS-$(CONFIG_MP2FLOAT_DECODER)        += mpegaudiodec_float.o
> OBJS-$(CONFIG_MP3_DECODER)             += mpegaudiodec_fixed.o
> +OBJS-$(CONFIG_MP3_MEDIACODEC_DECODER)  += mediacodecdec.o
> OBJS-$(CONFIG_MP3_MF_ENCODER)          += mfenc.o mf_utils.o
> OBJS-$(CONFIG_MP3ADU_DECODER)          += mpegaudiodec_fixed.o
> OBJS-$(CONFIG_MP3ADUFLOAT_DECODER)     += mpegaudiodec_float.o
> @@ -578,6 +583,7 @@ OBJS-$(CONFIG_OPUS_DECODER)            += opusdec.o opusdec_celt.o opus_celt.o \
>                                           opusdsp.o opus_parse.o opus_rc.o
> OBJS-$(CONFIG_OPUS_ENCODER)            += opusenc.o opusenc_psy.o opus_celt.o \
>                                           opus_pvq.o opus_rc.o opustab.o
> +OBJS-$(CONFIG_OPUS_MEDIACODEC_DECODER) += mediacodecdec.o
> OBJS-$(CONFIG_OSQ_DECODER)             += osq.o
> OBJS-$(CONFIG_PAF_AUDIO_DECODER)       += pafaudio.o
> OBJS-$(CONFIG_PAF_VIDEO_DECODER)       += pafvideo.o
> @@ -765,6 +771,7 @@ OBJS-$(CONFIG_VORBIS_DECODER)          += vorbisdec.o vorbisdsp.o vorbis.o \
>                                           vorbis_data.o
> OBJS-$(CONFIG_VORBIS_ENCODER)          += vorbisenc.o vorbis.o \
>                                           vorbis_data.o
> +OBJS-$(CONFIG_VORBIS_MEDIACODEC_DECODER) += mediacodecdec.o
> OBJS-$(CONFIG_VP3_DECODER)             += vp3.o jpegquanttables.o
> OBJS-$(CONFIG_VP5_DECODER)             += vp5.o vp56.o vp56data.o vpx_rac.o
> OBJS-$(CONFIG_VP6_DECODER)             += vp6.o vp56.o vp56data.o \
> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> index b102a8069e..e5ab657ef6 100644
> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -821,8 +821,11 @@ extern const FFCodec ff_idf_decoder;
> 
> /* external libraries, that shouldn't be used by default if one of the
>  * above is available */
> +extern const FFCodec ff_aac_mediacodec_decoder;
> extern const FFCodec ff_aac_mf_encoder;
> extern const FFCodec ff_ac3_mf_encoder;
> +extern const FFCodec ff_amrnb_mediacodec_decoder;
> +extern const FFCodec ff_amrwb_mediacodec_decoder;
> extern const FFCodec ff_h263_v4l2m2m_encoder;
> extern const FFCodec ff_libaom_av1_decoder;
> /* hwaccel hooks only, so prefer external decoders */
> @@ -835,6 +838,7 @@ extern const FFCodec ff_av1_qsv_decoder;
> extern const FFCodec ff_av1_qsv_encoder;
> extern const FFCodec ff_av1_amf_encoder;
> extern const FFCodec ff_av1_vaapi_encoder;
> +extern const FFCodec ff_flac_mediacodec_decoder;
> extern const FFCodec ff_libopenh264_encoder;
> extern const FFCodec ff_libopenh264_decoder;
> extern const FFCodec ff_h264_amf_encoder;
> @@ -861,6 +865,7 @@ extern const FFCodec ff_mjpeg_cuvid_decoder;
> extern const FFCodec ff_mjpeg_qsv_encoder;
> extern const FFCodec ff_mjpeg_qsv_decoder;
> extern const FFCodec ff_mjpeg_vaapi_encoder;
> +extern const FFCodec ff_mp3_mediacodec_decoder;
> extern const FFCodec ff_mp3_mf_encoder;
> extern const FFCodec ff_mpeg1_cuvid_decoder;
> extern const FFCodec ff_mpeg2_cuvid_decoder;
> @@ -871,8 +876,10 @@ extern const FFCodec ff_mpeg4_mediacodec_decoder;
> extern const FFCodec ff_mpeg4_mediacodec_encoder;
> extern const FFCodec ff_mpeg4_omx_encoder;
> extern const FFCodec ff_mpeg4_v4l2m2m_encoder;
> +extern const FFCodec ff_opus_mediacodec_decoder;
> extern const FFCodec ff_prores_videotoolbox_encoder;
> extern const FFCodec ff_vc1_cuvid_decoder;
> +extern const FFCodec ff_vorbis_mediacodec_decoder;
> extern const FFCodec ff_vp8_cuvid_decoder;
> extern const FFCodec ff_vp8_mediacodec_decoder;
> extern const FFCodec ff_vp8_mediacodec_encoder;
> diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c
> index 6d8dc600fe..dabf71cc04 100644
> --- a/libavcodec/mediacodecdec.c
> +++ b/libavcodec/mediacodecdec.c
> @@ -36,6 +36,7 @@
> #include "avcodec.h"
> #include "codec_internal.h"
> #include "decode.h"
> +#include "flac_parse.h"
> #include "h264_parse.h"
> #include "h264_ps.h"
> #include "hevc/parse.h"
> @@ -44,6 +45,7 @@
> #include "jni.h"
> #include "mediacodec_wrapper.h"
> #include "mediacodecdec_common.h"
> +#include "xiph.h"
> 
> typedef struct MediaCodecH264DecContext {
> 
> @@ -287,11 +289,87 @@ done:
> }
> #endif
> 
> +#if CONFIG_FLAC_MEDIACODEC_DECODER
> +static int flac_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
> +{
> +    uint8_t *streaminfo;
> +    uint8_t buffer[42];
> +
> +    if (!avctx->extradata) {
> +        return 0;
> +    }

It seems extradata is required for FLAC decoding, so here should return an error code.
Don't use braces here for coding style.

> +
> +    if (!ff_flac_is_extradata_valid(avctx, &streaminfo))
> +        return AVERROR_INVALIDDATA;
> +
> +    buffer[0] = 'f';
> +    buffer[1] = 'L';
> +    buffer[2] = 'a';
> +    buffer[3] = 'C';
> +    buffer[4] = 0x80;
> +    buffer[5] = 0;
> +    buffer[6] = 0;
> +    buffer[7] = 0x22;
> +    memcpy(buffer + 8, streaminfo, 34);
> +
> +    /* csd-0: fLaC + streaminfo */
> +    ff_AMediaFormat_setBuffer(format, "csd-0", buffer, 42);
> +
> +    return 0;
> +}
> +#endif
> +
> +#if CONFIG_OPUS_MEDIACODEC_DECODER
> +static int opus_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
> +{
> +    if (!avctx->extradata_size) {
> +        return 0;
> +    }

Ditto. 

> +
> +    if (avctx->extradata_size < 19) {
> +        return AVERROR_INVALIDDATA;
> +    }
> +
> +    ff_AMediaFormat_setBuffer(format, "csd-0", avctx->extradata, 19);
> +
> +    return 0;
> +}
> +#endif

Not sure why assert failure

./ffmpeg_g -c:a opus_mediacodec -i /sdcard/opus.mp4 -f null -

[opus_mediacodec @ 0xb4000070239c9650] MediaCodec started successfully: codec = c2.android.opus.decoder, ret = 0
Stream mapping:
  Stream #0:0 -> #0:0 (opus (opus_mediacodec) -> pcm_s16le (native))
Press [q] to stop, [?] for help
[opus_mediacodec @ 0xb4000070239c9650] Output MediaFormat changed to channel-count: int32(2), mime: string(audio/raw), sample-rate: int32(48000), android._config-pcm-encoding: int32(2)}
[opus_mediacodec @ 0xb4000070239c9650] Output parameters channel-count=2 channel-layout=0 sample-rate=48000
Assertion pkt failed at src/fftools/ffmpeg_dec.c:726
Aborted


> +
> +#if CONFIG_VORBIS_MEDIACODEC_DECODER
> +static int vorbis_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
> +{
> +    int ret;
> +    const uint8_t *header_start[3];
> +    int header_len[3];
> +
> +    if (!avctx->extradata) {
> +        return 0;
> +    }
> +
> +    ret = avpriv_split_xiph_headers(avctx->extradata, avctx->extradata_size, 30, header_start, header_len);
> +    if (ret < 0) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not parse extradata\n");
> +        return ret;
> +    }
> +
> +    /* csd-0: identification header, csd-1: setup header */
> +    ff_AMediaFormat_setBuffer(format, "csd-0", header_start[0], header_len[0]);
> +    ff_AMediaFormat_setBuffer(format, "csd-1", header_start[2], header_len[2]);
> +
> +    return 0;
> +}
> +#endif
> +
> #if CONFIG_MPEG2_MEDIACODEC_DECODER || \
>     CONFIG_MPEG4_MEDIACODEC_DECODER || \
>     CONFIG_VP8_MEDIACODEC_DECODER   || \
>     CONFIG_VP9_MEDIACODEC_DECODER   || \
> -    CONFIG_AV1_MEDIACODEC_DECODER
> +    CONFIG_AV1_MEDIACODEC_DECODER   || \
> +    CONFIG_AAC_MEDIACODEC_DECODER   || \
> +    CONFIG_AMRNB_MEDIACODEC_DECODER || \
> +    CONFIG_AMRWB_MEDIACODEC_DECODER || \
> +    CONFIG_MP3_MEDIACODEC_DECODER
> static int common_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
> {
>     int ret = 0;
> @@ -387,14 +465,83 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
>         if (ret < 0)
>             goto done;
>         break;
> +#endif
> +#if CONFIG_AAC_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_AAC:
> +        codec_mime = "audio/mp4a-latm";
> +
> +        ret = common_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_AMRNB_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_AMR_NB:
> +        codec_mime = "audio/3gpp";
> +
> +        ret = common_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_AMRWB_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_AMR_WB:
> +        codec_mime = "audio/amr-wb";
> +
> +        ret = common_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_FLAC_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_FLAC:
> +        codec_mime = "audio/flac";
> +
> +        ret = flac_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_MP3_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_MP3:
> +        codec_mime = "audio/mpeg";
> +
> +        ret = common_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_OPUS_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_OPUS:
> +        codec_mime = "audio/opus";
> +
> +        ret = opus_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> +#endif
> +#if CONFIG_VORBIS_MEDIACODEC_DECODER
> +    case AV_CODEC_ID_VORBIS:
> +        codec_mime = "audio/vorbis";
> +
> +        ret = vorbis_set_extradata(avctx, format);
> +        if (ret < 0)
> +            goto done;
> +        break;
> #endif
>     default:
>         av_assert0(0);
>     }
> 
>     ff_AMediaFormat_setString(format, "mime", codec_mime);
> -    ff_AMediaFormat_setInt32(format, "width", avctx->width);
> -    ff_AMediaFormat_setInt32(format, "height", avctx->height);
> +
> +    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
> +        ff_AMediaFormat_setInt32(format, "width", avctx->width);
> +        ff_AMediaFormat_setInt32(format, "height", avctx->height);
> +    } else {
> +        ff_AMediaFormat_setInt32(format, "channel-count", avctx->ch_layout.nb_channels);
> +        ff_AMediaFormat_setInt32(format, "sample-rate", avctx->sample_rate);
> +    }
> 
>     s->ctx = av_mallocz(sizeof(*s->ctx));
>     if (!s->ctx) {
> @@ -611,3 +758,65 @@ DECLARE_MEDIACODEC_VDEC(vp9, "VP9", AV_CODEC_ID_VP9, NULL)
> #if CONFIG_AV1_MEDIACODEC_DECODER
> DECLARE_MEDIACODEC_VDEC(av1, "AV1", AV_CODEC_ID_AV1, NULL)
> #endif
> +
> +#define AD AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM
> +static const AVOption ff_mediacodec_adec_options[] = {
> +    { "ndk_codec", "Use MediaCodec from NDK",
> +                   OFFSET(use_ndk_codec), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, AD },
> +    { NULL }
> +};
> +
> +#define DECLARE_MEDIACODEC_ACLASS(short_name)                   \
> +static const AVClass ff_##short_name##_mediacodec_dec_class = { \
> +    .class_name = #short_name "_mediacodec",                    \
> +    .item_name  = av_default_item_name,                         \
> +    .option     = ff_mediacodec_adec_options,                   \
> +    .version    = LIBAVUTIL_VERSION_INT,                        \
> +};
> +
> +#define DECLARE_MEDIACODEC_ADEC(short_name, full_name, codec_id, bsf)                          \
> +DECLARE_MEDIACODEC_VCLASS(short_name)                                                          \
> +const FFCodec ff_ ## short_name ## _mediacodec_decoder = {                                     \
> +    .p.name         = #short_name "_mediacodec",                                               \
> +    CODEC_LONG_NAME(full_name " Android MediaCodec decoder"),                                  \
> +    .p.type         = AVMEDIA_TYPE_AUDIO,                                                      \
> +    .p.id           = codec_id,                                                                \
> +    .p.priv_class   = &ff_##short_name##_mediacodec_dec_class,                                 \
> +    .priv_data_size = sizeof(MediaCodecH264DecContext),                                        \
> +    .init           = mediacodec_decode_init,                                                  \
> +    FF_CODEC_RECEIVE_FRAME_CB(mediacodec_receive_frame),                                       \
> +    .flush          = mediacodec_decode_flush,                                                 \
> +    .close          = mediacodec_decode_close,                                                 \
> +    .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE,                              \
> +    .caps_internal  = FF_CODEC_CAP_NOT_INIT_THREADSAFE,                                        \
> +    .bsfs           = bsf,                                                                     \
> +    .p.wrapper_name = "mediacodec",                                                            \
> +};                                                                                             \
> +
> +#if CONFIG_AAC_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(aac, "AAC", AV_CODEC_ID_AAC, "aac_adtstoasc")
> +#endif
> +
> +#if CONFIG_AMRNB_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(amrnb, "AMR-NB", AV_CODEC_ID_AMR_NB, NULL)
> +#endif
> +
> +#if CONFIG_AMRWB_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(amrwb, "AMR-WB", AV_CODEC_ID_AMR_WB, NULL)
> +#endif
> +
> +#if CONFIG_FLAC_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(flac, "FLAC", AV_CODEC_ID_FLAC, NULL)
> +#endif
> +
> +#if CONFIG_MP3_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(mp3, "MP3", AV_CODEC_ID_MP3, NULL)
> +#endif
> +
> +#if CONFIG_OPUS_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(opus, "OPUS", AV_CODEC_ID_OPUS, NULL)
> +#endif
> +
> +#if CONFIG_VORBIS_MEDIACODEC_DECODER
> +DECLARE_MEDIACODEC_ADEC(vorbis, "VORBIS", AV_CODEC_ID_VORBIS, NULL)
> +#endif
> diff --git a/libavcodec/mediacodecdec_common.c b/libavcodec/mediacodecdec_common.c
> index 4d22db8ecf..4bdd0128c2 100644
> --- a/libavcodec/mediacodecdec_common.c
> +++ b/libavcodec/mediacodecdec_common.c
> @@ -23,6 +23,7 @@
> #include <string.h>
> #include <sys/types.h>
> 
> +#include "libavutil/avassert.h"
> #include "libavutil/common.h"
> #include "libavutil/hwcontext_mediacodec.h"
> #include "libavutil/mem.h"
> @@ -30,6 +31,7 @@
> #include "libavutil/pixfmt.h"
> #include "libavutil/time.h"
> #include "libavutil/timestamp.h"
> +#include "libavutil/channel_layout.h"
> 
> #include "avcodec.h"
> #include "decode.h"
> @@ -85,6 +87,110 @@
> #define OUTPUT_DEQUEUE_TIMEOUT_US 8000
> #define OUTPUT_DEQUEUE_BLOCK_TIMEOUT_US 1000000
> 
> +enum {
> +    ENCODING_PCM_16BIT        = 0x00000002,
> +    ENCODING_PCM_8BIT         = 0x00000003,
> +    ENCODING_PCM_FLOAT        = 0x00000004,
> +    ENCODING_PCM_24BIT_PACKED = 0x00000015,
> +    ENCODING_PCM_32BIT        = 0x00000016,
> +};
> +
> +static const struct {
> +
> +    int pcm_format;
> +    enum AVSampleFormat sample_format;
> +
> +} sample_formats[] = {
> +
> +    { ENCODING_PCM_16BIT,        AV_SAMPLE_FMT_S16 },
> +    { ENCODING_PCM_8BIT,         AV_SAMPLE_FMT_U8  },
> +    { ENCODING_PCM_FLOAT,        AV_SAMPLE_FMT_FLT },
> +    { ENCODING_PCM_24BIT_PACKED, AV_SAMPLE_FMT_S32 },
> +    { ENCODING_PCM_32BIT,        AV_SAMPLE_FMT_S32 },
> +    { 0 }
> +};
> +
> +static enum AVSampleFormat mcdec_map_pcm_format(AVCodecContext *avctx,
> +                                               MediaCodecDecContext *s,
> +                                               int pcm_format)
> +{
> +    int i;
> +    enum AVSampleFormat ret = AV_SAMPLE_FMT_NONE;
> +
> +    for (i = 0; i < FF_ARRAY_ELEMS(sample_formats); i++) {

for (int i = 0;

> +        if (sample_formats[i].pcm_format == pcm_format) {
> +            return sample_formats[i].sample_format;
> +        }
> +    }
> +
> +    av_log(avctx, AV_LOG_ERROR, "Output sample format 0x%x (value=%d) is not supported\n",
> +           pcm_format, pcm_format);
> +
> +    return ret;
> +}
> +
> +enum
> +{
> +  CHANNEL_OUT_FRONT_LEFT                 = 0x4,
> +  CHANNEL_OUT_FRONT_RIGHT                = 0x8,
> +  CHANNEL_OUT_FRONT_CENTER               = 0x10,
> +  CHANNEL_OUT_LOW_FREQUENCY              = 0x20,
> +  CHANNEL_OUT_BACK_LEFT                  = 0x40,
> +  CHANNEL_OUT_BACK_RIGHT                 = 0x80,
> +  CHANNEL_OUT_FRONT_LEFT_OF_CENTER       = 0x100,
> +  CHANNEL_OUT_FRONT_RIGHT_OF_CENTER      = 0x200,
> +  CHANNEL_OUT_BACK_CENTER                = 0x400,
> +  CHANNEL_OUT_SIDE_LEFT                  = 0x800,
> +  CHANNEL_OUT_SIDE_RIGHT                 = 0x1000,
> +  CHANNEL_OUT_TOP_CENTER                 = 0x2000,
> +  CHANNEL_OUT_TOP_FRONT_LEFT             = 0x4000,
> +  CHANNEL_OUT_TOP_FRONT_CENTER           = 0x8000,
> +  CHANNEL_OUT_TOP_FRONT_RIGHT            = 0x10000,
> +  CHANNEL_OUT_TOP_BACK_LEFT              = 0x20000,
> +  CHANNEL_OUT_TOP_BACK_CENTER            = 0x40000,
> +  CHANNEL_OUT_TOP_BACK_RIGHT             = 0x80000,
> +};
> +
> +static const struct {
> +
> +    int mask;
> +    uint64_t layout;
> +
> +} channel_masks[] = {
> +    { CHANNEL_OUT_FRONT_LEFT,            AV_CH_FRONT_LEFT },
> +    { CHANNEL_OUT_FRONT_RIGHT,           AV_CH_FRONT_RIGHT },
> +    { CHANNEL_OUT_FRONT_CENTER,          AV_CH_FRONT_CENTER },
> +    { CHANNEL_OUT_LOW_FREQUENCY,         AV_CH_LOW_FREQUENCY },
> +    { CHANNEL_OUT_BACK_LEFT,             AV_CH_BACK_LEFT },
> +    { CHANNEL_OUT_BACK_RIGHT,            AV_CH_BACK_RIGHT },
> +    { CHANNEL_OUT_FRONT_LEFT_OF_CENTER,  AV_CH_FRONT_LEFT_OF_CENTER },
> +    { CHANNEL_OUT_FRONT_RIGHT_OF_CENTER, AV_CH_FRONT_RIGHT_OF_CENTER },
> +    { CHANNEL_OUT_BACK_CENTER,           AV_CH_BACK_CENTER },
> +    { CHANNEL_OUT_SIDE_LEFT,             AV_CH_SIDE_LEFT },
> +    { CHANNEL_OUT_SIDE_RIGHT,            AV_CH_SIDE_RIGHT },
> +    { CHANNEL_OUT_TOP_CENTER,            AV_CH_TOP_CENTER },
> +    { CHANNEL_OUT_TOP_FRONT_LEFT,        AV_CH_TOP_FRONT_LEFT },
> +    { CHANNEL_OUT_TOP_FRONT_CENTER,      AV_CH_TOP_FRONT_CENTER },
> +    { CHANNEL_OUT_TOP_FRONT_RIGHT,       AV_CH_TOP_FRONT_RIGHT },
> +    { CHANNEL_OUT_TOP_BACK_LEFT,         AV_CH_TOP_BACK_LEFT },
> +    { CHANNEL_OUT_TOP_BACK_CENTER,       AV_CH_TOP_BACK_CENTER },
> +    { CHANNEL_OUT_TOP_BACK_RIGHT,        AV_CH_TOP_BACK_RIGHT },
> +};

Two space indents?

> +
> +static uint64_t mcdec_map_channel_mask(AVCodecContext *avctx,
> +                                       int channel_mask)
> +{
> +    int i;
> +    uint64_t channel_layout = 0;
> +
> +    for (i = 0; i < FF_ARRAY_ELEMS(channel_masks); i++) {
> +        if (channel_mask & channel_masks[i].mask)
> +            channel_layout |= channel_masks[i].layout;
> +    }
> +
> +    return channel_layout;
> +}
> +
> enum {
>     COLOR_FormatYUV420Planar                              = 0x13,
>     COLOR_FormatYUV420SemiPlanar                          = 0x15,
> @@ -265,13 +371,77 @@ fail:
>     return ret;
> }
> 
> -static int mediacodec_wrap_sw_buffer(AVCodecContext *avctx,
> -                                  MediaCodecDecContext *s,
> -                                  uint8_t *data,
> -                                  size_t size,
> -                                  ssize_t index,
> -                                  FFAMediaCodecBufferInfo *info,
> -                                  AVFrame *frame)
> +static int mediacodec_wrap_sw_audio_buffer(AVCodecContext *avctx,
> +                                           MediaCodecDecContext *s,
> +                                           uint8_t *data,
> +                                           size_t size,
> +                                           ssize_t index,
> +                                           FFAMediaCodecBufferInfo *info,
> +                                           AVFrame *frame)
> +{
> +    int ret = 0;
> +    int status = 0;
> +    const int sample_size = av_get_bytes_per_sample(avctx->sample_fmt);
> +    if (!sample_size) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not get bytes per sample\n");
> +        goto done;

ret is 0 on error path.

> +    }
> +
> +    frame->format = avctx->sample_fmt;
> +    frame->sample_rate = avctx->sample_rate;
> +    frame->nb_samples = info->size / (sample_size * avctx->ch_layout.nb_channels);

Is this right for ENCODING_PCM_24BIT_PACKED?

> +
> +    ret = av_channel_layout_copy(&frame->ch_layout, &avctx->ch_layout);
> +    if (ret < 0) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not copy channel layout\n");
> +        goto done;
> +    }
> +
> +    /* MediaCodec buffers needs to be copied to our own refcounted buffers
> +     * because the flush command invalidates all input and output buffers.
> +     */
> +    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
> +        av_log(avctx, AV_LOG_ERROR, "Could not allocate buffer\n");
> +        goto done;
> +    }
> +
> +    /* Override frame->pts as ff_get_buffer will override its value based
> +     * on the last avpacket received which is not in sync with the frame:
> +     *   * N avpackets can be pushed before 1 frame is actually returned
> +     *   * 0-sized avpackets are pushed to flush remaining frames at EOS */
> +    if (avctx->pkt_timebase.num && avctx->pkt_timebase.den) {
> +        frame->pts = av_rescale_q(info->presentationTimeUs,
> +                                      AV_TIME_BASE_Q,
> +                                      avctx->pkt_timebase);
> +    } else {
> +        frame->pts = info->presentationTimeUs;
> +    }
> +    frame->pkt_dts = AV_NOPTS_VALUE;
> +
> +    av_log(avctx, AV_LOG_TRACE,
> +           "Frame: format=%d channels=%d sample_rate=%d nb_samples=%d",
> +           avctx->sample_fmt, avctx->ch_layout.nb_channels, avctx->sample_rate, frame->nb_samples);
> +
> +    memcpy(frame->data[0], data, info->size);
> +
> +    ret = 0;
> +done:
> +    status = ff_AMediaCodec_releaseOutputBuffer(s->codec, index, 0);
> +    if (status < 0) {
> +        av_log(avctx, AV_LOG_ERROR, "Failed to release output buffer\n");
> +        ret = AVERROR_EXTERNAL;
> +    }
> +
> +    return ret;
> +}
> +
> +static int mediacodec_wrap_sw_video_buffer(AVCodecContext *avctx,
> +                                           MediaCodecDecContext *s,
> +                                           uint8_t *data,
> +                                           size_t size,
> +                                           ssize_t index,
> +                                           FFAMediaCodecBufferInfo *info,
> +                                           AVFrame *frame)
> {
>     int ret = 0;
>     int status = 0;
> @@ -343,6 +513,22 @@ done:
>     return ret;
> }
> 
> +static int mediacodec_wrap_sw_buffer(AVCodecContext *avctx,
> +                                     MediaCodecDecContext *s,
> +                                     uint8_t *data,
> +                                     size_t size,
> +                                     ssize_t index,
> +                                     FFAMediaCodecBufferInfo *info,
> +                                     AVFrame *frame)
> +{
> +    if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
> +        return mediacodec_wrap_sw_audio_buffer(avctx, s, data, size, index, info, frame);
> +    else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
> +        return mediacodec_wrap_sw_video_buffer(avctx, s, data, size, index, info, frame);
> +    else
> +        av_assert0(0);
> +}
> +
> #define AMEDIAFORMAT_GET_INT32(name, key, mandatory) do {                              \
>     int32_t value = 0;                                                                 \
>     if (ff_AMediaFormat_getInt32(s->format, key, &value)) {                            \
> @@ -354,7 +540,7 @@ done:
>     }                                                                                  \
> } while (0)                                                                            \
> 
> -static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecContext *s)
> +static int mediacodec_dec_parse_video_format(AVCodecContext *avctx, MediaCodecDecContext *s)
> {
>     int ret = 0;
>     int width = 0;
> @@ -463,6 +649,63 @@ fail:
>     return ret;
> }
> 
> +static int mediacodec_dec_parse_audio_format(AVCodecContext *avctx, MediaCodecDecContext *s)
> +{
> +    int ret = 0;
> +    int sample_rate = 0;
> +    int channel_count = 0;
> +    int channel_mask = 0;
> +    int pcm_encoding = 0;
> +    char *format = NULL;
> +
> +    if (!s->format) {
> +        av_log(avctx, AV_LOG_ERROR, "Output MediaFormat is not set\n");
> +        return AVERROR(EINVAL);
> +    }
> +
> +    format = ff_AMediaFormat_toString(s->format);
> +    if (!format) {
> +        return AVERROR_EXTERNAL;
> +    }
> +    av_log(avctx, AV_LOG_DEBUG, "Parsing MediaFormat %s\n", format);
> +
> +    /* Mandatory fields */
> +    AMEDIAFORMAT_GET_INT32(channel_count, "channel-count", 1);
> +    AMEDIAFORMAT_GET_INT32(sample_rate,   "sample-rate",   1);
> +
> +    AMEDIAFORMAT_GET_INT32(pcm_encoding, "pcm-encoding", 0);
> +    if (pcm_encoding)
> +        avctx->sample_fmt  = mcdec_map_pcm_format(avctx, s, pcm_encoding);
> +    else
> +        avctx->sample_fmt = AV_SAMPLE_FMT_S16;
> +
> +    avctx->sample_rate = sample_rate;
> +
> +    AMEDIAFORMAT_GET_INT32(channel_mask, "channel-mask", 0);
> +    if (channel_mask)
> +        av_channel_layout_from_mask(&avctx->ch_layout, mcdec_map_channel_mask(avctx, channel_mask));
> +    else
> +        av_channel_layout_default(&avctx->ch_layout, channel_count);
> +
> +    av_log(avctx, AV_LOG_INFO,
> +        "Output parameters channel-count=%d channel-layout=%x sample-rate=%d\n",
> +        channel_count, channel_mask, sample_rate);
> +
> +fail:
> +    av_freep(&format);
> +    return ret;
> +}
> +
> +static int mediacodec_dec_parse_format(AVCodecContext *avctx, MediaCodecDecContext *s)
> +{
> +    if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
> +        return mediacodec_dec_parse_audio_format(avctx, s);
> +    else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
> +        return mediacodec_dec_parse_video_format(avctx, s);
> +    else
> +        av_assert0(0);
> +}
> +
> static int mediacodec_dec_flush_codec(AVCodecContext *avctx, MediaCodecDecContext *s)
> {
>     FFAMediaCodec *codec = s->codec;
> @@ -486,11 +729,9 @@ static int mediacodec_dec_flush_codec(AVCodecContext *avctx, MediaCodecDecContex
>     return 0;
> }
> 
> -int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
> -                           const char *mime, FFAMediaFormat *format)
> +static int mediacodec_dec_get_video_codec(AVCodecContext *avctx, MediaCodecDecContext *s,
> +                                          const char *mime, FFAMediaFormat *format)
> {
> -    int ret = 0;
> -    int status;
>     int profile;
> 
>     enum AVPixelFormat pix_fmt;
> @@ -499,12 +740,6 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
>         AV_PIX_FMT_NONE,
>     };
> 
> -    s->avctx = avctx;
> -    atomic_init(&s->refcount, 1);
> -    atomic_init(&s->hw_buffer_count, 0);
> -    atomic_init(&s->serial, 1);
> -    s->current_input_buffer = -1;
> -
>     pix_fmt = ff_get_format(avctx, pix_fmts);
>     if (pix_fmt == AV_PIX_FMT_MEDIACODEC) {
>         AVMediaCodecContext *user_ctx = avctx->hwaccel_context;
> @@ -536,8 +771,7 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
>         // getCodecNameByType() can fail due to missing JVM, while NDK
>         // mediacodec can be used without JVM.
>         if (!s->use_ndk_codec) {
> -            ret = AVERROR_EXTERNAL;
> -            goto fail;
> +            return AVERROR_EXTERNAL;
>         }
>         av_log(avctx, AV_LOG_INFO, "Failed to getCodecNameByType\n");
>     } else {
> @@ -556,10 +790,51 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
>     }
>     if (!s->codec) {
>         av_log(avctx, AV_LOG_ERROR, "Failed to create media decoder for type %s and name %s\n", mime, s->codec_name);
> -        ret = AVERROR_EXTERNAL;
> -        goto fail;
> +        return AVERROR_EXTERNAL;
> +    }
> +
> +    return 0;
> +}
> +
> +static int mediacodec_dec_get_audio_codec(AVCodecContext *avctx, MediaCodecDecContext *s,
> +                                          const char *mime, FFAMediaFormat *format)
> +{
> +    s->codec = ff_AMediaCodec_createDecoderByType(mime, s->use_ndk_codec);
> +    if (!s->codec) {
> +        av_log(avctx, AV_LOG_ERROR, "Failed to create media decoder for mime %s\n", mime);
> +        return AVERROR_EXTERNAL;
> +    }
> +
> +    s->codec_name = ff_AMediaCodec_getName(s->codec);
> +    if (!s->codec_name) {
> +        av_log(avctx, AV_LOG_ERROR, "Failed to get codec name");
> +        return AVERROR_EXTERNAL;
>     }

getName failure isn't a fatal error and can happen without JVM.

> 
> +    return 0;
> +}
> +
> +int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
> +                           const char *mime, FFAMediaFormat *format)
> +{
> +    int ret;
> +    int status;
> +
> +    s->avctx = avctx;
> +    atomic_init(&s->refcount, 1);
> +    atomic_init(&s->hw_buffer_count, 0);
> +    atomic_init(&s->serial, 1);
> +    s->current_input_buffer = -1;
> +
> +    if (avctx->codec_type == AVMEDIA_TYPE_AUDIO)
> +        ret = mediacodec_dec_get_audio_codec(avctx, s, mime, format);
> +    else if (avctx->codec_type == AVMEDIA_TYPE_VIDEO)
> +        ret = mediacodec_dec_get_video_codec(avctx, s, mime, format);
> +    else
> +        av_assert0(0);
> +    if (ret < 0)
> +        goto fail;
> +
>     status = ff_AMediaCodec_configure(s->codec, format, s->surface, NULL, 0);
>     if (status < 0) {
>         char *desc = ff_AMediaFormat_toString(format);
> @@ -583,12 +858,14 @@ int ff_mediacodec_dec_init(AVCodecContext *avctx, MediaCodecDecContext *s,
>         goto fail;
>     }
> 
> -    s->format = ff_AMediaCodec_getOutputFormat(s->codec);
> -    if (s->format) {
> -        if ((ret = mediacodec_dec_parse_format(avctx, s)) < 0) {
> -            av_log(avctx, AV_LOG_ERROR,
> -                "Failed to configure context\n");
> -            goto fail;
> +    if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
> +        s->format = ff_AMediaCodec_getOutputFormat(s->codec);
> +        if (s->format) {
> +            if ((ret = mediacodec_dec_parse_format(avctx, s)) < 0) {
> +                av_log(avctx, AV_LOG_ERROR,
> +                    "Failed to configure context\n");
> +                goto fail;
> +            }
>         }
>     }
> 
> -- 
> 2.45.2
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2024-07-28 15:24 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-12 13:42 [FFmpeg-devel] Add Mediacodec audio decoders support Matthieu Bouron
2024-06-12 13:42 ` [FFmpeg-devel] [PATCH 1/2] avcodec/mediacodecdec_common: ensure input buffer timestamp is positive Matthieu Bouron
2024-06-12 13:42 ` [FFmpeg-devel] [PATCH 2/2] avcodec: add Mediacodec audio decoders support Matthieu Bouron
2024-07-10  8:47   ` Matthieu Bouron
2024-07-28 15:23   ` Zhao Zhili
2024-06-12 14:00 ` [FFmpeg-devel] Add " Paul B Mahol
2024-07-10 13:54 ` Zhao Zhili
2024-07-10 16:31   ` Matthieu Bouron
2024-07-16 13:20     ` Matthieu Bouron
2024-07-16 14:58       ` Zhao Zhili
     [not found]         ` <2009DBEE-686A-42F6-A5DF-35147272EEF0@cosmin.at>
2024-07-16 15:48           ` Cosmin Stejerean via ffmpeg-devel
2024-07-16 16:04             ` Zhao Zhili
     [not found]               ` <057FD6DF-E71C-49D0-8D11-7A7E4D5FB5CC@cosmin.at>
2024-07-16 16:42                 ` Cosmin Stejerean via ffmpeg-devel
2024-07-16 18:24             ` Rémi Denis-Courmont
     [not found]               ` <205EB89E-F6F9-438D-A9BC-E76E5439C7C7@cosmin.at>
2024-07-16 20:14                 ` Cosmin Stejerean via ffmpeg-devel
2024-07-17  9:38                   ` Anton Khirnov
2024-07-17 12:19                     ` Michael Niedermayer
2024-07-19 19:59                     ` Martin Storsjö
2024-07-17 15:39             ` Paul B Mahol
     [not found]               ` <4F1B9768-96C8-4708-92ED-AC8E1C9FC46F@cosmin.at>
2024-07-17 17:35                 ` Cosmin Stejerean via ffmpeg-devel
2024-07-23 11:35   ` Martin Storsjö
2024-07-23 11:44     ` Zhao Zhili
2024-07-23 13:43       ` Anton Khirnov

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git