textoverlay: Use an external lock
Conflicts: ext/pango/gsttextoverlay.c ext/pango/gsttextoverlay.h
This commit is contained in:
parent
c66da2c74b
commit
bac5fd4c6a
@ -293,10 +293,13 @@ gst_base_text_overlay_line_align_get_type (void)
|
|||||||
return base_text_overlay_line_align_type;
|
return base_text_overlay_line_align_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define GST_BASE_TEXT_OVERLAY_GET_COND(ov) (((GstBaseTextOverlay *)ov)->cond)
|
#define GST_BASE_TEXT_OVERLAY_GET_LOCK(ov) (&GST_BASE_TEXT_OVERLAY (ov)->lock)
|
||||||
#define GST_BASE_TEXT_OVERLAY_WAIT(ov) (g_cond_wait (&GST_BASE_TEXT_OVERLAY_GET_COND (ov), GST_OBJECT_GET_LOCK (ov)))
|
#define GST_BASE_TEXT_OVERLAY_GET_COND(ov) (&GST_BASE_TEXT_OVERLAY (ov)->cond)
|
||||||
#define GST_BASE_TEXT_OVERLAY_SIGNAL(ov) (g_cond_signal (&GST_BASE_TEXT_OVERLAY_GET_COND (ov)))
|
#define GST_BASE_TEXT_OVERLAY_LOCK(ov) (g_mutex_lock (GST_BASE_TEXT_OVERLAY_GET_LOCK (ov)))
|
||||||
#define GST_BASE_TEXT_OVERLAY_BROADCAST(ov)(g_cond_broadcast (&GST_BASE_TEXT_OVERLAY_GET_COND (ov)))
|
#define GST_BASE_TEXT_OVERLAY_UNLOCK(ov) (g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_LOCK (ov)))
|
||||||
|
#define GST_BASE_TEXT_OVERLAY_WAIT(ov) (g_cond_wait (GST_BASE_TEXT_OVERLAY_GET_COND (ov), GST_BASE_TEXT_OVERLAY_GET_LOCK (ov)))
|
||||||
|
#define GST_BASE_TEXT_OVERLAY_SIGNAL(ov) (g_cond_signal (GST_BASE_TEXT_OVERLAY_GET_COND (ov)))
|
||||||
|
#define GST_BASE_TEXT_OVERLAY_BROADCAST(ov)(g_cond_broadcast (GST_BASE_TEXT_OVERLAY_GET_COND (ov)))
|
||||||
|
|
||||||
static GstElementClass *parent_class = NULL;
|
static GstElementClass *parent_class = NULL;
|
||||||
static void gst_base_text_overlay_base_init (gpointer g_class);
|
static void gst_base_text_overlay_base_init (gpointer g_class);
|
||||||
@ -599,6 +602,7 @@ gst_base_text_overlay_finalize (GObject * object)
|
|||||||
overlay->text_buffer = NULL;
|
overlay->text_buffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_mutex_clear (&overlay->lock);
|
||||||
g_cond_clear (&overlay->cond);
|
g_cond_clear (&overlay->cond);
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||||
@ -689,6 +693,7 @@ gst_base_text_overlay_init (GstBaseTextOverlay * overlay,
|
|||||||
|
|
||||||
overlay->text_buffer = NULL;
|
overlay->text_buffer = NULL;
|
||||||
overlay->text_linked = FALSE;
|
overlay->text_linked = FALSE;
|
||||||
|
g_mutex_init (&overlay->lock);
|
||||||
g_cond_init (&overlay->cond);
|
g_cond_init (&overlay->cond);
|
||||||
gst_segment_init (&overlay->segment, GST_FORMAT_TIME);
|
gst_segment_init (&overlay->segment, GST_FORMAT_TIME);
|
||||||
g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
|
g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
|
||||||
@ -771,11 +776,11 @@ gst_base_text_overlay_setcaps (GstBaseTextOverlay * overlay, GstCaps * caps)
|
|||||||
ret = gst_pad_push_event (overlay->srcpad, gst_event_new_caps (caps));
|
ret = gst_pad_push_event (overlay->srcpad, gst_event_new_caps (caps));
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
g_mutex_lock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
|
g_mutex_lock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
|
||||||
gst_base_text_overlay_update_wrap_mode (overlay);
|
gst_base_text_overlay_update_wrap_mode (overlay);
|
||||||
g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
|
g_mutex_unlock (GST_BASE_TEXT_OVERLAY_GET_CLASS (overlay)->pango_lock);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -794,7 +799,7 @@ gst_base_text_overlay_set_property (GObject * object, guint prop_id,
|
|||||||
{
|
{
|
||||||
GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (object);
|
GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (object);
|
||||||
|
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_TEXT:
|
case PROP_TEXT:
|
||||||
g_free (overlay->default_text);
|
g_free (overlay->default_text);
|
||||||
@ -918,7 +923,7 @@ gst_base_text_overlay_set_property (GObject * object, guint prop_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
overlay->need_render = TRUE;
|
overlay->need_render = TRUE;
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -927,7 +932,7 @@ gst_base_text_overlay_get_property (GObject * object, guint prop_id,
|
|||||||
{
|
{
|
||||||
GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (object);
|
GstBaseTextOverlay *overlay = GST_BASE_TEXT_OVERLAY (object);
|
||||||
|
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_TEXT:
|
case PROP_TEXT:
|
||||||
g_value_set_string (value, overlay->default_text);
|
g_value_set_string (value, overlay->default_text);
|
||||||
@ -989,7 +994,7 @@ gst_base_text_overlay_get_property (GObject * object, guint prop_id,
|
|||||||
}
|
}
|
||||||
|
|
||||||
overlay->need_render = TRUE;
|
overlay->need_render = TRUE;
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -1050,11 +1055,11 @@ gst_base_text_overlay_src_event (GstPad * pad, GstObject * parent,
|
|||||||
gst_pad_push_event (overlay->srcpad, gst_event_new_flush_start ());
|
gst_pad_push_event (overlay->srcpad, gst_event_new_flush_start ());
|
||||||
|
|
||||||
/* Mark ourself as flushing, unblock chains */
|
/* Mark ourself as flushing, unblock chains */
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
overlay->video_flushing = TRUE;
|
overlay->video_flushing = TRUE;
|
||||||
overlay->text_flushing = TRUE;
|
overlay->text_flushing = TRUE;
|
||||||
gst_base_text_overlay_pop_text (overlay);
|
gst_base_text_overlay_pop_text (overlay);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
|
|
||||||
/* Seek on each sink pad */
|
/* Seek on each sink pad */
|
||||||
gst_event_ref (event);
|
gst_event_ref (event);
|
||||||
@ -2173,11 +2178,11 @@ gst_base_text_overlay_text_event (GstPad * pad, GstObject * parent,
|
|||||||
gst_event_parse_segment (event, &segment);
|
gst_event_parse_segment (event, &segment);
|
||||||
|
|
||||||
if (segment->format == GST_FORMAT_TIME) {
|
if (segment->format == GST_FORMAT_TIME) {
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
gst_segment_copy_into (segment, &overlay->text_segment);
|
gst_segment_copy_into (segment, &overlay->text_segment);
|
||||||
GST_DEBUG_OBJECT (overlay, "TEXT SEGMENT now: %" GST_SEGMENT_FORMAT,
|
GST_DEBUG_OBJECT (overlay, "TEXT SEGMENT now: %" GST_SEGMENT_FORMAT,
|
||||||
&overlay->text_segment);
|
&overlay->text_segment);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
} else {
|
} else {
|
||||||
GST_ELEMENT_WARNING (overlay, STREAM, MUX, (NULL),
|
GST_ELEMENT_WARNING (overlay, STREAM, MUX, (NULL),
|
||||||
("received non-TIME newsegment event on text input"));
|
("received non-TIME newsegment event on text input"));
|
||||||
@ -2188,39 +2193,39 @@ gst_base_text_overlay_text_event (GstPad * pad, GstObject * parent,
|
|||||||
|
|
||||||
/* wake up the video chain, it might be waiting for a text buffer or
|
/* wake up the video chain, it might be waiting for a text buffer or
|
||||||
* a text segment update */
|
* a text segment update */
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
|
GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GST_EVENT_FLUSH_STOP:
|
case GST_EVENT_FLUSH_STOP:
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
GST_INFO_OBJECT (overlay, "text flush stop");
|
GST_INFO_OBJECT (overlay, "text flush stop");
|
||||||
overlay->text_flushing = FALSE;
|
overlay->text_flushing = FALSE;
|
||||||
overlay->text_eos = FALSE;
|
overlay->text_eos = FALSE;
|
||||||
gst_base_text_overlay_pop_text (overlay);
|
gst_base_text_overlay_pop_text (overlay);
|
||||||
gst_segment_init (&overlay->text_segment, GST_FORMAT_TIME);
|
gst_segment_init (&overlay->text_segment, GST_FORMAT_TIME);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
break;
|
break;
|
||||||
case GST_EVENT_FLUSH_START:
|
case GST_EVENT_FLUSH_START:
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
GST_INFO_OBJECT (overlay, "text flush start");
|
GST_INFO_OBJECT (overlay, "text flush start");
|
||||||
overlay->text_flushing = TRUE;
|
overlay->text_flushing = TRUE;
|
||||||
GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
|
GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
break;
|
break;
|
||||||
case GST_EVENT_EOS:
|
case GST_EVENT_EOS:
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
overlay->text_eos = TRUE;
|
overlay->text_eos = TRUE;
|
||||||
GST_INFO_OBJECT (overlay, "text EOS");
|
GST_INFO_OBJECT (overlay, "text EOS");
|
||||||
/* wake up the video chain, it might be waiting for a text buffer or
|
/* wake up the video chain, it might be waiting for a text buffer or
|
||||||
* a text segment update */
|
* a text segment update */
|
||||||
GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
|
GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
gst_event_unref (event);
|
gst_event_unref (event);
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
break;
|
break;
|
||||||
@ -2275,27 +2280,27 @@ gst_base_text_overlay_video_event (GstPad * pad, GstObject * parent,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GST_EVENT_EOS:
|
case GST_EVENT_EOS:
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
GST_INFO_OBJECT (overlay, "video EOS");
|
GST_INFO_OBJECT (overlay, "video EOS");
|
||||||
overlay->video_eos = TRUE;
|
overlay->video_eos = TRUE;
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
ret = gst_pad_event_default (pad, parent, event);
|
ret = gst_pad_event_default (pad, parent, event);
|
||||||
break;
|
break;
|
||||||
case GST_EVENT_FLUSH_START:
|
case GST_EVENT_FLUSH_START:
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
GST_INFO_OBJECT (overlay, "video flush start");
|
GST_INFO_OBJECT (overlay, "video flush start");
|
||||||
overlay->video_flushing = TRUE;
|
overlay->video_flushing = TRUE;
|
||||||
GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
|
GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
ret = gst_pad_event_default (pad, parent, event);
|
ret = gst_pad_event_default (pad, parent, event);
|
||||||
break;
|
break;
|
||||||
case GST_EVENT_FLUSH_STOP:
|
case GST_EVENT_FLUSH_STOP:
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
GST_INFO_OBJECT (overlay, "video flush stop");
|
GST_INFO_OBJECT (overlay, "video flush stop");
|
||||||
overlay->video_flushing = FALSE;
|
overlay->video_flushing = FALSE;
|
||||||
overlay->video_eos = FALSE;
|
overlay->video_eos = FALSE;
|
||||||
gst_segment_init (&overlay->segment, GST_FORMAT_TIME);
|
gst_segment_init (&overlay->segment, GST_FORMAT_TIME);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
ret = gst_pad_event_default (pad, parent, event);
|
ret = gst_pad_event_default (pad, parent, event);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -2366,17 +2371,17 @@ gst_base_text_overlay_text_chain (GstPad * pad, GstObject * parent,
|
|||||||
|
|
||||||
overlay = GST_BASE_TEXT_OVERLAY (parent);
|
overlay = GST_BASE_TEXT_OVERLAY (parent);
|
||||||
|
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
|
|
||||||
if (overlay->text_flushing) {
|
if (overlay->text_flushing) {
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
ret = GST_FLOW_FLUSHING;
|
ret = GST_FLOW_FLUSHING;
|
||||||
GST_LOG_OBJECT (overlay, "text flushing");
|
GST_LOG_OBJECT (overlay, "text flushing");
|
||||||
goto beach;
|
goto beach;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overlay->text_eos) {
|
if (overlay->text_eos) {
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
ret = GST_FLOW_EOS;
|
ret = GST_FLOW_EOS;
|
||||||
GST_LOG_OBJECT (overlay, "text EOS");
|
GST_LOG_OBJECT (overlay, "text EOS");
|
||||||
goto beach;
|
goto beach;
|
||||||
@ -2415,7 +2420,7 @@ gst_base_text_overlay_text_chain (GstPad * pad, GstObject * parent,
|
|||||||
GST_BASE_TEXT_OVERLAY_WAIT (overlay);
|
GST_BASE_TEXT_OVERLAY_WAIT (overlay);
|
||||||
GST_DEBUG ("Pad %s:%s resuming", GST_DEBUG_PAD_NAME (pad));
|
GST_DEBUG ("Pad %s:%s resuming", GST_DEBUG_PAD_NAME (pad));
|
||||||
if (overlay->text_flushing) {
|
if (overlay->text_flushing) {
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
ret = GST_FLOW_FLUSHING;
|
ret = GST_FLOW_FLUSHING;
|
||||||
goto beach;
|
goto beach;
|
||||||
}
|
}
|
||||||
@ -2432,7 +2437,7 @@ gst_base_text_overlay_text_chain (GstPad * pad, GstObject * parent,
|
|||||||
GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
|
GST_BASE_TEXT_OVERLAY_BROADCAST (overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
|
|
||||||
beach:
|
beach:
|
||||||
|
|
||||||
@ -2515,7 +2520,7 @@ gst_base_text_overlay_video_chain (GstPad * pad, GstObject * parent,
|
|||||||
|
|
||||||
wait_for_text_buf:
|
wait_for_text_buf:
|
||||||
|
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
|
|
||||||
if (overlay->video_flushing)
|
if (overlay->video_flushing)
|
||||||
goto flushing;
|
goto flushing;
|
||||||
@ -2524,7 +2529,7 @@ wait_for_text_buf:
|
|||||||
goto have_eos;
|
goto have_eos;
|
||||||
|
|
||||||
if (overlay->silent) {
|
if (overlay->silent) {
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
ret = gst_pad_push (overlay->srcpad, buffer);
|
ret = gst_pad_push (overlay->srcpad, buffer);
|
||||||
|
|
||||||
/* Update position */
|
/* Update position */
|
||||||
@ -2544,7 +2549,7 @@ wait_for_text_buf:
|
|||||||
GST_LOG_OBJECT (overlay, "Text pad not linked, rendering default "
|
GST_LOG_OBJECT (overlay, "Text pad not linked, rendering default "
|
||||||
"text: '%s'", GST_STR_NULL (text));
|
"text: '%s'", GST_STR_NULL (text));
|
||||||
|
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
|
|
||||||
if (text != NULL && *text != '\0') {
|
if (text != NULL && *text != '\0') {
|
||||||
/* Render and push */
|
/* Render and push */
|
||||||
@ -2607,11 +2612,11 @@ wait_for_text_buf:
|
|||||||
GST_LOG_OBJECT (overlay, "text buffer too old, popping");
|
GST_LOG_OBJECT (overlay, "text buffer too old, popping");
|
||||||
pop_text = FALSE;
|
pop_text = FALSE;
|
||||||
gst_base_text_overlay_pop_text (overlay);
|
gst_base_text_overlay_pop_text (overlay);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
goto wait_for_text_buf;
|
goto wait_for_text_buf;
|
||||||
} else if (valid_text_time && vid_running_time_end <= text_running_time) {
|
} else if (valid_text_time && vid_running_time_end <= text_running_time) {
|
||||||
GST_LOG_OBJECT (overlay, "text in future, pushing video buf");
|
GST_LOG_OBJECT (overlay, "text in future, pushing video buf");
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
/* Push the video frame */
|
/* Push the video frame */
|
||||||
ret = gst_pad_push (overlay->srcpad, buffer);
|
ret = gst_pad_push (overlay->srcpad, buffer);
|
||||||
} else {
|
} else {
|
||||||
@ -2660,7 +2665,7 @@ wait_for_text_buf:
|
|||||||
|
|
||||||
gst_buffer_unmap (overlay->text_buffer, &map);
|
gst_buffer_unmap (overlay->text_buffer, &map);
|
||||||
|
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
ret = gst_base_text_overlay_push_frame (overlay, buffer);
|
ret = gst_base_text_overlay_push_frame (overlay, buffer);
|
||||||
|
|
||||||
if (valid_text_time && text_running_time_end <= vid_running_time_end) {
|
if (valid_text_time && text_running_time_end <= vid_running_time_end) {
|
||||||
@ -2669,9 +2674,9 @@ wait_for_text_buf:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pop_text) {
|
if (pop_text) {
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
gst_base_text_overlay_pop_text (overlay);
|
gst_base_text_overlay_pop_text (overlay);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
gboolean wait_for_text_buf = TRUE;
|
gboolean wait_for_text_buf = TRUE;
|
||||||
@ -2709,10 +2714,10 @@ wait_for_text_buf:
|
|||||||
GST_DEBUG_OBJECT (overlay, "no text buffer, need to wait for one");
|
GST_DEBUG_OBJECT (overlay, "no text buffer, need to wait for one");
|
||||||
GST_BASE_TEXT_OVERLAY_WAIT (overlay);
|
GST_BASE_TEXT_OVERLAY_WAIT (overlay);
|
||||||
GST_DEBUG_OBJECT (overlay, "resuming");
|
GST_DEBUG_OBJECT (overlay, "resuming");
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
goto wait_for_text_buf;
|
goto wait_for_text_buf;
|
||||||
} else {
|
} else {
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
GST_LOG_OBJECT (overlay, "no need to wait for a text buffer");
|
GST_LOG_OBJECT (overlay, "no need to wait for a text buffer");
|
||||||
ret = gst_pad_push (overlay->srcpad, buffer);
|
ret = gst_pad_push (overlay->srcpad, buffer);
|
||||||
}
|
}
|
||||||
@ -2735,14 +2740,14 @@ missing_timestamp:
|
|||||||
|
|
||||||
flushing:
|
flushing:
|
||||||
{
|
{
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
GST_DEBUG_OBJECT (overlay, "flushing, discarding buffer");
|
GST_DEBUG_OBJECT (overlay, "flushing, discarding buffer");
|
||||||
gst_buffer_unref (buffer);
|
gst_buffer_unref (buffer);
|
||||||
return GST_FLOW_FLUSHING;
|
return GST_FLOW_FLUSHING;
|
||||||
}
|
}
|
||||||
have_eos:
|
have_eos:
|
||||||
{
|
{
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
GST_DEBUG_OBJECT (overlay, "eos, discarding buffer");
|
GST_DEBUG_OBJECT (overlay, "eos, discarding buffer");
|
||||||
gst_buffer_unref (buffer);
|
gst_buffer_unref (buffer);
|
||||||
return GST_FLOW_EOS;
|
return GST_FLOW_EOS;
|
||||||
@ -2764,13 +2769,13 @@ gst_base_text_overlay_change_state (GstElement * element,
|
|||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
overlay->text_flushing = TRUE;
|
overlay->text_flushing = TRUE;
|
||||||
overlay->video_flushing = TRUE;
|
overlay->video_flushing = TRUE;
|
||||||
/* pop_text will broadcast on the GCond and thus also make the video
|
/* pop_text will broadcast on the GCond and thus also make the video
|
||||||
* chain exit if it's waiting for a text buffer */
|
* chain exit if it's waiting for a text buffer */
|
||||||
gst_base_text_overlay_pop_text (overlay);
|
gst_base_text_overlay_pop_text (overlay);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -2782,14 +2787,14 @@ gst_base_text_overlay_change_state (GstElement * element,
|
|||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
GST_OBJECT_LOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_LOCK (overlay);
|
||||||
overlay->text_flushing = FALSE;
|
overlay->text_flushing = FALSE;
|
||||||
overlay->video_flushing = FALSE;
|
overlay->video_flushing = FALSE;
|
||||||
overlay->video_eos = FALSE;
|
overlay->video_eos = FALSE;
|
||||||
overlay->text_eos = FALSE;
|
overlay->text_eos = FALSE;
|
||||||
gst_segment_init (&overlay->segment, GST_FORMAT_TIME);
|
gst_segment_init (&overlay->segment, GST_FORMAT_TIME);
|
||||||
gst_segment_init (&overlay->text_segment, GST_FORMAT_TIME);
|
gst_segment_init (&overlay->text_segment, GST_FORMAT_TIME);
|
||||||
GST_OBJECT_UNLOCK (overlay);
|
GST_BASE_TEXT_OVERLAY_UNLOCK (overlay);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -109,6 +109,7 @@ struct _GstBaseTextOverlay {
|
|||||||
gboolean text_flushing;
|
gboolean text_flushing;
|
||||||
gboolean text_eos;
|
gboolean text_eos;
|
||||||
|
|
||||||
|
GMutex lock;
|
||||||
GCond cond; /* to signal removal of a queued text
|
GCond cond; /* to signal removal of a queued text
|
||||||
* buffer, arrival of a text buffer,
|
* buffer, arrival of a text buffer,
|
||||||
* a text segment update, or a change
|
* a text segment update, or a change
|
||||||
|
Loading…
x
Reference in New Issue
Block a user