d3dvideosink: use class lock when creating overlay textures

This commit is contained in:
Aaron Boxer 2019-12-06 23:19:11 -06:00
parent 51f823c98a
commit 52254ad31c

View File

@ -181,11 +181,13 @@ _is_overlay_in_composition (GstVideoOverlayComposition * composition,
GstFlowReturn GstFlowReturn
gst_d3d9_overlay_prepare (GstD3DVideoSink * sink, GstBuffer * buf) gst_d3d9_overlay_prepare (GstD3DVideoSink * sink, GstBuffer * buf)
{ {
GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink);
GList *l = NULL; GList *l = NULL;
GstVideoOverlayComposition *composition = NULL; GstVideoOverlayComposition *composition = NULL;
guint num_overlays, i; guint num_overlays, i;
GstVideoOverlayCompositionMeta *composition_meta = GstVideoOverlayCompositionMeta *composition_meta =
gst_buffer_get_video_overlay_composition_meta (buf); gst_buffer_get_video_overlay_composition_meta (buf);
gboolean found_new_overlay_rectangle = FALSE;
if (!composition_meta) { if (!composition_meta) {
gst_d3d9_overlay_free (sink); gst_d3d9_overlay_free (sink);
@ -197,13 +199,32 @@ gst_d3d9_overlay_prepare (GstD3DVideoSink * sink, GstBuffer * buf)
GST_DEBUG_OBJECT (sink, "GstVideoOverlayCompositionMeta found."); GST_DEBUG_OBJECT (sink, "GstVideoOverlayCompositionMeta found.");
/* add new overlays to list */ /* check for new overlays */
for (i = 0; i < num_overlays; i++) {
GstVideoOverlayRectangle *rectangle =
gst_video_overlay_composition_get_rectangle (composition, i);
if (!_is_rectangle_in_overlays (sink->d3d.overlay, rectangle)) {
found_new_overlay_rectangle = TRUE;
break;
}
}
/* add new overlays to list */
if (found_new_overlay_rectangle) {
GST_DEBUG_OBJECT (sink, "New overlay composition rectangles found.");
LOCK_CLASS (sink, klass);
if (!klass->d3d.refs) {
GST_ERROR_OBJECT (sink, "Direct3D object ref count = 0");
gst_d3d9_overlay_free (sink);
UNLOCK_CLASS (sink, klass);
return GST_FLOW_ERROR;
}
for (i = 0; i < num_overlays; i++) { for (i = 0; i < num_overlays; i++) {
GstVideoOverlayRectangle *rectangle = GstVideoOverlayRectangle *rectangle =
gst_video_overlay_composition_get_rectangle (composition, i); gst_video_overlay_composition_get_rectangle (composition, i);
if (!_is_rectangle_in_overlays (sink->d3d.overlay, rectangle)) { if (!_is_rectangle_in_overlays (sink->d3d.overlay, rectangle)) {
GstD3DVideoSinkClass *klass = GST_D3DVIDEOSINK_GET_CLASS (sink);
GstVideoOverlayFormatFlags flags; GstVideoOverlayFormatFlags flags;
gint x, y; gint x, y;
guint width, height; guint width, height;
@ -265,6 +286,8 @@ gst_d3d9_overlay_prepare (GstD3DVideoSink * sink, GstBuffer * buf)
sink->d3d.overlay = g_list_append (sink->d3d.overlay, overlay); sink->d3d.overlay = g_list_append (sink->d3d.overlay, overlay);
} }
} }
UNLOCK_CLASS (sink, klass);
}
/* remove old overlays from list */ /* remove old overlays from list */
while (l != NULL) { while (l != NULL) {
GList *next = l->next; GList *next = l->next;