video-overlay-composition: Allow empty overlay compositions
authorSebastian Dröge <sebastian@centricular.com>
Mon, 16 Aug 2021 07:19:07 +0000 (10:19 +0300)
committerNicolas Dufresne <nicolas@ndufresne.ca>
Mon, 16 Aug 2021 21:13:27 +0000 (21:13 +0000)
Allowing to pass NULL to the constructor removes the need to
special-case the first rectangle in calling code and generally
simplifies application code.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/merge_requests/1256>

gst-libs/gst/video/video-overlay-composition.c

index 9b6c31f..de47a2b 100644 (file)
@@ -327,12 +327,14 @@ gst_video_overlay_composition_free (GstMiniObject * mini_obj)
 
 /**
  * gst_video_overlay_composition_new:
- * @rectangle: (transfer none): a #GstVideoOverlayRectangle to add to the
+ * @rectangle: (transfer none) (nullable): a #GstVideoOverlayRectangle to add to the
  *     composition
  *
  * Creates a new video overlay composition object to hold one or more
  * overlay rectangles.
  *
+ * Note that since 1.20 this allows to pass %NULL for @rectangle.
+ *
  * Returns: (transfer full): a new #GstVideoOverlayComposition. Unref with
  *     gst_video_overlay_composition_unref() when no longer needed.
  */
@@ -341,11 +343,8 @@ gst_video_overlay_composition_new (GstVideoOverlayRectangle * rectangle)
 {
   GstVideoOverlayComposition *comp;
 
-
-  /* FIXME: should we allow empty compositions? Could also be expressed as
-   * buffer without a composition on it. Maybe there are cases where doing
-   * an empty new + _add() in a loop is easier? */
-  g_return_val_if_fail (GST_IS_VIDEO_OVERLAY_RECTANGLE (rectangle), NULL);
+  g_return_val_if_fail (GST_IS_VIDEO_OVERLAY_RECTANGLE (rectangle)
+      || NULL, NULL);
 
   comp = g_slice_new0 (GstVideoOverlayComposition);
 
@@ -355,18 +354,16 @@ gst_video_overlay_composition_new (GstVideoOverlayRectangle * rectangle)
       NULL, (GstMiniObjectFreeFunction) gst_video_overlay_composition_free);
 
   comp->rectangles = g_new0 (GstVideoOverlayRectangle *, RECTANGLE_ARRAY_STEP);
-  comp->rectangles[0] = gst_video_overlay_rectangle_ref (rectangle);
-  gst_mini_object_add_parent (GST_MINI_OBJECT_CAST (rectangle),
-      GST_MINI_OBJECT_CAST (comp));
-  comp->num_rectangles = 1;
 
   comp->seq_num = gst_video_overlay_get_seqnum ();
 
   /* since the rectangle was created earlier, its seqnum is smaller than ours */
   comp->min_seq_num_used = rectangle->seq_num;
 
-  GST_LOG ("new composition %p: seq_num %u with rectangle %p", comp,
-      comp->seq_num, rectangle);
+  GST_LOG ("new composition %p: seq_num %u", comp, comp->seq_num);
+
+  if (rectangle)
+    gst_video_overlay_composition_add_rectangle (comp, rectangle);
 
   return comp;
 }