/* Call this with the lock taken */
static gboolean
_pad_obscures_rectangle (GstVideoAggregator * vagg, GstVideoAggregatorPad * pad,
- GstVideoRectangle rect)
+ GstVideoRectangle rect, gboolean rect_transparent)
{
GstVideoRectangle pad_rect;
GstCompositorPad *cpad = GST_COMPOSITOR_PAD (pad);
/* 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
- * it doesn't obscure. */
- if (cpad->alpha != 1.0 || GST_VIDEO_INFO_HAS_ALPHA (&pad->info))
+ * it doesn't obscure. As a bonus, if the rectangle is fully transparent, we
+ * 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;
pad_rect.x = cpad->xpos;
* higher-zorder frames */
l = g_list_find (GST_ELEMENT (vagg)->sinkpads, pad)->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;
break;
}
}
static gboolean
-_should_draw_background (GstVideoAggregator * vagg)
+_should_draw_background (GstVideoAggregator * vagg, gboolean bg_transparent)
{
GstVideoRectangle bg_rect;
gboolean draw = TRUE;
/* Check if the background is completely obscured by a pad
* TODO: Also skip if it's obscured by a combination of pads */
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;
break;
}
BlendFunction composite = comp->blend;
/* If one of the frames to be composited completely obscures the background,
- * don't bother drawing the background at all. */
- if (!_should_draw_background (vagg))
+ * don't bother drawing the background at all. We can also always use the
+ * '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;
switch (comp->background) {