forked from mirrors/gecko-dev
Backed out changeset f2113c9b661f (bug1817997) Backed out changeset f1ecfbba7ed2 (bug 1703812) Backed out changeset 011cece33b0d (bug1817997) Backed out changeset 4b42659090f3 (bug1817997) Backed out changeset 2d92f903dd66 (bug1817997) Backed out changeset 0ef13d357ee3 (bug1817997) Backed out changeset 7353f869efd2 (bug 1703812) Backed out changeset 14b061d0f595 (bug1817997) Backed out changeset d29bc29397c8 (bug 1703812) Backed out changeset 54c3294f0839 (bug1817997) Backed out changeset b9f2e1155bd7 (bug1817997) Backed out changeset d5d5d390dcbf (bug1817997) Backed out changeset 8fca27bd0f6b (bug1817997) Backed out changeset 670c599a3b99 (bug1817997) Backed out changeset deea3077f762 (bug1817997) Backed out changeset 25ecea0f3d49 (bug1817997) Backed out changeset 35ab3ed5e3fc (bug1817997) Backed out changeset f516a428ba32 (bug1817997) Backed out changeset e589b4d30995 (bug1817997) Backed out changeset d096b9cc905d (bug1817997) Backed out changeset 2952a6fa06e5 (bug1817997) Backed out changeset c1ac4c31ad9a (bug1817997) Backed out changeset 04c60cd83c5f (bug 1821362) Backed out changeset 6dd80575e551 (bug 1821362) Backed out changeset b86b569ecd46 (bug1817997) Backed out changeset 412e0a9ec4e8 (bug1817997) Backed out changeset 8e0dcf163138 (bug1817997) Backed out changeset 7af506896930 (bug1817997) Backed out changeset 29f7cd2b341c (bug1817997) Backed out changeset 7f64e65d9497 (bug1817997) Backed out changeset 89c241451a32 (bug1817997) Backed out changeset 66e4a26e1ebe (bug1817997) Backed out changeset ea1aebd4e245 (bug1817997) Backed out changeset 2d88a5915db9 (bug1817997) Backed out changeset 697ec1928f9c (bug1817997) Backed out changeset 41c0bd1133c5 (bug1817997) Backed out changeset b20cc750c020 (bug1817997) Backed out changeset dc5fd84a3a4c (bug 1703812) Backed out changeset efa6d130d4eb (bug 1703812) Backed out changeset 20d9b7cf0ddc (bug 1703812) Backed out changeset e77c61e8fad2 (bug 1703812) Backed out changeset 582d5c680e5a (bug 1703812) Backed out changeset 96c9aacc6811 (bug 1703812) Backed out changeset 56ec4a57a6a6 (bug 1703812) Backed out changeset 8f96c8811675 (bug 1703812) Backed out changeset a79a2f1b2b51 (bug 1703812) Backed out changeset 07eb8b2c5b9f (bug 1703812) Backed out changeset bae2b2fb9759 (bug 1703812) Backed out changeset 38b0416538f3 (bug 1703812) Backed out changeset b27b54c95cf2 (bug 1703812) Backed out changeset cab00065d83d (bug 1703812) Backed out changeset ab44727b2e1a (bug 1703812) Backed out changeset b7fdcb494670 (bug 1703812) Backed out changeset 73db43d49c6d (bug 1703812) Backed out changeset ce754dbfb862 (bug 1703812) Backed out changeset d694726a3ee6 (bug 1703812) Backed out changeset 6acede55acbb (bug 1703812) Backed out changeset 86e7d4784a20 (bug 1703812) Backed out changeset 6b2e055d9314 (bug 1703812) Backed out changeset b08695e5728a (bug 1703812) Backed out changeset 3b8a0081fd10 (bug 1703812) Backed out changeset 3a163596f982 (bug 1703812) Backed out changeset 5be1d4b282ab (bug 1703812) Backed out changeset 1ce012d7509e (bug 1703812) Backed out changeset ee2fab5881c7 (bug 1703812) Backed out changeset 62941a522893 (bug 1703812) Backed out changeset d4f11dc33eed (bug 1703812) Backed out changeset 781bb4c3cc02 (bug 1703812) Backed out changeset f070e0de0566 (bug 1703812) Backed out changeset 9f65c67ba2a6 (bug 1703812) Backed out changeset 1e76eecb85e2 (bug 1703812) Backed out changeset 953432408a83 (bug 1703812) Backed out changeset fd1dc92d3911 (bug 1703812) Backed out changeset 34d56948c6b6 (bug 1703812) Backed out changeset 2ba7ca61ecc3 (bug 1703812) Backed out changeset 545253c469e6 (bug 1703812) Backed out changeset fb4a61ab1300 (bug 1703812) Backed out changeset bf07b3cfd3d5 (bug 1703812) Backed out changeset eaff51e7754b (bug 1703812) Backed out changeset f5c485c41d13 (bug 1703812)
243 lines
8.1 KiB
C++
243 lines
8.1 KiB
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include <jni.h>
|
|
|
|
#ifdef MOZ_AV1
|
|
# include "AOMDecoder.h"
|
|
#endif
|
|
#include "MediaInfo.h"
|
|
#include "OpusDecoder.h"
|
|
#include "RemoteDataDecoder.h"
|
|
#include "TheoraDecoder.h"
|
|
#include "VPXDecoder.h"
|
|
#include "VorbisDecoder.h"
|
|
#include "mozilla/ClearOnShutdown.h"
|
|
#include "mozilla/Components.h"
|
|
#include "mozilla/StaticPrefs_media.h"
|
|
#include "mozilla/gfx/gfxVars.h"
|
|
#include "mozilla/java/HardwareCodecCapabilityUtilsWrappers.h"
|
|
#include "nsIGfxInfo.h"
|
|
#include "nsPromiseFlatString.h"
|
|
#include "prlog.h"
|
|
|
|
#undef LOG
|
|
#define LOG(arg, ...) \
|
|
MOZ_LOG( \
|
|
sAndroidDecoderModuleLog, mozilla::LogLevel::Debug, \
|
|
("AndroidDecoderModule(%p)::%s: " arg, this, __func__, ##__VA_ARGS__))
|
|
#define SLOG(arg, ...) \
|
|
MOZ_LOG(sAndroidDecoderModuleLog, mozilla::LogLevel::Debug, \
|
|
("%s: " arg, __func__, ##__VA_ARGS__))
|
|
|
|
using namespace mozilla;
|
|
using media::TimeUnit;
|
|
|
|
namespace mozilla {
|
|
|
|
mozilla::LazyLogModule sAndroidDecoderModuleLog("AndroidDecoderModule");
|
|
|
|
const nsCString TranslateMimeType(const nsACString& aMimeType) {
|
|
if (VPXDecoder::IsVPX(aMimeType, VPXDecoder::VP8)) {
|
|
static constexpr auto vp8 = "video/x-vnd.on2.vp8"_ns;
|
|
return vp8;
|
|
} else if (VPXDecoder::IsVPX(aMimeType, VPXDecoder::VP9)) {
|
|
static constexpr auto vp9 = "video/x-vnd.on2.vp9"_ns;
|
|
return vp9;
|
|
}
|
|
if (aMimeType.EqualsLiteral("video/av1")) {
|
|
static constexpr auto av1 = "video/av01"_ns;
|
|
return av1;
|
|
}
|
|
return nsCString(aMimeType);
|
|
}
|
|
|
|
AndroidDecoderModule::AndroidDecoderModule(CDMProxy* aProxy) {
|
|
mProxy = static_cast<MediaDrmCDMProxy*>(aProxy);
|
|
}
|
|
|
|
StaticAutoPtr<nsTArray<nsCString>> AndroidDecoderModule::sSupportedMimeTypes;
|
|
|
|
media::DecodeSupportSet AndroidDecoderModule::SupportsMimeType(
|
|
const nsACString& aMimeType) {
|
|
if (jni::GetAPIVersion() < 16) {
|
|
return media::DecodeSupport::Unsupported;
|
|
}
|
|
|
|
if (aMimeType.EqualsLiteral("video/mp4") ||
|
|
aMimeType.EqualsLiteral("video/avc")) {
|
|
// TODO: Note that we do not yet distinguish between SW/HW decode support.
|
|
// Will be done in bug 1754239.
|
|
return media::DecodeSupport::SoftwareDecode;
|
|
}
|
|
|
|
// When checking "audio/x-wav", CreateDecoder can cause a JNI ERROR by
|
|
// Accessing a stale local reference leading to a SIGSEGV crash.
|
|
// To avoid this we check for wav types here.
|
|
if (aMimeType.EqualsLiteral("audio/x-wav") ||
|
|
aMimeType.EqualsLiteral("audio/wave; codecs=1") ||
|
|
aMimeType.EqualsLiteral("audio/wave; codecs=3") ||
|
|
aMimeType.EqualsLiteral("audio/wave; codecs=6") ||
|
|
aMimeType.EqualsLiteral("audio/wave; codecs=7") ||
|
|
aMimeType.EqualsLiteral("audio/wave; codecs=65534")) {
|
|
return media::DecodeSupport::Unsupported;
|
|
}
|
|
|
|
if ((VPXDecoder::IsVPX(aMimeType, VPXDecoder::VP8) &&
|
|
!gfx::gfxVars::UseVP8HwDecode()) ||
|
|
(VPXDecoder::IsVPX(aMimeType, VPXDecoder::VP9) &&
|
|
!gfx::gfxVars::UseVP9HwDecode())) {
|
|
return media::DecodeSupport::Unsupported;
|
|
}
|
|
|
|
// Prefer the gecko decoder for opus and vorbis; stagefright crashes
|
|
// on content demuxed from mp4.
|
|
// Not all android devices support FLAC even when they say they do.
|
|
if (OpusDataDecoder::IsOpus(aMimeType) ||
|
|
VorbisDataDecoder::IsVorbis(aMimeType) ||
|
|
aMimeType.EqualsLiteral("audio/flac")) {
|
|
SLOG("Rejecting audio of type %s", aMimeType.Data());
|
|
return media::DecodeSupport::Unsupported;
|
|
}
|
|
|
|
// Prefer the gecko decoder for Theora.
|
|
// Not all android devices support Theora even when they say they do.
|
|
if (TheoraDecoder::IsTheora(aMimeType)) {
|
|
SLOG("Rejecting video of type %s", aMimeType.Data());
|
|
return media::DecodeSupport::Unsupported;
|
|
}
|
|
|
|
if (aMimeType.EqualsLiteral("audio/mpeg") &&
|
|
StaticPrefs::media_ffvpx_mp3_enabled()) {
|
|
// Prefer the ffvpx mp3 software decoder if available.
|
|
return media::DecodeSupport::Unsupported;
|
|
}
|
|
|
|
if (sSupportedMimeTypes) {
|
|
if (sSupportedMimeTypes->Contains(TranslateMimeType(aMimeType))) {
|
|
// TODO: Note that we do not yet distinguish between SW/HW decode support.
|
|
// Will be done in bug 1754239.
|
|
return media::DecodeSupport::SoftwareDecode;
|
|
}
|
|
}
|
|
|
|
return media::DecodeSupport::Unsupported;
|
|
}
|
|
|
|
nsTArray<nsCString> AndroidDecoderModule::GetSupportedMimeTypes() {
|
|
mozilla::jni::ObjectArray::LocalRef supportedTypes = mozilla::java::
|
|
HardwareCodecCapabilityUtils::GetDecoderSupportedMimeTypes();
|
|
|
|
nsTArray<nsCString> st = nsTArray<nsCString>();
|
|
for (size_t i = 0; i < supportedTypes->Length(); i++) {
|
|
st.AppendElement(
|
|
jni::String::LocalRef(supportedTypes->GetElement(i))->ToCString());
|
|
}
|
|
|
|
return st;
|
|
}
|
|
|
|
void AndroidDecoderModule::SetSupportedMimeTypes(
|
|
nsTArray<nsCString>&& aSupportedTypes) {
|
|
if (!sSupportedMimeTypes) {
|
|
sSupportedMimeTypes = new nsTArray<nsCString>(std::move(aSupportedTypes));
|
|
ClearOnShutdown(&sSupportedMimeTypes);
|
|
}
|
|
}
|
|
|
|
media::DecodeSupportSet AndroidDecoderModule::SupportsMimeType(
|
|
const nsACString& aMimeType, DecoderDoctorDiagnostics* aDiagnostics) const {
|
|
return AndroidDecoderModule::SupportsMimeType(aMimeType);
|
|
}
|
|
|
|
bool AndroidDecoderModule::SupportsColorDepth(
|
|
gfx::ColorDepth aColorDepth, DecoderDoctorDiagnostics* aDiagnostics) const {
|
|
// 10-bit support is codec dependent so this is not entirely accurate.
|
|
// Supports() will correct it.
|
|
return aColorDepth == gfx::ColorDepth::COLOR_8 ||
|
|
aColorDepth == gfx::ColorDepth::COLOR_10;
|
|
}
|
|
|
|
// Further check is needed because the base class uses the inaccurate
|
|
// SupportsColorDepth().
|
|
media::DecodeSupportSet AndroidDecoderModule::Supports(
|
|
const SupportDecoderParams& aParams,
|
|
DecoderDoctorDiagnostics* aDiagnostics) const {
|
|
media::DecodeSupportSet support =
|
|
PlatformDecoderModule::Supports(aParams, aDiagnostics);
|
|
|
|
// Short-circuit.
|
|
if (support == media::DecodeSupport::Unsupported) {
|
|
return support;
|
|
}
|
|
|
|
#ifdef MOZ_AV1
|
|
// For AV1, only allow HW decoder.
|
|
if (AOMDecoder::IsAV1(aParams.MimeType()) &&
|
|
(!StaticPrefs::media_av1_enabled() ||
|
|
!support.contains(media::DecodeSupport::HardwareDecode))) {
|
|
return media::DecodeSupport::Unsupported;
|
|
}
|
|
#endif
|
|
|
|
// Check 10-bit video.
|
|
const TrackInfo& trackInfo = aParams.mConfig;
|
|
const VideoInfo* videoInfo = trackInfo.GetAsVideoInfo();
|
|
if (!videoInfo || videoInfo->mColorDepth != gfx::ColorDepth::COLOR_10) {
|
|
return support;
|
|
}
|
|
|
|
return java::HardwareCodecCapabilityUtils::Decodes10Bit(
|
|
TranslateMimeType(aParams.MimeType()))
|
|
? support
|
|
: media::DecodeSupport::Unsupported;
|
|
}
|
|
|
|
already_AddRefed<MediaDataDecoder> AndroidDecoderModule::CreateVideoDecoder(
|
|
const CreateDecoderParams& aParams) {
|
|
// Temporary - forces use of VPXDecoder when alpha is present.
|
|
// Bug 1263836 will handle alpha scenario once implemented. It will shift
|
|
// the check for alpha to PDMFactory but not itself remove the need for a
|
|
// check.
|
|
if (aParams.VideoConfig().HasAlpha()) {
|
|
return nullptr;
|
|
}
|
|
|
|
nsString drmStubId;
|
|
if (mProxy) {
|
|
drmStubId = mProxy->GetMediaDrmStubId();
|
|
}
|
|
|
|
RefPtr<MediaDataDecoder> decoder =
|
|
RemoteDataDecoder::CreateVideoDecoder(aParams, drmStubId, mProxy);
|
|
return decoder.forget();
|
|
}
|
|
|
|
already_AddRefed<MediaDataDecoder> AndroidDecoderModule::CreateAudioDecoder(
|
|
const CreateDecoderParams& aParams) {
|
|
const AudioInfo& config = aParams.AudioConfig();
|
|
if (config.mBitDepth != 16) {
|
|
// We only handle 16-bit audio.
|
|
return nullptr;
|
|
}
|
|
|
|
LOG("CreateAudioFormat with mimeType=%s, mRate=%d, channels=%d",
|
|
config.mMimeType.Data(), config.mRate, config.mChannels);
|
|
|
|
nsString drmStubId;
|
|
if (mProxy) {
|
|
drmStubId = mProxy->GetMediaDrmStubId();
|
|
}
|
|
RefPtr<MediaDataDecoder> decoder =
|
|
RemoteDataDecoder::CreateAudioDecoder(aParams, drmStubId, mProxy);
|
|
return decoder.forget();
|
|
}
|
|
|
|
/* static */
|
|
already_AddRefed<PlatformDecoderModule> AndroidDecoderModule::Create(
|
|
CDMProxy* aProxy) {
|
|
return MakeAndAddRef<AndroidDecoderModule>(aProxy);
|
|
}
|
|
|
|
} // namespace mozilla
|