Bug 1923755 - Ship WebCodecs ImageDecoder and VideoFrame to release. r=media-playback-reviewers,chunmin,webidl,saschanaz

Because we are shipping to release on Android without video/audio
decoder/encoder support from WebCodecs, we need to ensure VideoFrame is
available on Android to allow the user to actually do anything useful,
such as drawing the decoded images to a canvas.

Differential Revision: https://phabricator.services.mozilla.com/D225150
This commit is contained in:
Andrew Osmond
2024-10-22 14:44:52 +00:00
parent 665aee9dc8
commit b3e5164ae0
10 changed files with 25 additions and 23 deletions

View File

@@ -421,11 +421,6 @@ void ImageDecoder::CheckOutstandingDecodes() {
}
}
/* static */ bool ImageDecoder::PrefEnabled(JSContext* aCx, JSObject* aObj) {
return StaticPrefs::dom_media_webcodecs_enabled() &&
StaticPrefs::dom_media_webcodecs_image_decoder_enabled();
}
/* static */ already_AddRefed<ImageDecoder> ImageDecoder::Constructor(
const GlobalObject& aGlobal, const ImageDecoderInit& aInit,
ErrorResult& aRv) {

View File

@@ -56,8 +56,6 @@ class ImageDecoder final : public nsISupports, public nsWrapperCache {
JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
static bool PrefEnabled(JSContext* aCx, JSObject* aObj);
static already_AddRefed<ImageDecoder> Constructor(
const GlobalObject& aGlobal, const ImageDecoderInit& aInit,
ErrorResult& aRv);

View File

@@ -19,6 +19,7 @@
#include "mozilla/Maybe.h"
#include "mozilla/ResultVariant.h"
#include "mozilla/ScopeExit.h"
#include "mozilla/StaticPrefs_dom.h"
#include "mozilla/Try.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/dom/CanvasUtils.h"
@@ -1418,6 +1419,12 @@ JSObject* VideoFrame::WrapObject(JSContext* aCx,
return VideoFrame_Binding::Wrap(aCx, this, aGivenProto);
}
/* static */
bool VideoFrame::PrefEnabled(JSContext* aCx, JSObject* aObj) {
return StaticPrefs::dom_media_webcodecs_enabled() ||
StaticPrefs::dom_media_webcodecs_image_decoder_enabled();
}
// The following constructors are defined in
// https://w3c.github.io/webcodecs/#dom-videoframe-videoframe

View File

@@ -103,6 +103,8 @@ class VideoFrame final : public nsISupports, public nsWrapperCache {
JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
static bool PrefEnabled(JSContext* aCx, JSObject* aObj);
static already_AddRefed<VideoFrame> Constructor(
const GlobalObject& aGlobal, HTMLImageElement& aImageElement,
const VideoFrameInit& aInit, ErrorResult& aRv);

View File

@@ -779,11 +779,11 @@ let interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ImageData", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ImageDecoder", nightly: true },
{ name: "ImageDecoder" },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ImageTrack", nightly: true },
{ name: "ImageTrack" },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ImageTrackList", nightly: true },
{ name: "ImageTrackList" },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "InputEvent", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
@@ -1466,13 +1466,13 @@ let interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ValidityState", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "VideoColorSpace", insecureContext: true, nightlyAndroid: true },
{ name: "VideoColorSpace", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "VideoDecoder", nightlyAndroid: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "VideoEncoder", nightlyAndroid: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "VideoFrame", insecureContext: true, nightlyAndroid: true },
{ name: "VideoFrame", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "VideoPlaybackQuality", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!

View File

@@ -31,7 +31,7 @@ dictionary ImageDecodeResult {
[Exposed=(Window,DedicatedWorker),
SecureContext,
Func="mozilla::dom::ImageDecoder::PrefEnabled"]
Pref="dom.media.webcodecs.image-decoder.enabled"]
interface ImageTrack {
readonly attribute boolean animated;
readonly attribute unsigned long frameCount;
@@ -41,7 +41,7 @@ interface ImageTrack {
[Exposed=(Window,DedicatedWorker),
SecureContext,
Func="mozilla::dom::ImageDecoder::PrefEnabled"]
Pref="dom.media.webcodecs.image-decoder.enabled"]
interface ImageTrackList {
getter ImageTrack (unsigned long index);
@@ -53,7 +53,7 @@ interface ImageTrackList {
[Exposed=(Window,DedicatedWorker),
SecureContext,
Func="mozilla::dom::ImageDecoder::PrefEnabled"]
Pref="dom.media.webcodecs.image-decoder.enabled"]
interface ImageDecoder {
[Throws]
constructor(ImageDecoderInit init);

View File

@@ -7,7 +7,7 @@
* https://w3c.github.io/webcodecs/#videocolorspace
*/
[Exposed=(Window,DedicatedWorker), Pref="dom.media.webcodecs.enabled"]
[Exposed=(Window,DedicatedWorker), Func="mozilla::dom::VideoFrame::PrefEnabled"]
interface VideoColorSpace {
[Throws]
constructor(optional VideoColorSpaceInit init = {});

View File

@@ -13,7 +13,7 @@ enum AlphaOption {
};
// [Serializable, Transferable] are implemented without adding attributes here.
[Exposed=(Window,DedicatedWorker), Pref="dom.media.webcodecs.enabled"]
[Exposed=(Window,DedicatedWorker), Func="mozilla::dom::VideoFrame::PrefEnabled"]
interface VideoFrame {
// The constructors should be shorten to:
// ```

View File

@@ -260,11 +260,11 @@ let interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ImageData", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ImageDecoder", nightly: true },
{ name: "ImageDecoder" },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ImageTrack", nightly: true },
{ name: "ImageTrack" },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "ImageTrackList", nightly: true },
{ name: "ImageTrackList" },
// IMPORTANT: Do not change this list without review from a DOM peer!
"Lock",
// IMPORTANT: Do not change this list without review from a DOM peer!
@@ -374,13 +374,13 @@ let interfaceNamesInGlobalScope = [
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "URLSearchParams", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "VideoColorSpace", insecureContext: true, nightlyAndroid: true },
{ name: "VideoColorSpace", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "VideoDecoder", nightlyAndroid: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "VideoEncoder", nightlyAndroid: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "VideoFrame", insecureContext: true, nightlyAndroid: true },
{ name: "VideoFrame", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!
{ name: "WebGL2RenderingContext", insecureContext: true },
// IMPORTANT: Do not change this list without review from a DOM peer!

View File

@@ -3241,7 +3241,7 @@
# WebCodecs API - Image decoder
- name: dom.media.webcodecs.image-decoder.enabled
type: RelaxedAtomicBool
value: @IS_NIGHTLY_BUILD@
value: true
mirror: always
# Number of seconds of very quiet or silent audio before considering the audio