videoflip: fix concurrent access when modifying the tag list
authorGuillaume Desmottes <guillaume.desmottes@onestream.live>
Tue, 25 Jul 2023 13:15:58 +0000 (15:15 +0200)
committerTim-Philipp Müller <tim@centricular.com>
Tue, 25 Jul 2023 16:32:50 +0000 (17:32 +0100)
We were checking if the tag list is writable, but it may actually be
shared through the same event (tee upstream or multiple consumers).

Fix a bug where multiple branches have a videoflip element checking the
taglist. The first one was changing the orientation back to rotate-0
which was resetting the other instances.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5099>

subprojects/gst-plugins-good/gst/videofilter/gstvideoflip.c

index bd7cbeb..718ab45 100644 (file)
@@ -1790,19 +1790,15 @@ gst_video_flip_sink_event (GstBaseTransform * trans, GstEvent * event)
         gst_video_flip_set_method (vf, method, TRUE);
 
         if (vf->method == GST_VIDEO_ORIENTATION_AUTO) {
-          /* update the orientation tag as we rotate the video accordingly */
-          if (gst_tag_list_is_writable (taglist)) {
-            gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE,
-                "image-orientation", "rotate-0", NULL);
-          } else {
-            taglist = gst_tag_list_copy (taglist);
-
-            gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE,
-                "image-orientation", "rotate-0", NULL);
-
-            gst_event_unref (event);
-            event = gst_event_new_tag (taglist);
-          }
+          /* Update the orientation tag as we rotate the video accordingly.
+           * The event (and so the tag list) can be shared so always copy both. */
+          taglist = gst_tag_list_copy (taglist);
+
+          gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE,
+              "image-orientation", "rotate-0", NULL);
+
+          gst_event_unref (event);
+          event = gst_event_new_tag (taglist);
         }
       }
       break;