gst_event_new_eos ());
gst_pad_pause_task (GST_BASE_AUDIO_ENCODER_SRC_PAD (self));
self->downstream_flow_ret = GST_FLOW_ERROR;
+ self->started = FALSE;
return;
}
flushing:
GST_DEBUG_OBJECT (self, "Flushing -- stopping task");
gst_pad_pause_task (GST_BASE_AUDIO_ENCODER_SRC_PAD (self));
self->downstream_flow_ret = GST_FLOW_WRONG_STATE;
+ self->started = FALSE;
return;
}
flow_error:
gst_event_new_eos ());
gst_pad_pause_task (GST_BASE_AUDIO_ENCODER_SRC_PAD (self));
}
+ self->started = FALSE;
return;
}
reconfigure_error:
gst_event_new_eos ());
gst_pad_pause_task (GST_BASE_AUDIO_ENCODER_SRC_PAD (self));
self->downstream_flow_ret = GST_FLOW_NOT_NEGOTIATED;
+ self->started = FALSE;
return;
}
caps_failed:
gst_event_new_eos ());
gst_pad_pause_task (GST_BASE_AUDIO_ENCODER_SRC_PAD (self));
self->downstream_flow_ret = GST_FLOW_NOT_NEGOTIATED;
+ self->started = FALSE;
return;
}
}
self = GST_OMX_AUDIO_ENC (encoder);
+ self->eos = FALSE;
self->downstream_flow_ret = GST_FLOW_OK;
ret =
gst_pad_start_task (GST_BASE_AUDIO_ENCODER_SRC_PAD (self),
gst_omx_component_set_state (self->component, OMX_StateIdle);
self->downstream_flow_ret = GST_FLOW_WRONG_STATE;
+ self->started = FALSE;
+ self->eos = FALSE;
g_mutex_lock (self->drain_lock);
self->draining = FALSE;
* format change happened we can just exit here.
*/
if (needs_disable) {
- if (self->started) {
- gst_omx_audio_enc_drain (self);
- self->started = FALSE;
- }
+ gst_omx_audio_enc_drain (self);
if (gst_omx_port_manual_reconfigure (self->in_port, TRUE) != OMX_ErrorNone)
return FALSE;
if (self->started) {
gst_omx_audio_enc_drain (self);
- self->started = FALSE;
gst_omx_port_set_flushing (self->in_port, TRUE);
gst_omx_port_set_flushing (self->out_port, TRUE);
/* Start the srcpad loop again */
self->downstream_flow_ret = GST_FLOW_OK;
+ self->eos = FALSE;
gst_pad_start_task (GST_BASE_AUDIO_ENCODER_SRC_PAD (self),
(GstTaskFunction) gst_omx_audio_enc_loop, encoder);
}
self = GST_OMX_AUDIO_ENC (encoder);
+ if (self->eos) {
+ GST_WARNING_OBJECT (self, "Got frame after EOS");
+ return GST_FLOW_UNEXPECTED;
+ }
+
if (self->downstream_flow_ret != GST_FLOW_OK) {
GST_ERROR_OBJECT (self, "Downstream returned %s",
gst_flow_get_name (self->downstream_flow_ret));
GST_DEBUG_OBJECT (self, "Sending EOS to the component");
+ /* Don't send EOS buffer twice, this doesn't work */
+ if (self->eos)
+ return FALSE;
+ self->eos = TRUE;
+
/* Send an EOS buffer to the component and let the base
* class drop the EOS event. We will send it later when
* the EOS buffer arrives on the output port. */
GST_DEBUG_OBJECT (self, "Draining component");
- g_assert (self->started);
+ if (!self->started)
+ return GST_FLOW_OK;
+ self->started = FALSE;
+
+ /* Don't send EOS buffer twice, this doesn't work */
+ if (self->eos)
+ return GST_FLOW_OK;
/* Send an EOS buffer to the component and let the base
* class drop the EOS event. We will send it later when
g_mutex_unlock (self->drain_lock);
GST_BASE_AUDIO_ENCODER_STREAM_LOCK (self);
+ self->started = FALSE;
+
return GST_FLOW_OK;
}