commit 796180247bf513afbe0d57e6a1b03b9a4e5371fe
parent b5d716fe36cf90098c9c53ac4a7f348899655d46
Author: Andrew Osmond <aosmond@gmail.com>
Date: Thu, 4 Dec 2025 19:57:53 +0000
Bug 2004119 - Add support for ffmpeg audio decryption for EME playback on Android. r=media-playback-reviewers,jolin
This also adds a check to make sure that we don't attempt to use our
remote CDM plumbing with non-MediaCodec software decoders. The current
integration relies upon AMediaCodec_queueSecureInputBuffer, and the
software decoders would require us to integrate with AMediaDrm_decrypt.
Differential Revision: https://phabricator.services.mozilla.com/D275105
Diffstat:
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp
@@ -119,7 +119,7 @@ RefPtr<MediaDataDecoder::InitPromise> FFmpegAudioDecoder<LIBAV_VER>::Init() {
}
MediaResult rv(NS_ERROR_NOT_AVAILABLE);
-#ifdef MOZ_WIDGET_ANDROID
+#if defined(MOZ_WIDGET_ANDROID) && defined(USING_MOZFFVPX)
if (XRE_IsRDDProcess() || XRE_IsUtilityProcess()) {
AVCodec* codec = FindHardwareAVCodec(mLib, mCodecID, AV_HWDEVICE_TYPE_NONE);
if (codec) {
@@ -437,6 +437,13 @@ MediaResult FFmpegAudioDecoder<LIBAV_VER>::DoDecode(MediaRawData* aSample,
mLib->av_init_packet(packet);
#endif
+#if defined(MOZ_WIDGET_ANDROID) && defined(USING_MOZFFVPX)
+ MediaResult ret = MaybeAttachCryptoInfo(aSample, packet);
+ if (NS_FAILED(ret)) {
+ return ret;
+ }
+#endif
+
FFMPEG_LOG("FFmpegAudioDecoder::DoDecode: %d bytes, [%s,%s] (Duration: %s)",
aSize, aSample->mTime.ToString().get(),
aSample->GetEndTime().ToString().get(),
diff --git a/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp
@@ -161,6 +161,11 @@ MediaResult FFmpegDataDecoder<LIBAV_VER>::MaybeAttachCDM() {
return NS_OK;
}
+ if (!(mCodecContext->codec->capabilities & AV_CODEC_CAP_HARDWARE)) {
+ return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
+ RESULT_DETAIL("CDM requires MediaCodec decoder"));
+ }
+
mCrypto = mCDM->GetCrypto();
if (NS_WARN_IF(!mCrypto)) {
return MediaResult(NS_ERROR_DOM_MEDIA_FATAL_ERR,
@@ -224,6 +229,14 @@ MediaResult FFmpegDataDecoder<LIBAV_VER>::InitDecoder(AVCodec* aCodec,
}
#endif
+#if defined(MOZ_WIDGET_ANDROID) && defined(USING_MOZFFVPX)
+ ret = MaybeAttachCDM();
+ if (NS_FAILED(ret)) {
+ ReleaseCodecContext();
+ return ret;
+ }
+#endif
+
if (mLib->avcodec_open2(mCodecContext, aCodec, aOptions) < 0) {
ReleaseCodecContext();
FFMPEG_LOG(" Couldn't open avcodec for %s", aCodec->name);