summaryrefslogtreecommitdiffstats
path: root/dom/media/webcodecs/WebCodecsUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webcodecs/WebCodecsUtils.cpp')
-rw-r--r--dom/media/webcodecs/WebCodecsUtils.cpp109
1 files changed, 70 insertions, 39 deletions
diff --git a/dom/media/webcodecs/WebCodecsUtils.cpp b/dom/media/webcodecs/WebCodecsUtils.cpp
index 1e03f616db..3507aba440 100644
--- a/dom/media/webcodecs/WebCodecsUtils.cpp
+++ b/dom/media/webcodecs/WebCodecsUtils.cpp
@@ -37,7 +37,7 @@ std::atomic<WebCodecsId> sNextId = 0;
namespace mozilla::dom {
/*
- * The followings are helpers for VideoDecoder methods
+ * The followings are helpers for AudioDecoder and VideoDecoder methods
*/
nsTArray<nsCString> GuessContainers(const nsAString& aCodec) {
@@ -57,6 +57,29 @@ nsTArray<nsCString> GuessContainers(const nsAString& aCodec) {
return {"mp4"_ns, "3gpp"_ns, "3gpp2"_ns, "3gp2"_ns};
}
+ if (IsAACCodecString(aCodec)) {
+ return {"adts"_ns, "mp4"_ns};
+ }
+
+ if (aCodec.EqualsLiteral("vorbis") || aCodec.EqualsLiteral("opus")) {
+ return {"ogg"_ns};
+ }
+
+ if (aCodec.EqualsLiteral("flac")) {
+ return {"flac"_ns};
+ }
+
+ if (aCodec.EqualsLiteral("mp3")) {
+ return {"mp3"_ns};
+ }
+
+ if (aCodec.EqualsLiteral("ulaw") || aCodec.EqualsLiteral("alaw") ||
+ aCodec.EqualsLiteral("pcm-u8") || aCodec.EqualsLiteral("pcm-s16") ||
+ aCodec.EqualsLiteral("pcm-s24") || aCodec.EqualsLiteral("pcm-s32") ||
+ aCodec.EqualsLiteral("pcm-f32")) {
+ return {"x-wav"_ns};
+ }
+
return {};
}
@@ -106,7 +129,8 @@ static std::tuple<JS::ArrayBufferOrView, size_t, size_t> GetArrayBufferInfo(
Result<Ok, nsresult> CloneBuffer(
JSContext* aCx,
OwningMaybeSharedArrayBufferViewOrMaybeSharedArrayBuffer& aDest,
- const OwningMaybeSharedArrayBufferViewOrMaybeSharedArrayBuffer& aSrc) {
+ const OwningMaybeSharedArrayBufferViewOrMaybeSharedArrayBuffer& aSrc,
+ ErrorResult& aRv) {
std::tuple<JS::ArrayBufferOrView, size_t, size_t> info =
GetArrayBufferInfo(aCx, aSrc);
JS::Rooted<JS::ArrayBufferOrView> abov(aCx);
@@ -121,6 +145,8 @@ Result<Ok, nsresult> CloneBuffer(
JS::Rooted<JSObject*> cloned(aCx,
JS::ArrayBufferClone(aCx, obj, offset, len));
if (NS_WARN_IF(!cloned)) {
+ aRv.MightThrowJSException();
+ aRv.StealExceptionFromJSContext(aCx);
return Err(NS_ERROR_OUT_OF_MEMORY);
}
@@ -151,8 +177,6 @@ gfx::YUVColorSpace ToColorSpace(VideoMatrixCoefficients aMatrix) {
return gfx::YUVColorSpace::BT601;
case VideoMatrixCoefficients::Bt2020_ncl:
return gfx::YUVColorSpace::BT2020;
- case VideoMatrixCoefficients::EndGuard_:
- break;
}
MOZ_ASSERT_UNREACHABLE("unsupported VideoMatrixCoefficients");
return gfx::YUVColorSpace::Default;
@@ -171,8 +195,7 @@ gfx::TransferFunction ToTransferFunction(
case VideoTransferCharacteristics::Hlg:
return gfx::TransferFunction::HLG;
case VideoTransferCharacteristics::Linear:
- case VideoTransferCharacteristics::EndGuard_:
- break;
+ return gfx::TransferFunction::Default;
}
MOZ_ASSERT_UNREACHABLE("unsupported VideoTransferCharacteristics");
return gfx::TransferFunction::Default;
@@ -190,8 +213,6 @@ gfx::ColorSpace2 ToPrimaries(VideoColorPrimaries aPrimaries) {
return gfx::ColorSpace2::BT2020;
case VideoColorPrimaries::Smpte432:
return gfx::ColorSpace2::DISPLAY_P3;
- case VideoColorPrimaries::EndGuard_:
- break;
}
MOZ_ASSERT_UNREACHABLE("unsupported VideoTransferCharacteristics");
return gfx::ColorSpace2::UNKNOWN;
@@ -300,13 +321,6 @@ Maybe<VideoPixelFormat> ImageBitmapFormatToVideoPixelFormat(
return Nothing();
}
-Result<RefPtr<MediaByteBuffer>, nsresult> GetExtraDataFromArrayBuffer(
- const OwningMaybeSharedArrayBufferViewOrMaybeSharedArrayBuffer& aBuffer) {
- RefPtr<MediaByteBuffer> data = MakeRefPtr<MediaByteBuffer>();
- Unused << AppendTypedArrayDataTo(aBuffer, *data);
- return data->Length() > 0 ? data : nullptr;
-}
-
bool IsOnAndroid() {
#if defined(ANDROID)
return true;
@@ -364,15 +378,13 @@ struct ConfigurationChangeToString {
}
nsCString operator()(
const HardwareAccelerationChange& aHardwareAccelerationChange) {
- return nsPrintfCString("HW acceleration: %s",
- dom::HardwareAccelerationValues::GetString(
- aHardwareAccelerationChange.get())
- .data());
+ return nsPrintfCString(
+ "HW acceleration: %s",
+ dom::GetEnumString(aHardwareAccelerationChange.get()).get());
}
nsCString operator()(const AlphaChange& aAlphaChange) {
- return nsPrintfCString(
- "Alpha: %s",
- dom::AlphaOptionValues::GetString(aAlphaChange.get()).data());
+ return nsPrintfCString("Alpha: %s",
+ dom::GetEnumString(aAlphaChange.get()).get());
}
nsCString operator()(const ScalabilityModeChange& aScalabilityModeChange) {
if (aScalabilityModeChange.get().isNothing()) {
@@ -383,15 +395,12 @@ struct ConfigurationChangeToString {
NS_ConvertUTF16toUTF8(aScalabilityModeChange.get().value()).get());
}
nsCString operator()(const BitrateModeChange& aBitrateModeChange) {
- return nsPrintfCString(
- "Bitrate mode: %s",
- dom::VideoEncoderBitrateModeValues::GetString(aBitrateModeChange.get())
- .data());
+ return nsPrintfCString("Bitrate mode: %s",
+ dom::GetEnumString(aBitrateModeChange.get()).get());
}
nsCString operator()(const LatencyModeChange& aLatencyModeChange) {
- return nsPrintfCString(
- "Latency mode: %s",
- dom::LatencyModeValues::GetString(aLatencyModeChange.get()).data());
+ return nsPrintfCString("Latency mode: %s",
+ dom::GetEnumString(aLatencyModeChange.get()).get());
}
nsCString operator()(const ContentHintChange& aContentHintChange) {
return nsPrintfCString("Content hint: %s",
@@ -489,9 +498,6 @@ WebCodecsConfigurationChangeList::ToPEMChangeList() const {
return rv.forget();
}
-#define ENUM_TO_STRING(enumType, enumValue) \
- enumType##Values::GetString(enumValue).data()
-
nsCString ColorSpaceInitToString(
const dom::VideoColorSpaceInit& aColorSpaceInit) {
nsCString rv("VideoColorSpace");
@@ -502,18 +508,15 @@ nsCString ColorSpaceInitToString(
}
if (!aColorSpaceInit.mMatrix.IsNull()) {
rv.AppendPrintf(" matrix: %s",
- ENUM_TO_STRING(dom::VideoMatrixCoefficients,
- aColorSpaceInit.mMatrix.Value()));
+ GetEnumString(aColorSpaceInit.mMatrix.Value()).get());
}
if (!aColorSpaceInit.mTransfer.IsNull()) {
rv.AppendPrintf(" transfer: %s",
- ENUM_TO_STRING(dom::VideoTransferCharacteristics,
- aColorSpaceInit.mTransfer.Value()));
+ GetEnumString(aColorSpaceInit.mTransfer.Value()).get());
}
if (!aColorSpaceInit.mPrimaries.IsNull()) {
rv.AppendPrintf(" primaries: %s",
- ENUM_TO_STRING(dom::VideoColorPrimaries,
- aColorSpaceInit.mPrimaries.Value()));
+ GetEnumString(aColorSpaceInit.mPrimaries.Value()).get());
}
return rv;
@@ -575,4 +578,32 @@ nsString ConfigToString(const VideoDecoderConfig& aConfig) {
return internal->ToString();
}
-}; // namespace mozilla::dom
+Result<RefPtr<MediaByteBuffer>, nsresult> GetExtraDataFromArrayBuffer(
+ const OwningMaybeSharedArrayBufferViewOrMaybeSharedArrayBuffer& aBuffer) {
+ RefPtr<MediaByteBuffer> data = MakeRefPtr<MediaByteBuffer>();
+ if (!AppendTypedArrayDataTo(aBuffer, *data)) {
+ return Err(NS_ERROR_OUT_OF_MEMORY);
+ }
+ return data->Length() > 0 ? data : nullptr;
+}
+
+bool IsSupportedVideoCodec(const nsAString& aCodec) {
+ LOG("IsSupportedVideoCodec: %s", NS_ConvertUTF16toUTF8(aCodec).get());
+ // The only codec string accepted for vp8 is "vp8"
+ if (!IsVP9CodecString(aCodec) && !IsH264CodecString(aCodec) &&
+ !IsAV1CodecString(aCodec) && !aCodec.EqualsLiteral("vp8")) {
+ return false;
+ }
+
+ // Gecko allows codec string starts with vp9 or av1 but Webcodecs requires to
+ // starts with av01 and vp09.
+ // https://w3c.github.io/webcodecs/codec_registry.html.
+ if (StringBeginsWith(aCodec, u"vp9"_ns) ||
+ StringBeginsWith(aCodec, u"av1"_ns)) {
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace mozilla::dom