tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mdom/media/platforms/ffmpeg/FFmpegAudioDecoder.cpp | 9++++++++-
Mdom/media/platforms/ffmpeg/FFmpegDataDecoder.cpp | 13+++++++++++++
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);