mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-03 01:02:19 +00:00
compositor: Skip background if transparent and obscured
If the background is transparent and obscured by a pad that may or may not have alpha, we can still skip drawing it entirely AYUV 1080p ! compositor background=transparent ! fakesink - 75% faster
This commit is contained in:
parent
ba20aec539
commit
ba4484c6a0
1 changed files with 13 additions and 8 deletions
|
@ -314,7 +314,7 @@ clamp_rectangle (gint x, gint y, gint w, gint h, gint outer_width,
|
||||||
/* Call this with the lock taken */
|
/* Call this with the lock taken */
|
||||||
static gboolean
|
static gboolean
|
||||||
_pad_obscures_rectangle (GstVideoAggregator * vagg, GstVideoAggregatorPad * pad,
|
_pad_obscures_rectangle (GstVideoAggregator * vagg, GstVideoAggregatorPad * pad,
|
||||||
GstVideoRectangle rect)
|
GstVideoRectangle rect, gboolean rect_transparent)
|
||||||
{
|
{
|
||||||
GstVideoRectangle pad_rect;
|
GstVideoRectangle pad_rect;
|
||||||
GstCompositorPad *cpad = GST_COMPOSITOR_PAD (pad);
|
GstCompositorPad *cpad = GST_COMPOSITOR_PAD (pad);
|
||||||
|
@ -325,8 +325,10 @@ _pad_obscures_rectangle (GstVideoAggregator * vagg, GstVideoAggregatorPad * pad,
|
||||||
|
|
||||||
/* Can't obscure if it's transparent and if the format has an alpha component
|
/* Can't obscure if it's transparent and if the format has an alpha component
|
||||||
* we'd have to inspect every pixel to know if the frame is opaque, so assume
|
* we'd have to inspect every pixel to know if the frame is opaque, so assume
|
||||||
* it doesn't obscure. */
|
* it doesn't obscure. As a bonus, if the rectangle is fully transparent, we
|
||||||
if (cpad->alpha != 1.0 || GST_VIDEO_INFO_HAS_ALPHA (&pad->info))
|
* can also obscure it if we have alpha components on the pad */
|
||||||
|
if (!rect_transparent &&
|
||||||
|
(cpad->alpha != 1.0 || GST_VIDEO_INFO_HAS_ALPHA (&pad->info)))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
pad_rect.x = cpad->xpos;
|
pad_rect.x = cpad->xpos;
|
||||||
|
@ -393,7 +395,7 @@ gst_compositor_pad_prepare_frame (GstVideoAggregatorPad * pad,
|
||||||
* higher-zorder frames */
|
* higher-zorder frames */
|
||||||
l = g_list_find (GST_ELEMENT (vagg)->sinkpads, pad)->next;
|
l = g_list_find (GST_ELEMENT (vagg)->sinkpads, pad)->next;
|
||||||
for (; l; l = l->next) {
|
for (; l; l = l->next) {
|
||||||
if (_pad_obscures_rectangle (vagg, l->data, frame_rect)) {
|
if (_pad_obscures_rectangle (vagg, l->data, frame_rect, FALSE)) {
|
||||||
frame_obscured = TRUE;
|
frame_obscured = TRUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -837,7 +839,7 @@ _negotiated_caps (GstAggregator * agg, GstCaps * caps)
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_should_draw_background (GstVideoAggregator * vagg)
|
_should_draw_background (GstVideoAggregator * vagg, gboolean bg_transparent)
|
||||||
{
|
{
|
||||||
GstVideoRectangle bg_rect;
|
GstVideoRectangle bg_rect;
|
||||||
gboolean draw = TRUE;
|
gboolean draw = TRUE;
|
||||||
|
@ -849,7 +851,7 @@ _should_draw_background (GstVideoAggregator * vagg)
|
||||||
/* Check if the background is completely obscured by a pad
|
/* Check if the background is completely obscured by a pad
|
||||||
* TODO: Also skip if it's obscured by a combination of pads */
|
* TODO: Also skip if it's obscured by a combination of pads */
|
||||||
for (GList * l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) {
|
for (GList * l = GST_ELEMENT (vagg)->sinkpads; l; l = l->next) {
|
||||||
if (_pad_obscures_rectangle (vagg, l->data, bg_rect)) {
|
if (_pad_obscures_rectangle (vagg, l->data, bg_rect, bg_transparent)) {
|
||||||
draw = FALSE;
|
draw = FALSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -865,8 +867,11 @@ _draw_background (GstVideoAggregator * vagg, GstVideoFrame * outframe)
|
||||||
BlendFunction composite = comp->blend;
|
BlendFunction composite = comp->blend;
|
||||||
|
|
||||||
/* If one of the frames to be composited completely obscures the background,
|
/* If one of the frames to be composited completely obscures the background,
|
||||||
* don't bother drawing the background at all. */
|
* don't bother drawing the background at all. We can also always use the
|
||||||
if (!_should_draw_background (vagg))
|
* 'blend' BlendFunction in that case because it only changes if we have to
|
||||||
|
* overlay on top of a transparent background. */
|
||||||
|
if (!_should_draw_background (vagg,
|
||||||
|
comp->background == COMPOSITOR_BACKGROUND_TRANSPARENT))
|
||||||
return composite;
|
return composite;
|
||||||
|
|
||||||
switch (comp->background) {
|
switch (comp->background) {
|
||||||
|
|
Loading…
Reference in a new issue