diff options
author | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2021-04-23 14:37:46 -0400 |
---|---|---|
committer | Nicolas Dufresne <nicolas.dufresne@collabora.com> | 2021-05-11 16:52:22 -0400 |
commit | d877f7f81609019bf1e268b56db7b8e8464bdd82 (patch) | |
tree | 1b83ecbc4fc6acae27cb90232bb01a65a6ed2476 /gst | |
parent | b2e857efc67c474862c8ce3c5aa2dffbfec31015 (diff) |
matroskademux: Advertise codec-alpha in caps
This will be used to select the appropriate decoders. We also only attach the
GstVideoCodecAlphaMeta if the AlphaMode element is set, this is to stay on the
safe side and mimic what browsers (verified in Firefox and Chromium code) do.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/968>
Diffstat (limited to 'gst')
-rw-r--r-- | gst/matroska/matroska-demux.c | 24 | ||||
-rw-r--r-- | gst/matroska/matroska-ids.c | 1 | ||||
-rw-r--r-- | gst/matroska/matroska-ids.h | 3 |
3 files changed, 27 insertions, 1 deletions
diff --git a/gst/matroska/matroska-demux.c b/gst/matroska/matroska-demux.c index a1e5d1c9e..ca74c86c6 100644 --- a/gst/matroska/matroska-demux.c +++ b/gst/matroska/matroska-demux.c @@ -1123,6 +1123,22 @@ gst_matroska_demux_parse_stream (GstMatroskaDemux * demux, GstEbmlRead * ebml, break; } + case GST_MATROSKA_ID_VIDEOALPHAMODE: + { + guint64 num; + + if ((ret = gst_ebml_read_uint (ebml, &id, &num)) != GST_FLOW_OK) + break; + + GST_DEBUG_OBJECT (demux, "AlphaMode: %" G_GUINT64_FORMAT, num); + + if (num == 1) + videocontext->alpha_mode = TRUE; + else + videocontext->alpha_mode = FALSE; + break; + } + default: GST_WARNING_OBJECT (demux, "Unknown TrackVideo subelement 0x%x - ignoring", id); @@ -4982,7 +4998,9 @@ gst_matroska_demux_parse_blockgroup_or_simpleblock (GstMatroskaDemux * demux, GST_FIXME_OBJECT (demux, "Fix block additions with laced buffers"); while ((blockadd = g_queue_pop_head (&additions))) { - if (blockadd->id == 1 + GstMatroskaTrackVideoContext *videocontext = + (GstMatroskaTrackVideoContext *) stream; + if (blockadd->id == 1 && videocontext->alpha_mode && (!strcmp (stream->codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VP8) || !strcmp (stream->codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VP9))) { @@ -6577,9 +6595,13 @@ gst_matroska_demux_video_caps (GstMatroskaTrackVideoContext * *codec_name = g_strdup_printf ("Dirac"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VP8)) { caps = gst_caps_new_empty_simple ("video/x-vp8"); + if (videocontext->alpha_mode) + gst_caps_set_simple (caps, "codec-alpha", G_TYPE_BOOLEAN, TRUE, NULL); *codec_name = g_strdup_printf ("On2 VP8"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_VP9)) { caps = gst_caps_new_empty_simple ("video/x-vp9"); + if (videocontext->alpha_mode) + gst_caps_set_simple (caps, "codec-alpha", G_TYPE_BOOLEAN, TRUE, NULL); *codec_name = g_strdup_printf ("On2 VP9"); } else if (!strcmp (codec_id, GST_MATROSKA_CODEC_ID_VIDEO_AV1)) { caps = gst_caps_new_empty_simple ("video/x-av1"); diff --git a/gst/matroska/matroska-ids.c b/gst/matroska/matroska-ids.c index 3722822b1..633171fa1 100644 --- a/gst/matroska/matroska-ids.c +++ b/gst/matroska/matroska-ids.c @@ -65,6 +65,7 @@ gst_matroska_track_init_video_context (GstMatroskaTrackContext ** p_context) video_context->earliest_time = GST_CLOCK_TIME_NONE; video_context->multiview_mode = GST_VIDEO_MULTIVIEW_MODE_NONE; video_context->multiview_flags = GST_VIDEO_MULTIVIEW_FLAGS_NONE; + video_context->alpha_mode = FALSE; video_context->colorimetry.range = GST_VIDEO_COLOR_RANGE_UNKNOWN; video_context->colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_UNKNOWN; video_context->colorimetry.transfer = GST_VIDEO_TRANSFER_UNKNOWN; diff --git a/gst/matroska/matroska-ids.h b/gst/matroska/matroska-ids.h index 8d4a685a9..ba44f104b 100644 --- a/gst/matroska/matroska-ids.h +++ b/gst/matroska/matroska-ids.h @@ -135,6 +135,7 @@ #define GST_MATROSKA_ID_VIDEOFIELDORDER 0x9D /* semi-draft */ #define GST_MATROSKA_ID_VIDEOSTEREOMODE 0x53B8 +#define GST_MATROSKA_ID_VIDEOALPHAMODE 0x53C0 #define GST_MATROSKA_ID_VIDEOASPECTRATIOTYPE 0x54B3 #define GST_MATROSKA_ID_VIDEOCOLOURSPACE 0x2EB524 /* semi-draft */ @@ -638,6 +639,8 @@ typedef struct _GstMatroskaTrackVideoContext { GstVideoMultiviewMode multiview_mode; GstVideoMultiviewFlags multiview_flags; + gboolean alpha_mode; + /* QoS */ GstClockTime earliest_time; |