imagefreeze: Properly report errors before stopping the srcpad task

This commit is contained in:
Sebastian Dröge 2014-05-02 17:10:18 +02:00
parent 4933394d35
commit 4282d75597

View File

@ -693,20 +693,21 @@ gst_image_freeze_src_loop (GstPad * pad)
GstClockTime timestamp, timestamp_end; GstClockTime timestamp, timestamp_end;
guint64 cstart, cstop; guint64 cstart, cstop;
gboolean in_seg, eos; gboolean in_seg, eos;
GstFlowReturn flow_ret = GST_FLOW_OK;
g_mutex_lock (&self->lock); g_mutex_lock (&self->lock);
if (!gst_pad_has_current_caps (pad)) { if (!gst_pad_has_current_caps (self->srcpad)) {
GST_ERROR_OBJECT (pad, "Not negotiated yet"); GST_ERROR_OBJECT (pad, "Not negotiated yet");
flow_ret = GST_FLOW_NOT_NEGOTIATED;
g_mutex_unlock (&self->lock); g_mutex_unlock (&self->lock);
gst_pad_pause_task (self->srcpad); goto pause_task;
return;
} }
if (!self->buffer) { if (!self->buffer) {
GST_ERROR_OBJECT (pad, "Have no buffer yet"); GST_ERROR_OBJECT (pad, "Have no buffer yet");
flow_ret = GST_FLOW_ERROR;
g_mutex_unlock (&self->lock); g_mutex_unlock (&self->lock);
gst_pad_pause_task (self->srcpad); goto pause_task;
return;
} }
buffer = gst_buffer_ref (self->buffer); buffer = gst_buffer_ref (self->buffer);
buffer = gst_buffer_make_writable (buffer); buffer = gst_buffer_make_writable (buffer);
@ -776,44 +777,62 @@ gst_image_freeze_src_loop (GstPad * pad)
GST_TIME_ARGS (timestamp)); GST_TIME_ARGS (timestamp));
if (in_seg) { if (in_seg) {
GstFlowReturn ret;
GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE; GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE;
GST_BUFFER_PTS (buffer) = cstart; GST_BUFFER_PTS (buffer) = cstart;
GST_BUFFER_DURATION (buffer) = cstop - cstart; GST_BUFFER_DURATION (buffer) = cstop - cstart;
GST_BUFFER_OFFSET (buffer) = offset; GST_BUFFER_OFFSET (buffer) = offset;
GST_BUFFER_OFFSET_END (buffer) = offset + 1; GST_BUFFER_OFFSET_END (buffer) = offset + 1;
ret = gst_pad_push (self->srcpad, buffer); flow_ret = gst_pad_push (self->srcpad, buffer);
GST_DEBUG_OBJECT (pad, "Pushing buffer resulted in %s", GST_DEBUG_OBJECT (pad, "Pushing buffer resulted in %s",
gst_flow_get_name (ret)); gst_flow_get_name (flow_ret));
if (ret != GST_FLOW_OK) if (flow_ret != GST_FLOW_OK)
gst_pad_pause_task (self->srcpad); goto pause_task;
} else { } else {
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
} }
if (eos) { if (eos) {
if ((self->segment.flags & GST_SEEK_FLAG_SEGMENT)) { flow_ret = GST_FLOW_EOS;
GstMessage *m; goto pause_task;
GstEvent *e; }
GST_DEBUG_OBJECT (pad, "Sending segment done at end of segment"); return;
if (self->segment.rate >= 0) {
m = gst_message_new_segment_done (GST_OBJECT_CAST (self), pause_task:
GST_FORMAT_TIME, self->segment.stop); {
e = gst_event_new_segment_done (GST_FORMAT_TIME, self->segment.stop); const gchar *reason = gst_flow_get_name (flow_ret);
GST_LOG_OBJECT (self, "pausing task, reason %s", reason);
gst_pad_pause_task (pad);
if (flow_ret == GST_FLOW_EOS) {
if ((self->segment.flags & GST_SEEK_FLAG_SEGMENT)) {
GstMessage *m;
GstEvent *e;
GST_DEBUG_OBJECT (pad, "Sending segment done at end of segment");
if (self->segment.rate >= 0) {
m = gst_message_new_segment_done (GST_OBJECT_CAST (self),
GST_FORMAT_TIME, self->segment.stop);
e = gst_event_new_segment_done (GST_FORMAT_TIME, self->segment.stop);
} else {
m = gst_message_new_segment_done (GST_OBJECT_CAST (self),
GST_FORMAT_TIME, self->segment.start);
e = gst_event_new_segment_done (GST_FORMAT_TIME, self->segment.start);
}
gst_element_post_message (GST_ELEMENT_CAST (self), m);
gst_pad_push_event (self->srcpad, e);
} else { } else {
m = gst_message_new_segment_done (GST_OBJECT_CAST (self), GST_DEBUG_OBJECT (pad, "Sending EOS at end of segment");
GST_FORMAT_TIME, self->segment.start); gst_pad_push_event (self->srcpad, gst_event_new_eos ());
e = gst_event_new_segment_done (GST_FORMAT_TIME, self->segment.start);
} }
gst_element_post_message (GST_ELEMENT_CAST (self), m); } else if (flow_ret == GST_FLOW_NOT_LINKED || flow_ret < GST_FLOW_EOS) {
gst_pad_push_event (self->srcpad, e); GST_ELEMENT_ERROR (self, STREAM, FAILED,
} else { ("Internal data stream error."),
GST_DEBUG_OBJECT (pad, "Sending EOS at end of segment"); ("stream stopped, reason %s", reason));
gst_pad_push_event (self->srcpad, gst_event_new_eos ()); gst_pad_push_event (self->srcpad, gst_event_new_eos ());
} }
gst_pad_pause_task (self->srcpad); return;
} }
} }