Bug 1476975 - P3. Fix canPlayType/isTypeSupported for AV1 content. r=dminor
AV1 support is behind a pref, as such, the result of canPlayType should depends on the value of that pref.
Additionally to this change we remove AOMDecoder::IsSupportedCodec as it implied confusion on what a codec mimetype is. There are two type of codec mimetype: the one describing the container content ("av1") and the one describing the codec itself "video/av1")
AOMDecoder shouldn't know anything about containers (e.g. mp4 or webm)
--- a/dom/media/VideoUtils.cpp
+++ b/dom/media/VideoUtils.cpp
@@ -710,16 +710,22 @@ IsVP9CodecString(const nsAString& aCodec
uint8_t level = 0;
uint8_t bitDepth = 0;
return aCodec.EqualsLiteral("vp9") ||
aCodec.EqualsLiteral("vp9.0") ||
(StartsWith(NS_ConvertUTF16toUTF8(aCodec), "vp09") &&
ExtractVPXCodecDetails(aCodec, profile, level, bitDepth));
}
+bool
+IsAV1CodecString(const nsAString& aCodec)
+{
+ return aCodec.EqualsLiteral("av1"); // AV1
+}
+
UniquePtr<TrackInfo>
CreateTrackInfoWithMIMEType(const nsACString& aCodecMIMEType)
{
UniquePtr<TrackInfo> trackInfo;
if (StartsWith(aCodecMIMEType, "audio/")) {
trackInfo.reset(new AudioInfo());
trackInfo->mMimeType = aCodecMIMEType;
} else if (StartsWith(aCodecMIMEType, "video/")) {
--- a/dom/media/VideoUtils.h
+++ b/dom/media/VideoUtils.h
@@ -356,16 +356,19 @@ bool
IsAACCodecString(const nsAString& aCodec);
bool
IsVP8CodecString(const nsAString& aCodec);
bool
IsVP9CodecString(const nsAString& aCodec);
+bool
+IsAV1CodecString(const nsAString& aCodec);
+
// Try and create a TrackInfo with a given codec MIME type.
UniquePtr<TrackInfo>
CreateTrackInfoWithMIMEType(const nsACString& aCodecMIMEType);
// Try and create a TrackInfo with a given codec MIME type, and optional extra
// parameters from a container type (its MIME type and codecs are ignored).
UniquePtr<TrackInfo>
CreateTrackInfoWithMIMETypeAndContainerTypeExtraParameters(
--- a/dom/media/mediasource/MediaSource.cpp
+++ b/dom/media/mediasource/MediaSource.cpp
@@ -1,19 +1,16 @@
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 "MediaSource.h"
-#if MOZ_AV1
-#include "AOMDecoder.h"
-#endif
#include "AsyncEventRunner.h"
#include "DecoderTraits.h"
#include "Benchmark.h"
#include "DecoderDoctorDiagnostics.h"
#include "MediaContainerType.h"
#include "MediaResult.h"
#include "MediaSourceDemuxer.h"
#include "MediaSourceUtils.h"
@@ -130,19 +127,19 @@ MediaSource::IsTypeSupported(const nsASt
return NS_OK;
}
if (mimeType == MEDIAMIMETYPE("video/webm")) {
if (!(Preferences::GetBool("media.mediasource.webm.enabled", false) ||
StaticPrefs::MediaCapabilitiesEnabled() ||
containerType->ExtendedType().Codecs().Contains(
NS_LITERAL_STRING("vp8")) ||
#ifdef MOZ_AV1
- // FIXME: Temporary comparison with the full codecs attribute.
- // See bug 1377015.
- AOMDecoder::IsSupportedCodec(containerType->ExtendedType().Codecs().AsString()) ||
+ (StaticPrefs::MediaAv1Enabled() &&
+ IsAV1CodecString(
+ containerType->ExtendedType().Codecs().AsString())) ||
#endif
IsWebMForced(aDiagnostics))) {
return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
}
return NS_OK;
}
if (mimeType == MEDIAMIMETYPE("audio/webm")) {
if (!(Preferences::GetBool("media.mediasource.webm.enabled", false) ||
--- a/dom/media/platforms/agnostic/AOMDecoder.cpp
+++ b/dom/media/platforms/agnostic/AOMDecoder.cpp
@@ -337,23 +337,16 @@ AOMDecoder::Drain()
bool
AOMDecoder::IsAV1(const nsACString& aMimeType)
{
return aMimeType.EqualsLiteral("video/av1");
}
/* static */
bool
-AOMDecoder::IsSupportedCodec(const nsAString& aCodecType)
-{
- return aCodecType.EqualsLiteral("av1");
-}
-
-/* static */
-bool
AOMDecoder::IsKeyframe(Span<const uint8_t> aBuffer) {
aom_codec_stream_info_t info;
PodZero(&info);
auto res = aom_codec_peek_stream_info(aom_codec_av1_dx(),
aBuffer.Elements(),
aBuffer.Length(),
&info);
--- a/dom/media/platforms/agnostic/AOMDecoder.h
+++ b/dom/media/platforms/agnostic/AOMDecoder.h
@@ -32,19 +32,16 @@ public:
{
return NS_LITERAL_CSTRING("av1 libaom video decoder");
}
// Return true if aMimeType is a one of the strings used
// by our demuxers to identify AV1 streams.
static bool IsAV1(const nsACString& aMimeType);
- // Return true if aCodecType is a supported codec description.
- static bool IsSupportedCodec(const nsAString& aCodecType);
-
// Return true if a sample is a keyframe.
static bool IsKeyframe(Span<const uint8_t> aBuffer);
// Return the frame dimensions for a sample.
static gfx::IntSize GetFrameSize(Span<const uint8_t> aBuffer);
private:
~AOMDecoder();
--- a/dom/media/webm/WebMDecoder.cpp
+++ b/dom/media/webm/WebMDecoder.cpp
@@ -60,17 +60,17 @@ WebMDecoder::GetTracksInfo(const MediaCo
if (ExtractVPXCodecDetails(codec, profile, level, bitDepth)) {
trackInfo->GetAsVideoInfo()->mBitDepth = bitDepth;
}
tracks.AppendElement(std::move(trackInfo));
continue;
}
}
#ifdef MOZ_AV1
- if (AOMDecoder::IsSupportedCodec(codec)) {
+ if (StaticPrefs::MediaAv1Enabled() && IsAV1CodecString(codec)) {
tracks.AppendElement(
CreateTrackInfoWithMIMETypeAndContainerTypeExtraParameters(
NS_LITERAL_CSTRING("video/av1"), aType));
continue;
}
#endif
// Unknown codec
aError =