videoflip: fix concurrent access when modifying the tag list

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>
This commit is contained in:
Guillaume Desmottes 2023-07-25 15:15:58 +02:00 committed by Tim-Philipp Müller
parent 1a3deef85f
commit bbca6cc8c8

View 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);
/* 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_tag_list_add (taglist, GST_TAG_MERGE_REPLACE,
"image-orientation", "rotate-0", NULL);
gst_event_unref (event);
event = gst_event_new_tag (taglist);
}
gst_event_unref (event);
event = gst_event_new_tag (taglist);
}
}
break;