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/5097>
This commit is contained in:
Guillaume Desmottes 2023-07-25 15:15:58 +02:00
parent 5114fb4170
commit 6b339b5d39

View file

@ -1803,19 +1803,15 @@ gst_video_flip_sink_event (GstBaseTransform * trans, GstEvent * event)
}
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);
}
} else {
// no orientation in tag