WebKit Bugzilla
Attachment 350017 Details for
Bug 189647
: [GStreamer] Add support for AV1 decoding
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-189647-20180918152831.patch (text/plain), 41.48 KB, created by
Philippe Normand
on 2018-09-18 06:28:33 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Philippe Normand
Created:
2018-09-18 06:28:33 PDT
Size:
41.48 KB
patch
obsolete
>Subversion Revision: 236050 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 82ada9d39001111836889c5c258e47d82a20a87b..65980090b88fc7abaa65c3971b40a0fca913a52c 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,20 @@ >+2018-09-17 Philippe Normand <pnormand@igalia.com> >+ >+ [GStreamer] Add support for AV1 decoding >+ https://bugs.webkit.org/show_bug.cgi?id=189647 >+ >+ Reviewed by Xabier Rodriguez-Calvar. >+ >+ AV1 can be muxed in MP4 and WebM containers. The test is an adaptation from Chromium's unittest: >+ https://chromium.googlesource.com/chromium/src/+/master/content/browser/media/media_canplaytype_browsertest.cc >+ >+ Test: media/media-can-play-av1.html >+ >+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: >+ (WebCore::MediaPlayerPrivateGStreamer::supportsType): Add AV1 >+ support. The av01 codec has to be explicitely checked, along with >+ the presence of a compatible AV1 decoder. >+ > 2018-09-08 Darin Adler <darin@apple.com> > > Streamline JSRetainPtr, fix leaks of JSString and JSGlobalContext >diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp >index 330941aa199916ce922ed1ee001cd24541122132..dd1d03f384f0ab1ffc400ece91fe3499685862dd 100644 >--- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp >+++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp >@@ -2349,6 +2349,22 @@ MediaPlayer::SupportsType MediaPlayerPrivateGStreamer::supportsType(const MediaE > if (parameters.type.isEmpty()) > return result; > >+ auto containerType = parameters.type.containerType(); >+ if (containerType == "video/mp4"_s || containerType == "video/webm"_s) { >+ if (mimeTypeSet().contains(containerType)) { >+ GList* videoDecoderFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO, GST_RANK_MARGINAL); >+ bool av1DecoderFound = gstRegistryHasElementForMediaType(videoDecoderFactories, "video/x-av1"_s); >+ gst_plugin_feature_list_free(videoDecoderFactories); >+ for (auto& codec : parameters.type.codecs()) { >+ if (codec.startsWith("av01"_s)) >+ return av1DecoderFound ? MediaPlayer::IsSupported : MediaPlayer::IsNotSupported; >+ if (codec.startsWith("av1"_s)) >+ return MediaPlayer::IsNotSupported; >+ } >+ return extendedSupportsType(parameters, result); >+ } >+ } >+ > // spec says we should not return "probably" if the codecs string is empty > if (mimeTypeSet().contains(parameters.type.containerType())) > result = parameters.type.codecs().isEmpty() ? MediaPlayer::MayBeSupported : MediaPlayer::IsSupported; >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 5fe064ee88198fd3c53b43366d1197d166b12a03..6085096a1cbbfca4be3b8a496f1faa31f7fef181 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,5 +1,25 @@ > 2018-09-17 Philippe Normand <pnormand@igalia.com> > >+ [GStreamer] Add support for AV1 decoding >+ https://bugs.webkit.org/show_bug.cgi?id=189647 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add patches required for AV1 decoding support. They're all >+ upstream already and will be shipped in GStreamer 1.16. The aom >+ GStreamer plugin depends on the aom library for which there's no >+ official release yet. >+ >+ * gstreamer/jhbuild.modules: >+ * gstreamer/patches/gst-plugins-bad-0001-aomenc-Add-support-for-10-12bit-decoding.patch: Added. >+ * gstreamer/patches/gst-plugins-bad-0002-aomenc-Handle-8-bit_depth-images-with-AOM_IMG_FMT_HI.patch: Added. >+ * gstreamer/patches/gst-plugins-good-0001-qtdemux-Detect-and-expose-CEA-608-708-Closed-Caption.patch: Added. This one is unrelated but an implicit dependency of the next one. >+ * gstreamer/patches/gst-plugins-good-0004-qtdemux-Add-initial-support-for-AV1-demuxing.patch: Added. >+ * gstreamer/patches/gst-plugins-good-0005-qtdemux-Extract-AV1-codec_data-and-put-it-in-the-cap.patch: Added. >+ * gstreamer/patches/gst-plugins-good-0006-qtdemux-Recognize-more-AV1-atoms.patch: Added. >+ >+2018-09-17 Philippe Normand <pnormand@igalia.com> >+ > [JHBuild] Update to GStreamer 1.14.3 > https://bugs.webkit.org/show_bug.cgi?id=189450 > >diff --git a/Tools/gstreamer/jhbuild.modules b/Tools/gstreamer/jhbuild.modules >index dfc46f9c1de03aec6aef23f290986dbd0c779015..dd93532eb222030ebf7b2de14dd5d3a6724341ca 100644 >--- a/Tools/gstreamer/jhbuild.modules >+++ b/Tools/gstreamer/jhbuild.modules >@@ -21,6 +21,8 @@ > href="https://github.com/"/> > <repository type="git" name="chromium.googlesource.com" > href="https://chromium.googlesource.com/webm/"/> >+ <repository type="git" name="aomedia.googlesource.com" >+ href="https://aomedia.googlesource.com/"/> > > <autotools id="orc" autogenargs="--disable-gtk-doc" autogen-sh="configure"> > <branch module="orc/orc-${version}.tar.xz" version="0.4.28" >@@ -40,6 +42,11 @@ > <branch repo="chromium.googlesource.com" checkoutdir="libvpx" tag="v1.7.0"/> > </autotools> > >+ <cmake id="aom" cmakeargs="-DBUILD_SHARED_LIBS=1"> >+ <branch repo="aomedia.googlesource.com" module="aom" checkoutdir="aom" branch="master" >+ revision="master" tag="cdb083e84a71d6d31163a4f64f18dc1328fd782c" /> >+ </cmake> >+ > <autotools id="gstreamer" autogen-sh="configure" autogenargs="--disable-gtk-doc --disable-introspection --disable-examples --disable-tests"> > <dependencies> > <dep package="orc"/> >@@ -74,6 +81,10 @@ > <patch file="gst-plugins-good-0001-qtdemux-Do-not-run-the-preferred-decryptor-context-q.patch" strip="1" /> <!-- Merged as 3e063703b3a51b8aaa7f75f36c4660c583a60e93 --> > <patch file="gst-plugins-good-0002-qtdemux-Do-not-unref-a-NULL-stream_tags.patch" strip="1" /> <!-- Merged as 43a540b1cd9f162d3dae5d50e36703dfaf558a3e --> > <patch file="gst-plugins-good-0003-qtdemux-Clarify-field-name-about-stream-encryption-s.patch" strip="1" /> <!-- Merged as 0fbde2a07928ba79b7a4ddb4585f6b1de36a74bb --> >+ <patch file="gst-plugins-good-0001-qtdemux-Detect-and-expose-CEA-608-708-Closed-Caption.patch" strip="1" /> <!-- Merged as 2869edeea29a022007a99db2df41b5a7e1a3025c (to be shipped in 1.16) --> >+ <patch file="gst-plugins-good-0004-qtdemux-Add-initial-support-for-AV1-demuxing.patch" strip="1" /> <!-- Merged as b6e8c6323e01249bb3ac4f121c3adc3ea8d924bf (to be shipped in 1.16) --> >+ <patch file="gst-plugins-good-0005-qtdemux-Extract-AV1-codec_data-and-put-it-in-the-cap.patch" strip="1" /> <!-- Merged as 43ee4055c3d03a9f99acdf3c05f45e154899edef (to be shipped in 1.16) --> >+ <patch file="gst-plugins-good-0006-qtdemux-Recognize-more-AV1-atoms.patch" strip="1" /> <!-- Merged as e07ce9afb4edb2ea898763c7ea11f0af2704104e (to be shipped in 1.16) --> > </branch> > </autotools> > >@@ -82,8 +93,12 @@ > <dep package="graphene"/> > <dep package="gst-plugins-base"/> > <dep package="openh264"/> >+ <dep package="aom"/> > </dependencies> >- <branch hash="sha256:b2224e5d9c1b85ad51233f6135524bb9e16a9172d395edc79c73b89094659fd5" module="gst-plugins-bad/gst-plugins-bad-${version}.tar.xz" repo="gstreamer" version="1.14.3" /> >+ <branch hash="sha256:b2224e5d9c1b85ad51233f6135524bb9e16a9172d395edc79c73b89094659fd5" module="gst-plugins-bad/gst-plugins-bad-${version}.tar.xz" repo="gstreamer" version="1.14.3"> >+ <patch file="gst-plugins-bad-0001-aomenc-Add-support-for-10-12bit-decoding.patch" strip="1" /> <!-- Merged as 1d96d9e842dd71882f54ddffbf6c1ccecdb03fcd (to be shipped in 1.16) --> >+ <patch file="gst-plugins-bad-0002-aomenc-Handle-8-bit_depth-images-with-AOM_IMG_FMT_HI.patch" strip="1" /> <!-- Merged as 10a37e0c3528a721084441c37af37baef0908ddc (to be shipped in 1.16) --> >+ </branch> > </autotools> > > <autotools id="gst-libav" autogen-sh="configure" autogenargs="--with-libav-extra-configure='--disable-yasm' --disable-gtk-doc"> >diff --git a/Tools/gstreamer/patches/gst-plugins-bad-0001-aomenc-Add-support-for-10-12bit-decoding.patch b/Tools/gstreamer/patches/gst-plugins-bad-0001-aomenc-Add-support-for-10-12bit-decoding.patch >new file mode 100644 >index 0000000000000000000000000000000000000000..4b7a225b0234f14e6534299c961c1a542770970c >--- /dev/null >+++ b/Tools/gstreamer/patches/gst-plugins-bad-0001-aomenc-Add-support-for-10-12bit-decoding.patch >@@ -0,0 +1,165 @@ >+From 1d96d9e842dd71882f54ddffbf6c1ccecdb03fcd Mon Sep 17 00:00:00 2001 >+From: Sean-Der <sean@siobud.com> >+Date: Wed, 27 Jun 2018 09:44:00 +0000 >+Subject: [PATCH] aomenc: Add support for 10/12bit decoding >+ >+https://bugzilla.gnome.org/show_bug.cgi?id=791674 >+--- >+ ext/aom/gstav1dec.c | 108 ++++++++++++++++++++++++++++++++++++++++++-- >+ 1 file changed, 103 insertions(+), 5 deletions(-) >+ >+diff --git a/ext/aom/gstav1dec.c b/ext/aom/gstav1dec.c >+index d33118e64..23b18f44c 100644 >+--- a/ext/aom/gstav1dec.c >++++ b/ext/aom/gstav1dec.c >+@@ -52,15 +52,26 @@ static GstStaticPadTemplate gst_av1_dec_src_pad_template = >+ GST_STATIC_PAD_TEMPLATE ("src", >+ GST_PAD_SRC, >+ GST_PAD_ALWAYS, >+- GST_STATIC_CAPS ("video/x-raw, " >+- "format = (string) \"I420\", " >+- "framerate = (fraction) [0, MAX], " >+- "width = (int) [ 4, MAX ], " "height = (int) [ 4, MAX ]") >++ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ I420, YV12, Y42B, Y444" >++#if G_BYTE_ORDER == G_LITTLE_ENDIAN >++ ", I420_10LE, I420_12LE, I422_10LE, I422_12LE, Y444_10LE, Y444_12LE" >++#else >++ ", I420_10BE, I420_12BE, I422_10BE, I422_12BE, Y444_10BE, Y444_12BE" >++#endif >++ " }")) >+ ); >+ >+ GST_DEBUG_CATEGORY_STATIC (av1_dec_debug); >+ #define GST_CAT_DEFAULT av1_dec_debug >+ >++#define GST_VIDEO_FORMAT_WITH_ENDIAN(fmt,endian) GST_VIDEO_FORMAT_##fmt##endian >++ >++#if G_BYTE_ORDER == G_LITTLE_ENDIAN >++#define AOM_FMT_TO_GST(fmt) GST_VIDEO_FORMAT_WITH_ENDIAN(fmt,LE) >++#else >++#define AOM_FMT_TO_GST(fmt) GST_VIDEO_FORMAT_WITH_ENDIAN(fmt,BE) >++#endif >++ >+ static void gst_av1_dec_set_property (GObject * object, guint prop_id, >+ const GValue * value, GParamSpec * pspec); >+ static void gst_av1_dec_get_property (GObject * object, guint prop_id, >+@@ -79,6 +90,8 @@ static void gst_av1_dec_image_to_buffer (GstAV1Dec * dec, >+ const aom_image_t * img, GstBuffer * buffer); >+ static GstFlowReturn gst_av1_dec_open_codec (GstAV1Dec * av1dec, >+ GstVideoCodecFrame * frame); >++static gboolean gst_av1_dec_get_valid_format (GstAV1Dec * dec, >++ const aom_image_t * img, GstVideoFormat * fmt); >+ >+ #define gst_av1_dec_parent_class parent_class >+ G_DEFINE_TYPE (GstAV1Dec, gst_av1_dec, GST_TYPE_VIDEO_DECODER); >+@@ -309,6 +322,81 @@ gst_av1_dec_image_to_buffer (GstAV1Dec * dec, const aom_image_t * img, >+ gst_video_frame_unmap (&frame); >+ } >+ >++gboolean >++gst_av1_dec_get_valid_format (GstAV1Dec * dec, const aom_image_t * img, >++ GstVideoFormat * fmt) >++{ >++ switch (img->fmt) { >++ case AOM_IMG_FMT_I420: >++ case AOM_IMG_FMT_I42016: >++ if (img->bit_depth == 8) { >++ *fmt = img->monochrome ? GST_VIDEO_FORMAT_GRAY8 : GST_VIDEO_FORMAT_I420; >++ return TRUE; >++ } else if (img->bit_depth == 10) { >++ *fmt = AOM_FMT_TO_GST (I420_10); >++ return TRUE; >++ } else if (img->bit_depth == 12) { >++ *fmt = AOM_FMT_TO_GST (I420_12); >++ return TRUE; >++ } >++ >++ GST_FIXME_OBJECT (dec, >++ "Please add a 4:2:0 planar %u bit depth frame format", >++ img->bit_depth); >++ GST_ELEMENT_WARNING (dec, STREAM, NOT_IMPLEMENTED, (NULL), >++ ("Unsupported frame format - 4:2:0 planar %u bit depth", >++ img->bit_depth)); >++ return FALSE; >++ >++ case AOM_IMG_FMT_I422: >++ case AOM_IMG_FMT_I42216: >++ if (img->bit_depth == 8) { >++ *fmt = GST_VIDEO_FORMAT_Y42B; >++ return TRUE; >++ } else if (img->bit_depth == 10) { >++ *fmt = AOM_FMT_TO_GST (I422_10); >++ return TRUE; >++ } else if (img->bit_depth == 12) { >++ *fmt = AOM_FMT_TO_GST (I422_12); >++ return TRUE; >++ } >++ GST_FIXME_OBJECT (dec, >++ "Please add a 4:2:2 planar %u bit depth frame format", >++ img->bit_depth); >++ GST_ELEMENT_WARNING (dec, STREAM, NOT_IMPLEMENTED, (NULL), >++ ("Unsupported frame format - 4:2:2 planar %u bit depth", >++ img->bit_depth)); >++ return FALSE; >++ >++ case AOM_IMG_FMT_I444: >++ case AOM_IMG_FMT_I44416: >++ if (img->bit_depth == 8) { >++ *fmt = GST_VIDEO_FORMAT_Y444; >++ return TRUE; >++ } else if (img->bit_depth == 10) { >++ *fmt = AOM_FMT_TO_GST (Y444_10); >++ return TRUE; >++ } else if (img->bit_depth == 12) { >++ *fmt = AOM_FMT_TO_GST (Y444_12); >++ return TRUE; >++ } >++ GST_FIXME_OBJECT (dec, >++ "Please add a 4:4:4 planar %u bit depth frame format", >++ img->bit_depth); >++ GST_ELEMENT_WARNING (dec, STREAM, NOT_IMPLEMENTED, (NULL), >++ ("Unsupported frame format - 4:4:4 planar %u bit depth", >++ img->bit_depth)); >++ return FALSE; >++ >++ case AOM_IMG_FMT_YV12: >++ *fmt = GST_VIDEO_FORMAT_YV12; >++ return TRUE; >++ >++ default: >++ return FALSE; >++ } >++} >++ >+ static GstFlowReturn >+ gst_av1_dec_handle_frame (GstVideoDecoder * dec, GstVideoCodecFrame * frame) >+ { >+@@ -318,6 +406,7 @@ gst_av1_dec_handle_frame (GstVideoDecoder * dec, GstVideoCodecFrame * frame) >+ aom_codec_err_t status; >+ aom_image_t *img; >+ aom_codec_iter_t iter = NULL; >++ GstVideoFormat fmt; >+ >+ if (!av1dec->decoder_inited) { >+ ret = gst_av1_dec_open_codec (av1dec, frame); >+@@ -349,7 +438,16 @@ gst_av1_dec_handle_frame (GstVideoDecoder * dec, GstVideoCodecFrame * frame) >+ >+ img = aom_codec_get_frame (&av1dec->decoder, &iter); >+ if (img) { >+- gst_av1_dec_handle_resolution_change (av1dec, img, GST_VIDEO_FORMAT_I420); >++ if (gst_av1_dec_get_valid_format (av1dec, img, &fmt) == FALSE) { >++ aom_img_free (img); >++ GST_ELEMENT_ERROR (dec, LIBRARY, ENCODE, >++ ("Failed to decode frame"), ("Unsupported color format %d", >++ img->fmt)); >++ gst_video_codec_frame_unref (frame); >++ return GST_FLOW_ERROR; >++ } >++ >++ gst_av1_dec_handle_resolution_change (av1dec, img, fmt); >+ >+ ret = gst_video_decoder_allocate_output_frame (dec, frame); >+ if (ret == GST_FLOW_OK) { >+-- >+2.18.0 >+ >diff --git a/Tools/gstreamer/patches/gst-plugins-bad-0002-aomenc-Handle-8-bit_depth-images-with-AOM_IMG_FMT_HI.patch b/Tools/gstreamer/patches/gst-plugins-bad-0002-aomenc-Handle-8-bit_depth-images-with-AOM_IMG_FMT_HI.patch >new file mode 100644 >index 0000000000000000000000000000000000000000..12bf661886e3a5758b8a9e8315f76478e8577bc8 >--- /dev/null >+++ b/Tools/gstreamer/patches/gst-plugins-bad-0002-aomenc-Handle-8-bit_depth-images-with-AOM_IMG_FMT_HI.patch >@@ -0,0 +1,56 @@ >+From 10a37e0c3528a721084441c37af37baef0908ddc Mon Sep 17 00:00:00 2001 >+From: Sean-Der <sean@siobud.com> >+Date: Wed, 27 Jun 2018 09:48:00 +0000 >+Subject: [PATCH] aomenc: Handle 8 bit_depth images with >+ AOM_IMG_FMT_HIGHBITDEPTH enabled >+ >+https://bugzilla.gnome.org/show_bug.cgi?id=791674 >+--- >+ ext/aom/gstav1dec.c | 20 ++++++++++++++++---- >+ 1 file changed, 16 insertions(+), 4 deletions(-) >+ >+diff --git a/ext/aom/gstav1dec.c b/ext/aom/gstav1dec.c >+index 23b18f44c..6e0a9bd5d 100644 >+--- a/ext/aom/gstav1dec.c >++++ b/ext/aom/gstav1dec.c >+@@ -285,7 +285,7 @@ static void >+ gst_av1_dec_image_to_buffer (GstAV1Dec * dec, const aom_image_t * img, >+ GstBuffer * buffer) >+ { >+- int deststride, srcstride, height, width, line, comp; >++ int deststride, srcstride, height, width, line, comp, y; >+ guint8 *dest, *src; >+ GstVideoFrame frame; >+ GstVideoInfo *info = &dec->output_state->info; >+@@ -298,13 +298,25 @@ gst_av1_dec_image_to_buffer (GstAV1Dec * dec, const aom_image_t * img, >+ for (comp = 0; comp < 3; comp++) { >+ dest = GST_VIDEO_FRAME_COMP_DATA (&frame, comp); >+ src = img->planes[comp]; >+- width = GST_VIDEO_FRAME_COMP_WIDTH (&frame, comp) >+- * GST_VIDEO_FRAME_COMP_PSTRIDE (&frame, comp); >++ width = >++ GST_VIDEO_FRAME_COMP_WIDTH (&frame, >++ comp) * GST_VIDEO_FRAME_COMP_PSTRIDE (&frame, comp); >+ height = GST_VIDEO_FRAME_COMP_HEIGHT (&frame, comp); >+ deststride = GST_VIDEO_FRAME_COMP_STRIDE (&frame, comp); >+ srcstride = img->stride[comp]; >+ >+- if (srcstride == deststride) { >++ if ((img->fmt & AOM_IMG_FMT_HIGHBITDEPTH) && img->bit_depth == 8) { >++ GST_TRACE_OBJECT (dec, >++ "HIGHBITDEPTH image with 8 bit_depth. Comp %d: %d != %d, copying " >++ "line by line.", comp, srcstride, deststride); >++ for (line = 0; line < height; line++) { >++ for (y = 0; y < width; y++) { >++ dest[y] = src[y * 2]; >++ } >++ dest += deststride; >++ src += srcstride; >++ } >++ } else if (srcstride == deststride) { >+ GST_TRACE_OBJECT (dec, "Stride matches. Comp %d: %d, copying full plane", >+ comp, srcstride); >+ memcpy (dest, src, srcstride * height); >+-- >+2.18.0 >+ >diff --git a/Tools/gstreamer/patches/gst-plugins-good-0001-qtdemux-Detect-and-expose-CEA-608-708-Closed-Caption.patch b/Tools/gstreamer/patches/gst-plugins-good-0001-qtdemux-Detect-and-expose-CEA-608-708-Closed-Caption.patch >new file mode 100644 >index 0000000000000000000000000000000000000000..9886d1082c0e041efe1ff05aaee39656a4d4fbba >--- /dev/null >+++ b/Tools/gstreamer/patches/gst-plugins-good-0001-qtdemux-Detect-and-expose-CEA-608-708-Closed-Caption.patch >@@ -0,0 +1,234 @@ >+From 2869edeea29a022007a99db2df41b5a7e1a3025c Mon Sep 17 00:00:00 2001 >+From: Edward Hervey <edward@centricular.com> >+Date: Wed, 31 Jan 2018 15:10:03 +0100 >+Subject: [PATCH] qtdemux: Detect and expose CEA 608/708 Closed Caption tracks >+ >+https://bugzilla.gnome.org/show_bug.cgi?id=606643 >+--- >+ gst/isomp4/fourcc.h | 6 ++ >+ gst/isomp4/qtdemux.c | 151 ++++++++++++++++++++++++++++++++++++- >+ gst/isomp4/qtdemux_types.c | 1 + >+ 3 files changed, 156 insertions(+), 2 deletions(-) >+ >+diff --git a/gst/isomp4/fourcc.h b/gst/isomp4/fourcc.h >+index be5c7c04e..6f467ffbb 100644 >+--- a/gst/isomp4/fourcc.h >++++ b/gst/isomp4/fourcc.h >+@@ -95,6 +95,12 @@ G_BEGIN_DECLS >+ #define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1') >+ #define FOURCC_avc3 GST_MAKE_FOURCC('a','v','c','3') >+ #define FOURCC_avcC GST_MAKE_FOURCC('a','v','c','C') >++#define FOURCC_c608 GST_MAKE_FOURCC('c','6','0','8') >++#define FOURCC_c708 GST_MAKE_FOURCC('c','7','0','8') >++#define FOURCC_ccdp GST_MAKE_FOURCC('c','c','d','p') >++#define FOURCC_cdat GST_MAKE_FOURCC('c','d','a','t') >++#define FOURCC_cdt2 GST_MAKE_FOURCC('c','d','t','2') >++#define FOURCC_clcp GST_MAKE_FOURCC('c','l','c','p') >+ #define FOURCC_clip GST_MAKE_FOURCC('c','l','i','p') >+ #define FOURCC_cmov GST_MAKE_FOURCC('c','m','o','v') >+ #define FOURCC_cmvd GST_MAKE_FOURCC('c','m','v','d') >+diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c >+index 79ef5f55b..f732e92b3 100644 >+--- a/gst/isomp4/qtdemux.c >++++ b/gst/isomp4/qtdemux.c >+@@ -5370,6 +5370,120 @@ gst_qtdemux_align_buffer (GstQTDemux * demux, >+ return buffer; >+ } >+ >++static guint8 * >++convert_to_ccdata (const guint8 * ccpair, guint8 ccpair_size, guint field, >++ gsize * res) >++{ >++ guint8 *storage; >++ gsize i; >++ >++ /* We are converting from pairs to triplets */ >++ *res = ccpair_size / 2 * 3; >++ storage = g_malloc (*res); >++ for (i = 0; i * 2 < ccpair_size; i += 1) { >++ if (field == 1) >++ storage[i * 3] = 0xfc; >++ else >++ storage[i * 3] = 0xfd; >++ storage[i * 3 + 1] = ccpair[i * 2]; >++ storage[i * 3 + 2] = ccpair[i * 2 + 1]; >++ } >++ >++ return storage; >++} >++ >++static guint8 * >++extract_cc_from_data (QtDemuxStream * stream, const guint8 * data, gsize size, >++ gsize * cclen) >++{ >++ guint8 *res = NULL; >++ guint32 atom_length, fourcc; >++ QtDemuxStreamStsdEntry *stsd_entry; >++ >++ GST_MEMDUMP ("caption atom", data, size); >++ >++ /* There might be multiple atoms */ >++ >++ *cclen = 0; >++ if (size < 8) >++ goto invalid_cdat; >++ atom_length = QT_UINT32 (data); >++ fourcc = QT_FOURCC (data + 4); >++ if (G_UNLIKELY (atom_length > size || atom_length == 8)) >++ goto invalid_cdat; >++ >++ GST_DEBUG_OBJECT (stream->pad, "here"); >++ >++ /* Check if we have somethig compatible */ >++ stsd_entry = CUR_STREAM (stream); >++ switch (stsd_entry->fourcc) { >++ case FOURCC_c608:{ >++ guint8 *cdat = NULL, *cdt2 = NULL; >++ gsize cdat_size = 0, cdt2_size = 0; >++ /* Should be cdat or cdt2 */ >++ if (fourcc != FOURCC_cdat && fourcc != FOURCC_cdt2) { >++ GST_WARNING_OBJECT (stream->pad, >++ "Unknown data atom (%" GST_FOURCC_FORMAT ") for CEA608", >++ GST_FOURCC_ARGS (fourcc)); >++ goto invalid_cdat; >++ } >++ /* Convert to cc_data triplet */ >++ if (fourcc == FOURCC_cdat) >++ cdat = convert_to_ccdata (data + 8, atom_length - 8, 1, &cdat_size); >++ else >++ cdt2 = convert_to_ccdata (data + 8, atom_length - 8, 2, &cdt2_size); >++ GST_DEBUG_OBJECT (stream->pad, "size:%" G_GSIZE_FORMAT " atom_length:%u", >++ size, atom_length); >++ /* Check for another atom ? */ >++ if (size > atom_length + 8) { >++ guint32 new_atom_length = QT_UINT32 (data + atom_length); >++ if (size <= atom_length + new_atom_length) { >++ fourcc = QT_FOURCC (data + atom_length + 4); >++ if (fourcc == FOURCC_cdat) >++ cdat = >++ convert_to_ccdata (data + atom_length + 8, new_atom_length - 8, >++ 1, &cdat_size); >++ else >++ cdt2 = >++ convert_to_ccdata (data + atom_length + 8, new_atom_length - 8, >++ 2, &cdt2_size); >++ } >++ } >++ *cclen = cdat_size + cdt2_size; >++ res = g_malloc (*cclen); >++ if (cdat_size) >++ memcpy (res, cdat, cdat_size); >++ if (cdt2_size) >++ memcpy (res + cdat_size, cdt2, cdt2_size); >++ g_free (cdat); >++ g_free (cdt2); >++ } >++ break; >++ case FOURCC_c708: >++ if (fourcc != FOURCC_ccdp) { >++ GST_WARNING_OBJECT (stream->pad, >++ "Unknown data atom (%" GST_FOURCC_FORMAT ") for CEA708", >++ GST_FOURCC_ARGS (fourcc)); >++ goto invalid_cdat; >++ } >++ *cclen = atom_length - 8; >++ res = g_memdup (data + 8, *cclen); >++ break; >++ default: >++ /* Keep this here in case other closed caption formats are added */ >++ g_assert_not_reached (); >++ break; >++ } >++ >++ GST_MEMDUMP ("Output", res, *cclen); >++ return res; >++ >++ /* Errors */ >++invalid_cdat: >++ GST_WARNING ("[cdat] atom is too small or invalid"); >++ return NULL; >++} >++ >+ /* the input buffer metadata must be writable, >+ * but time/duration etc not yet set and need not be preserved */ >+ static GstBuffer * >+@@ -5390,7 +5504,7 @@ gst_qtdemux_process_buffer (GstQTDemux * qtdemux, QtDemuxStream * stream, >+ >+ if (G_UNLIKELY (stream->subtype != FOURCC_text >+ && stream->subtype != FOURCC_sbtl && >+- stream->subtype != FOURCC_subp)) { >++ stream->subtype != FOURCC_subp && stream->subtype != FOURCC_clcp)) { >+ return buf; >+ } >+ >+@@ -5408,6 +5522,23 @@ gst_qtdemux_process_buffer (GstQTDemux * qtdemux, QtDemuxStream * stream, >+ return buf; >+ } >+ >++ if (stream->subtype == FOURCC_clcp) { >++ guint8 *cc; >++ gsize cclen = 0; >++ /* For closed caption, we need to extract the information from the >++ * [cdat],[cdt2] or [ccdp] atom */ >++ cc = extract_cc_from_data (stream, map.data, map.size, &cclen); >++ gst_buffer_unmap (buf, &map); >++ gst_buffer_unref (buf); >++ if (cc) { >++ buf = _gst_buffer_new_wrapped (cc, cclen, g_free); >++ } else { >++ /* Conversion failed or there's nothing */ >++ buf = NULL; >++ } >++ return buf; >++ } >++ >+ nsize = GST_READ_UINT16_BE (map.data); >+ nsize = MIN (nsize, map.size - 2); >+ >+@@ -11557,7 +11688,8 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) >+ } >+ entry->sampled = TRUE; >+ } else if (stream->subtype == FOURCC_subp || stream->subtype == FOURCC_text >+- || stream->subtype == FOURCC_sbtl || stream->subtype == FOURCC_subt) { >++ || stream->subtype == FOURCC_sbtl || stream->subtype == FOURCC_subt >++ || stream->subtype == FOURCC_clcp) { >+ >+ entry->sampled = TRUE; >+ entry->sparse = TRUE; >+@@ -14548,6 +14680,21 @@ qtdemux_sub_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, >+ _codec ("XML subtitles"); >+ caps = gst_caps_new_empty_simple ("application/ttml+xml"); >+ break; >++ case FOURCC_c608: >++ _codec ("CEA 608 Closed Caption"); >++ caps = >++ gst_caps_new_simple ("closedcaption/x-cea-608", "format", >++ G_TYPE_STRING, "cc_data", NULL); >++ stream->need_process = TRUE; >++ break; >++ case FOURCC_c708: >++ _codec ("CEA 708 Closed Caption"); >++ caps = >++ gst_caps_new_simple ("closedcaption/x-cea-708", "format", >++ G_TYPE_STRING, "cdp", NULL); >++ stream->need_process = TRUE; >++ break; >++ >+ default: >+ { >+ caps = _get_unknown_codec_name ("text", fourcc); >+diff --git a/gst/isomp4/qtdemux_types.c b/gst/isomp4/qtdemux_types.c >+index 88db8c2ce..1d5840394 100644 >+--- a/gst/isomp4/qtdemux_types.c >++++ b/gst/isomp4/qtdemux_types.c >+@@ -213,6 +213,7 @@ static const QtNodeType qt_node_types[] = { >+ {FOURCC_pssh, "protection system specific header", 0}, >+ {FOURCC_tenc, "track encryption", 0}, >+ {FOURCC_stpp, "XML subtitle sample entry", 0}, >++ {FOURCC_clcp, "Closed Caption", 0}, >+ {0, "unknown", 0,}, >+ }; >+ >+-- >+2.18.0 >+ >diff --git a/Tools/gstreamer/patches/gst-plugins-good-0004-qtdemux-Add-initial-support-for-AV1-demuxing.patch b/Tools/gstreamer/patches/gst-plugins-good-0004-qtdemux-Add-initial-support-for-AV1-demuxing.patch >new file mode 100644 >index 0000000000000000000000000000000000000000..3f2b4973eff7284053009db98913009969b2cf53 >--- /dev/null >+++ b/Tools/gstreamer/patches/gst-plugins-good-0004-qtdemux-Add-initial-support-for-AV1-demuxing.patch >@@ -0,0 +1,123 @@ >+From b6e8c6323e01249bb3ac4f121c3adc3ea8d924bf Mon Sep 17 00:00:00 2001 >+From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com> >+Date: Wed, 25 Jul 2018 10:43:11 -0400 >+Subject: [PATCH] qtdemux: Add initial support for AV1 demuxing >+ >+Following the spec at >+https://aomediacodec.github.io/av1-isobmff/ >+--- >+ gst/isomp4/fourcc.h | 1 + >+ gst/isomp4/qtdemux.c | 4 ++++ >+ gst/isomp4/qtdemux_dump.c | 49 ++++++++++++++++++++++++++++++++++++++ >+ gst/isomp4/qtdemux_types.c | 1 + >+ 4 files changed, 55 insertions(+) >+ >+diff --git a/gst/isomp4/fourcc.h b/gst/isomp4/fourcc.h >+index 6f467ffbb..c06b69418 100644 >+--- a/gst/isomp4/fourcc.h >++++ b/gst/isomp4/fourcc.h >+@@ -264,6 +264,7 @@ G_BEGIN_DECLS >+ #define FOURCC_wide GST_MAKE_FOURCC('w','i','d','e') >+ #define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b') >+ #define FOURCC_lpcm GST_MAKE_FOURCC('l','p','c','m') >++#define FOURCC_av01 GST_MAKE_FOURCC('a','v','0','1') >+ >+ #define FOURCC_cfhd GST_MAKE_FOURCC('C','F','H','D') >+ #define FOURCC_ap4x GST_MAKE_FOURCC('a','p','4','x') >+diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c >+index 3efb5ba9d..7a682833f 100644 >+--- a/gst/isomp4/qtdemux.c >++++ b/gst/isomp4/qtdemux.c >+@@ -14651,6 +14651,10 @@ qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, >+ caps = gst_caps_new_simple ("video/x-wmv", >+ "wmvversion", G_TYPE_INT, 3, "format", G_TYPE_STRING, "WVC1", NULL); >+ break; >++ case FOURCC_av01: >++ _codec ("AV1"); >++ caps = gst_caps_new_empty_simple ("video/x-av1"); >++ break; >+ case GST_MAKE_FOURCC ('k', 'p', 'c', 'd'): >+ default: >+ { >+diff --git a/gst/isomp4/qtdemux_dump.c b/gst/isomp4/qtdemux_dump.c >+index 5ff2e9288..25921dfe2 100644 >+--- a/gst/isomp4/qtdemux_dump.c >++++ b/gst/isomp4/qtdemux_dump.c >+@@ -303,6 +303,51 @@ qtdemux_dump_stsd_avc1 (GstQTDemux * qtdemux, GstByteReader * data, guint size, >+ return TRUE; >+ } >+ >++ >++static gboolean >++qtdemux_dump_stsd_av01 (GstQTDemux * qtdemux, GstByteReader * data, guint size, >++ int depth) >++{ >++ guint compressor_len; >++ char compressor_name[32]; >++ >++ /* Size of av01 = 78 bytes */ >++ if (size < (6 + 2 + 4 + 12 + 2 + 2 + 4 + 4 + 4 + 2 + 1 + 31 + 2 + 2)) >++ return FALSE; >++ >++ gst_byte_reader_skip_unchecked (data, 6); >++ GST_LOG_OBJECT (qtdemux, "%*s data reference:%d", depth, "", >++ GET_UINT16 (data)); >++ GST_LOG_OBJECT (qtdemux, "%*s version/rev.: %08x", depth, "", >++ GET_UINT32 (data)); >++ gst_byte_reader_skip_unchecked (data, 12); /* pre-defined & reserved */ >++ GST_LOG_OBJECT (qtdemux, "%*s width: %u", depth, "", >++ GET_UINT16 (data)); >++ GST_LOG_OBJECT (qtdemux, "%*s height: %u", depth, "", >++ GET_UINT16 (data)); >++ GST_LOG_OBJECT (qtdemux, "%*s horiz. resol: %g", depth, "", >++ GET_FP32 (data)); >++ GST_LOG_OBJECT (qtdemux, "%*s vert. resol.: %g", depth, "", >++ GET_FP32 (data)); >++ GST_LOG_OBJECT (qtdemux, "%*s data size: %u", depth, "", >++ GET_UINT32 (data)); >++ GST_LOG_OBJECT (qtdemux, "%*s frame count: %u", depth, "", >++ GET_UINT16 (data)); >++ /* something is not right with this, it's supposed to be a string but it's >++ * not apparently, so just skip this for now */ >++ compressor_len = MAX (GET_UINT8 (data), 31); >++ memcpy (compressor_name, gst_byte_reader_get_data_unchecked (data, 31), 31); >++ compressor_name[compressor_len] = 0; >++ GST_LOG_OBJECT (qtdemux, "%*s compressor: %s", depth, "", >++ compressor_name); >++ GST_LOG_OBJECT (qtdemux, "%*s depth: %u", depth, "", >++ GET_UINT16 (data)); >++ GST_LOG_OBJECT (qtdemux, "%*s color table ID:%u", depth, "", >++ GET_UINT16 (data)); >++ >++ return TRUE; >++} >++ >+ gboolean >+ qtdemux_dump_stsd (GstQTDemux * qtdemux, GstByteReader * data, int depth) >+ { >+@@ -353,6 +398,10 @@ qtdemux_dump_stsd (GstQTDemux * qtdemux, GstByteReader * data, int depth) >+ if (!qtdemux_dump_unknown (qtdemux, &sub, depth + 1)) >+ return FALSE; >+ break; >++ case FOURCC_av01: >++ if (!qtdemux_dump_stsd_av01 (qtdemux, &sub, size, depth + 1)) >++ return FALSE; >++ break; >+ default: >+ /* Unknown stsd data, dump the bytes */ >+ if (!qtdemux_dump_unknown (qtdemux, &sub, depth + 1)) >+diff --git a/gst/isomp4/qtdemux_types.c b/gst/isomp4/qtdemux_types.c >+index 1d5840394..68f98bd45 100644 >+--- a/gst/isomp4/qtdemux_types.c >++++ b/gst/isomp4/qtdemux_types.c >+@@ -214,6 +214,7 @@ static const QtNodeType qt_node_types[] = { >+ {FOURCC_tenc, "track encryption", 0}, >+ {FOURCC_stpp, "XML subtitle sample entry", 0}, >+ {FOURCC_clcp, "Closed Caption", 0}, >++ {FOURCC_av01, "AV1 Sample Entry", 0}, >+ {0, "unknown", 0,}, >+ }; >+ >+-- >+2.18.0 >+ >diff --git a/Tools/gstreamer/patches/gst-plugins-good-0005-qtdemux-Extract-AV1-codec_data-and-put-it-in-the-cap.patch b/Tools/gstreamer/patches/gst-plugins-good-0005-qtdemux-Extract-AV1-codec_data-and-put-it-in-the-cap.patch >new file mode 100644 >index 0000000000000000000000000000000000000000..66b323e8fd2fc3a60c0eaaa4d90eb52e58a87330 >--- /dev/null >+++ b/Tools/gstreamer/patches/gst-plugins-good-0005-qtdemux-Extract-AV1-codec_data-and-put-it-in-the-cap.patch >@@ -0,0 +1,112 @@ >+From 43ee4055c3d03a9f99acdf3c05f45e154899edef Mon Sep 17 00:00:00 2001 >+From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com> >+Date: Wed, 25 Jul 2018 14:31:39 -0400 >+Subject: [PATCH] qtdemux: Extract AV1 codec_data and put it in the caps >+ >+Also extract the presentation-delay and put it in the caps. >+--- >+ gst/isomp4/fourcc.h | 1 + >+ gst/isomp4/qtdemux.c | 75 ++++++++++++++++++++++++++++++++++++++++++++ >+ 2 files changed, 76 insertions(+) >+ >+diff --git a/gst/isomp4/fourcc.h b/gst/isomp4/fourcc.h >+index c06b69418..e18e6c2c9 100644 >+--- a/gst/isomp4/fourcc.h >++++ b/gst/isomp4/fourcc.h >+@@ -265,6 +265,7 @@ G_BEGIN_DECLS >+ #define FOURCC_zlib GST_MAKE_FOURCC('z','l','i','b') >+ #define FOURCC_lpcm GST_MAKE_FOURCC('l','p','c','m') >+ #define FOURCC_av01 GST_MAKE_FOURCC('a','v','0','1') >++#define FOURCC_av1C GST_MAKE_FOURCC('a','v','1','C') >+ >+ #define FOURCC_cfhd GST_MAKE_FOURCC('C','F','H','D') >+ #define FOURCC_ap4x GST_MAKE_FOURCC('a','p','4','x') >+diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c >+index 7a682833f..d1ce320b8 100644 >+--- a/gst/isomp4/qtdemux.c >++++ b/gst/isomp4/qtdemux.c >+@@ -11187,6 +11187,81 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) >+ } >+ break; >+ } >++ case FOURCC_av01: >++ { >++ gint len = QT_UINT32 (stsd_entry_data) - 0x56; >++ const guint8 *av1_data = stsd_entry_data + 0x56; >++ >++ /* find av1C */ >++ while (len >= 0x8) { >++ gint size; >++ >++ if (QT_UINT32 (av1_data) <= len) >++ size = QT_UINT32 (av1_data) - 0x8; >++ else >++ size = len - 0x8; >++ >++ if (size < 1) >++ /* No real data, so break out */ >++ break; >++ >++ switch (QT_FOURCC (av1_data + 0x4)) { >++ case FOURCC_av1C: >++ { >++ /* parse, if found */ >++ GstBuffer *buf; >++ guint8 pres_delay_field; >++ >++ GST_DEBUG_OBJECT (qtdemux, >++ "found av1C codec_data in stsd of size %d", size); >++ >++ /* not enough data, just ignore and hope for the best */ >++ if (size < 5) >++ break; >++ >++ /* Content is: >++ * 4 bytes: atom length >++ * 4 bytes: fourcc >++ * 1 byte: version >++ * 3 bytes: flags >++ * 3 bits: reserved >++ * 1 bits: initial_presentation_delay_present >++ * 4 bits: initial_presentation_delay (if present else reserved >++ * rest: OBUs. >++ */ >++ >++ if (av1_data[9] != 0) { >++ GST_WARNING ("Unknown version %d of av1C box", av1_data[9]); >++ break; >++ } >++ >++ /* We skip initial_presentation_delay* for now */ >++ pres_delay_field = *(av1_data + 12); >++ if (pres_delay_field & (1 << 5)) { >++ gst_caps_set_simple (entry->caps, >++ "presentation-delay", G_TYPE_INT, >++ (gint) (pres_delay_field & 0x0F) + 1, NULL); >++ } >++ if (size > 5) { >++ buf = gst_buffer_new_and_alloc (size - 5); >++ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_HEADER); >++ gst_buffer_fill (buf, 0, av1_data + 13, size - 5); >++ gst_caps_set_simple (entry->caps, >++ "codec_data", GST_TYPE_BUFFER, buf, NULL); >++ gst_buffer_unref (buf); >++ } >++ break; >++ } >++ default: >++ break; >++ } >++ >++ len -= size + 8; >++ av1_data += size + 8; >++ } >++ >++ break; >++ } >+ default: >+ break; >+ } >+-- >+2.18.0 >+ >diff --git a/Tools/gstreamer/patches/gst-plugins-good-0006-qtdemux-Recognize-more-AV1-atoms.patch b/Tools/gstreamer/patches/gst-plugins-good-0006-qtdemux-Recognize-more-AV1-atoms.patch >new file mode 100644 >index 0000000000000000000000000000000000000000..fd5757482219db90110051b8774e282ba081cce8 >--- /dev/null >+++ b/Tools/gstreamer/patches/gst-plugins-good-0006-qtdemux-Recognize-more-AV1-atoms.patch >@@ -0,0 +1,44 @@ >+From e07ce9afb4edb2ea898763c7ea11f0af2704104e Mon Sep 17 00:00:00 2001 >+From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= <olivier.crete@collabora.com> >+Date: Wed, 25 Jul 2018 16:51:38 -0400 >+Subject: [PATCH] qtdemux: Recognize more AV1 atoms >+ >+--- >+ gst/isomp4/fourcc.h | 4 ++++ >+ gst/isomp4/qtdemux_types.c | 5 +++++ >+ 2 files changed, 9 insertions(+) >+ >+diff --git a/gst/isomp4/fourcc.h b/gst/isomp4/fourcc.h >+index e18e6c2c9..6c425e6f9 100644 >+--- a/gst/isomp4/fourcc.h >++++ b/gst/isomp4/fourcc.h >+@@ -266,6 +266,10 @@ G_BEGIN_DECLS >+ #define FOURCC_lpcm GST_MAKE_FOURCC('l','p','c','m') >+ #define FOURCC_av01 GST_MAKE_FOURCC('a','v','0','1') >+ #define FOURCC_av1C GST_MAKE_FOURCC('a','v','1','C') >++#define FOURCC_av1f GST_MAKE_FOURCC('a','v','1','f') >++#define FOURCC_av1m GST_MAKE_FOURCC('a','v','1','m') >++#define FOURCC_av1s GST_MAKE_FOURCC('a','v','1','s') >++#define FOURCC_av1M GST_MAKE_FOURCC('a','v','1','M') >+ >+ #define FOURCC_cfhd GST_MAKE_FOURCC('C','F','H','D') >+ #define FOURCC_ap4x GST_MAKE_FOURCC('a','p','4','x') >+diff --git a/gst/isomp4/qtdemux_types.c b/gst/isomp4/qtdemux_types.c >+index 68f98bd45..9ab2e7e3e 100644 >+--- a/gst/isomp4/qtdemux_types.c >++++ b/gst/isomp4/qtdemux_types.c >+@@ -215,6 +215,11 @@ static const QtNodeType qt_node_types[] = { >+ {FOURCC_stpp, "XML subtitle sample entry", 0}, >+ {FOURCC_clcp, "Closed Caption", 0}, >+ {FOURCC_av01, "AV1 Sample Entry", 0}, >++ {FOURCC_av1C, "AV1 Codec Configuration", 0}, >++ {FOURCC_av1f, "AV1 Forward Key Frame sample group entry", 0}, >++ {FOURCC_av1m, "AV1 Multi-Frame sample group entry", 0}, >++ {FOURCC_av1s, "AV1 S-Frame sample group entry", 0}, >++ {FOURCC_av1M, "AV1 Metadata sample group entry", 0}, >+ {0, "unknown", 0,}, >+ }; >+ >+-- >+2.18.0 >+ >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 3fc07f78fe42597a91bb3660a627f51ab4a6a650..a005b6e7ed69f0fc8c2f087aad27bade4535208a 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,16 @@ >+2018-09-17 Philippe Normand <pnormand@igalia.com> >+ >+ [GStreamer] Add support for AV1 decoding >+ https://bugs.webkit.org/show_bug.cgi?id=189647 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Layout test for AV1 canPlay() compatiblity checking. Right now >+ GStreamer-based ports are the only ones expecting to support AV1. >+ >+ * media/media-can-play-av1.html: Added. >+ * platform/gtk/media/media-can-play-av1-expected.txt: Added. >+ > 2018-09-17 Sihui Liu <sihui_liu@apple.com> > > Move IndexedDB to Network Process >diff --git a/LayoutTests/media/media-can-play-av1-expected.txt b/LayoutTests/media/media-can-play-av1-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..e182f3d22cdad3397a87ce92020039941fc903aa >--- /dev/null >+++ b/LayoutTests/media/media-can-play-av1-expected.txt >@@ -0,0 +1,11 @@ >+ >+Test HTMLMediaElement canPlayType() method for the AV1 codec. >+ >+These tests may be expected to fail if the WebKit port does not support the format. >+ >+EXPECTED (video.canPlayType('video/mp4; codecs=av1') == '') OK >+EXPECTED (video.canPlayType('video/webm; codecs=av1') == '') OK >+EXPECTED (video.canPlayType('video/mp4; codecs=av01.0.04M.08') == 'probably') OK >+EXPECTED (video.canPlayType('video/webm; codecs=av01.0.04M.08') == 'probably') OK >+END OF TEST >+ >diff --git a/LayoutTests/media/media-can-play-av1.html b/LayoutTests/media/media-can-play-av1.html >new file mode 100644 >index 0000000000000000000000000000000000000000..9f07c8450d3feaaae72d4ea10968c870bcf9bcfe >--- /dev/null >+++ b/LayoutTests/media/media-can-play-av1.html >@@ -0,0 +1,24 @@ >+<!DOCTYPE html> >+<html> >+ <head> >+ <script src="video-test.js"></script> >+ <script> >+ function start() { >+ video = mediaElement = document.getElementsByTagName('video')[0]; >+ >+ testExpected("video.canPlayType('video/mp4; codecs=av1')", ""); >+ testExpected("video.canPlayType('video/webm; codecs=av1')", ""); >+ >+ testExpected("video.canPlayType('video/mp4; codecs=av01.0.04M.08')", "probably"); >+ testExpected("video.canPlayType('video/webm; codecs=av01.0.04M.08')", "probably"); >+ >+ endTest(); >+ } >+ </script> >+ </head> >+ <body onload="start()"> >+ <video controls></video> >+ <p>Test HTMLMediaElement <em>canPlayType()</em> method for the AV1 codec.</p> >+ <p>These tests may be expected to fail if the WebKit port does not support the format.</p> >+ </body> >+</html> >diff --git a/LayoutTests/platform/ios/media/media-can-play-av1-expected.txt b/LayoutTests/platform/ios/media/media-can-play-av1-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..ce527cc8cc6fc249fa9878279b2b6ec93c6e9766 >--- /dev/null >+++ b/LayoutTests/platform/ios/media/media-can-play-av1-expected.txt >@@ -0,0 +1,11 @@ >+ >+Test HTMLMediaElement canPlayType() method for the AV1 codec. >+ >+These tests may be expected to fail if the WebKit port does not support the format. >+ >+EXPECTED (video.canPlayType('video/mp4; codecs=av1') == ''), OBSERVED 'maybe' FAIL >+EXPECTED (video.canPlayType('video/webm; codecs=av1') == '') OK >+EXPECTED (video.canPlayType('video/mp4; codecs=av01.0.04M.08') == 'probably'), OBSERVED 'maybe' FAIL >+EXPECTED (video.canPlayType('video/webm; codecs=av01.0.04M.08') == 'probably'), OBSERVED '' FAIL >+END OF TEST >+ >diff --git a/LayoutTests/platform/mac/media/media-can-play-av1-expected.txt b/LayoutTests/platform/mac/media/media-can-play-av1-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..ce527cc8cc6fc249fa9878279b2b6ec93c6e9766 >--- /dev/null >+++ b/LayoutTests/platform/mac/media/media-can-play-av1-expected.txt >@@ -0,0 +1,11 @@ >+ >+Test HTMLMediaElement canPlayType() method for the AV1 codec. >+ >+These tests may be expected to fail if the WebKit port does not support the format. >+ >+EXPECTED (video.canPlayType('video/mp4; codecs=av1') == ''), OBSERVED 'maybe' FAIL >+EXPECTED (video.canPlayType('video/webm; codecs=av1') == '') OK >+EXPECTED (video.canPlayType('video/mp4; codecs=av01.0.04M.08') == 'probably'), OBSERVED 'maybe' FAIL >+EXPECTED (video.canPlayType('video/webm; codecs=av01.0.04M.08') == 'probably'), OBSERVED '' FAIL >+END OF TEST >+
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 189647
:
349855
|
349856
|
349866
|
349867
|
349868
|
349869
|
349870
|
349871
|
349882
|
349883
|
350017
|
350018
|
350024
|
350027