ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
switch (transition) {
- case GST_STATE_CHANGE_PAUSED_TO_READY:
+ case GST_STATE_CHANGE_PAUSED_TO_READY:{
+ gboolean send_message = FALSE;
+
g_mutex_lock (&self->mutex);
if (self->mode != MODE_RUNNING_TIME) {
GST_DEBUG_OBJECT (self, "First time reset in paused to ready");
}
if (!self->dropping) {
self->dropping = TRUE;
- gst_avwait_send_element_message (self, TRUE, GST_CLOCK_TIME_NONE);
+ send_message = TRUE;
}
gst_segment_init (&self->asegment, GST_FORMAT_UNDEFINED);
self->asegment.position = GST_CLOCK_TIME_NONE;
gst_video_time_code_free (self->last_seen_tc);
self->last_seen_tc = NULL;
g_mutex_unlock (&self->mutex);
+
+ if (send_message)
+ gst_avwait_send_element_message (self, TRUE, GST_CLOCK_TIME_NONE);
break;
+ }
default:
break;
}
GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event));
switch (GST_EVENT_TYPE (event)) {
- case GST_EVENT_SEGMENT:
+ case GST_EVENT_SEGMENT:{
+ gboolean send_message = FALSE;
+
g_mutex_lock (&self->mutex);
gst_event_copy_segment (event, &self->vsegment);
if (self->vsegment.format != GST_FORMAT_TIME) {
self->audio_running_time_to_end_at = GST_CLOCK_TIME_NONE;
if (!self->dropping) {
self->dropping = TRUE;
- gst_avwait_send_element_message (self, TRUE, GST_CLOCK_TIME_NONE);
+ send_message = TRUE;
}
self->vsegment.position = GST_CLOCK_TIME_NONE;
g_mutex_unlock (&self->mutex);
+
+ if (send_message)
+ gst_avwait_send_element_message (self, TRUE, GST_CLOCK_TIME_NONE);
break;
+ }
case GST_EVENT_GAP:
gst_event_unref (event);
return TRUE;
case GST_EVENT_EOS:{
GstClockTime running_time;
+ gboolean send_message = FALSE;
+ GstClockTime audio_running_time_to_end_at;
g_mutex_lock (&self->mutex);
self->video_eos_flag = TRUE;
if (self->must_send_end_message & END_MESSAGE_AUDIO_PUSHED) {
self->must_send_end_message = END_MESSAGE_NORMAL;
- g_mutex_unlock (&self->mutex);
- gst_avwait_send_element_message (self, TRUE,
- self->audio_running_time_to_end_at);
+ send_message = TRUE;
+ audio_running_time_to_end_at = self->audio_running_time_to_end_at;
} else if (self->must_send_end_message & END_MESSAGE_STREAM_ENDED) {
self->must_send_end_message |= END_MESSAGE_VIDEO_PUSHED;
- g_mutex_unlock (&self->mutex);
- } else {
- g_mutex_unlock (&self->mutex);
}
+ g_mutex_unlock (&self->mutex);
+
+ if (send_message)
+ gst_avwait_send_element_message (self, TRUE,
+ audio_running_time_to_end_at);
break;
}
case GST_EVENT_FLUSH_START:
g_cond_signal (&self->audio_cond);
g_mutex_unlock (&self->mutex);
break;
- case GST_EVENT_FLUSH_STOP:
+ case GST_EVENT_FLUSH_STOP:{
+ gboolean send_message = FALSE;
+
g_mutex_lock (&self->mutex);
self->video_flush_flag = FALSE;
GST_DEBUG_OBJECT (self, "First time reset in video flush");
self->audio_running_time_to_end_at = GST_CLOCK_TIME_NONE;
if (!self->dropping) {
self->dropping = TRUE;
- gst_avwait_send_element_message (self, TRUE, GST_CLOCK_TIME_NONE);
+ send_message = TRUE;
}
gst_segment_init (&self->vsegment, GST_FORMAT_UNDEFINED);
self->vsegment.position = GST_CLOCK_TIME_NONE;
g_mutex_unlock (&self->mutex);
+
+ if (send_message)
+ gst_avwait_send_element_message (self, TRUE, GST_CLOCK_TIME_NONE);
break;
+ }
case GST_EVENT_CAPS:{
GstCaps *caps;
gst_event_parse_caps (event, &caps);
g_mutex_unlock (&self->mutex);
break;
case GST_EVENT_EOS:{
+ gboolean send_message = FALSE;
+ GstClockTime audio_running_time_to_end_at;
+
g_mutex_lock (&self->mutex);
self->audio_eos_flag = TRUE;
g_cond_signal (&self->audio_cond);
if ((self->must_send_end_message & END_MESSAGE_VIDEO_PUSHED)) {
self->must_send_end_message = END_MESSAGE_NORMAL;
- g_mutex_unlock (&self->mutex);
- gst_avwait_send_element_message (self, TRUE,
- self->audio_running_time_to_end_at);
+ audio_running_time_to_end_at = self->audio_running_time_to_end_at;
+ send_message = TRUE;
} else if (self->must_send_end_message & END_MESSAGE_STREAM_ENDED) {
self->must_send_end_message |= END_MESSAGE_AUDIO_PUSHED;
- g_mutex_unlock (&self->mutex);
} else {
self->must_send_end_message = END_MESSAGE_NORMAL;
- g_mutex_unlock (&self->mutex);
}
+ g_mutex_unlock (&self->mutex);
+
+ if (send_message)
+ gst_avwait_send_element_message (self, TRUE,
+ audio_running_time_to_end_at);
break;
}
case GST_EVENT_FLUSH_STOP:
GstVideoTimeCodeMeta *tc_meta;
gboolean retry = FALSE;
gboolean ret = GST_FLOW_OK;
+ gboolean send_message = FALSE;
+ GstClockTime message_running_time;
+ gboolean message_dropping;
timestamp = GST_BUFFER_TIMESTAMP (inbuf);
if (timestamp == GST_CLOCK_TIME_NONE) {
inbuf = NULL;
}
} else if (emit_passthrough_signal && self->recording) {
- gst_avwait_send_element_message (self, FALSE,
- self->running_time_to_wait_for);
+ send_message = TRUE;
+ message_running_time = self->running_time_to_wait_for;
+ message_dropping = FALSE;
}
}
break;
if (self->recording) {
self->audio_running_time_to_wait_for = running_time;
}
- if (self->recording)
- gst_avwait_send_element_message (self, FALSE, running_time);
+ if (self->recording) {
+ send_message = TRUE;
+ message_running_time = running_time;
+ message_dropping = FALSE;
+ }
}
if (GST_CLOCK_TIME_IS_VALID (self->end_running_time)
inbuf = NULL;
}
} else if (emit_passthrough_signal && self->recording) {
- gst_avwait_send_element_message (self, FALSE,
- self->running_time_to_wait_for);
+ send_message = TRUE;
+ message_running_time = self->running_time_to_wait_for;
+ message_dropping = FALSE;
}
break;
}
if (self->dropping) {
self->dropping = FALSE;
- if (self->recording)
- gst_avwait_send_element_message (self, FALSE,
- self->running_time_to_wait_for);
+ if (self->recording) {
+ send_message = TRUE;
+ message_running_time = self->running_time_to_wait_for;
+ message_dropping = FALSE;
+ }
}
}
break;
&& running_time > self->running_time_to_wait_for) {
/* We just started recording: synchronise the audio */
self->audio_running_time_to_wait_for = running_time;
- gst_avwait_send_element_message (self, FALSE, running_time);
+ send_message = TRUE;
+ message_running_time = running_time;
+ message_dropping = FALSE;
} else {
/* We will start in the future when running_time_to_wait_for is
* reached */
g_cond_signal (&self->cond);
g_mutex_unlock (&self->mutex);
+ if (send_message)
+ gst_avwait_send_element_message (self, message_dropping,
+ message_running_time);
+ send_message = FALSE;
+
if (inbuf) {
GST_DEBUG_OBJECT (self,
"Pass video buffer %" GST_TIME_FORMAT "-%" GST_TIME_FORMAT,
g_mutex_lock (&self->mutex);
if (self->must_send_end_message & END_MESSAGE_AUDIO_PUSHED) {
self->must_send_end_message = END_MESSAGE_NORMAL;
- g_mutex_unlock (&self->mutex);
- gst_avwait_send_element_message (self, TRUE,
- self->audio_running_time_to_end_at);
+ send_message = TRUE;
+ message_dropping = TRUE;
+ message_running_time = self->audio_running_time_to_end_at;
} else if (self->must_send_end_message & END_MESSAGE_STREAM_ENDED) {
if (self->audio_eos_flag) {
self->must_send_end_message = END_MESSAGE_NORMAL;
- g_mutex_unlock (&self->mutex);
- gst_avwait_send_element_message (self, TRUE,
- self->audio_running_time_to_end_at);
+ send_message = TRUE;
+ message_dropping = TRUE;
+ message_running_time = self->audio_running_time_to_end_at;
} else {
self->must_send_end_message |= END_MESSAGE_VIDEO_PUSHED;
- g_mutex_unlock (&self->mutex);
}
- } else {
- g_mutex_unlock (&self->mutex);
}
+ g_mutex_unlock (&self->mutex);
+
+ if (send_message)
+ gst_avwait_send_element_message (self, message_dropping,
+ message_running_time);
return ret;
}
}
if (send_element_message) {
+ gboolean send_message = FALSE;
+ GstClockTime audio_running_time_to_end_at;
+
g_mutex_lock (&self->mutex);
if ((self->must_send_end_message & END_MESSAGE_VIDEO_PUSHED) ||
self->video_eos_flag) {
self->must_send_end_message = END_MESSAGE_NORMAL;
- g_mutex_unlock (&self->mutex);
- gst_avwait_send_element_message (self, TRUE,
- self->audio_running_time_to_end_at);
+ send_message = TRUE;
+ audio_running_time_to_end_at = self->audio_running_time_to_end_at;
} else if (self->must_send_end_message & END_MESSAGE_STREAM_ENDED) {
self->must_send_end_message |= END_MESSAGE_AUDIO_PUSHED;
- g_mutex_unlock (&self->mutex);
} else {
g_assert_not_reached ();
- g_mutex_unlock (&self->mutex);
}
+ g_mutex_unlock (&self->mutex);
+
+ if (send_message)
+ gst_avwait_send_element_message (self, TRUE,
+ audio_running_time_to_end_at);
}
send_element_message = FALSE;
return ret;