diff --git a/src/gstducatividdec.c b/src/gstducatividdec.c
index a82e4110f061872277ad24c8b1664026a58b36c6..b99ad94ceb4b769156e3ea5d97c03e0a0b005337 100644 (file)
--- a/src/gstducatividdec.c
+++ b/src/gstducatividdec.c
priv = gst_ducati_buffer_priv_new ();
- priv->bo = omap_bo_from_dmabuf (self->device,
- gst_dma_buf_get_fd (dmabuf));
+ priv->bo = omap_bo_from_dmabuf (self->device, gst_dma_buf_get_fd (dmabuf));
priv->uv_offset = gst_video_format_get_component_offset (format,
1, self->stride, self->padded_height);
if (err) {
GST_WARNING_OBJECT (self, "err=%d, extendedError=%08x",
err, self->outArgs->extendedError);
+ gst_ducati_log_extended_error_info (self->outArgs->extendedError);
err = VIDDEC3_control (self->codec, XDM_GETSTATUS,
self->dynParams, self->status);
if (!err) {
GST_WARNING_OBJECT (self, "XDM_GETSTATUS: err=%d, extendedError=%08x",
err, self->status->extendedError);
+ gst_ducati_log_extended_error_info (self->outArgs->extendedError);
}
if (flush)
self->outArgs->extendedError, self->status->extendedError);
}
- for (i = 0; self->outArgs->outputID[i]; i++) {
+ for (i = 0; i < IVIDEO2_MAX_IO_BUFFERS && self->outArgs->outputID[i]; i++) {
gboolean interlaced;
outbuf = codec_get_outbuf (self, self->outArgs->outputID[i]);
}
}
- for (i = 0; self->outArgs->freeBufID[i]; i++) {
+ for (i = 0; i < IVIDEO2_MAX_IO_BUFFERS && self->outArgs->freeBufID[i]; i++) {
codec_unlock_outbuf (self, self->outArgs->freeBufID[i]);
}
gboolean
gst_ducati_viddec_codec_flush (GstDucatiVidDec * self, gboolean eos)
{
- gint err;
+ gint err = FALSE;
GST_DEBUG_OBJECT (self, "flush: eos=%d", eos);
self->wait_keyframe = TRUE;
if (G_UNLIKELY (self->first_in_buffer)) {
- return TRUE;
+ goto out;
}
if (G_UNLIKELY (!self->codec)) {
GST_WARNING_OBJECT (self, "no codec");
- return TRUE;
+ goto out;
}
err = VIDDEC3_control (self->codec, XDM_FLUSH, self->dynParams, self->status);
if (G_UNLIKELY (!self->engine)) {
GST_ERROR_OBJECT (self, "no engine");
+ gst_buffer_unref (buf);
return GST_FLOW_ERROR;
}
if (ret != GST_FLOW_OK) {
GST_WARNING_OBJECT (self, "alloc_buffer failed %s",
gst_flow_get_name (ret));
+ gst_buffer_unref (buf);
return ret;
}
if (G_UNLIKELY (!self->codec)) {
if (!codec_create (self)) {
GST_ERROR_OBJECT (self, "could not create codec");
+ gst_buffer_unref (buf);
+ gst_buffer_unref (outbuf);
return GST_FLOW_ERROR;
}
}
codec_prepare_outbuf (self, &outbuf, self->first_out_buffer);
if (!self->inArgs->inputID) {
GST_ERROR_OBJECT (self, "could not prepare output buffer");
+ gst_buffer_unref (buf);
return GST_FLOW_ERROR;
}
if (err) {
GST_ELEMENT_ERROR (self, STREAM, DECODE, (NULL),
("process returned error: %d %08x", err, self->outArgs->extendedError));
+ gst_ducati_log_extended_error_info (self->outArgs->extendedError);
return GST_FLOW_ERROR;
}
if (ret != GST_FLOW_OK) {
case GST_EVENT_FLUSH_STOP:
if (!gst_ducati_viddec_codec_flush (self, FALSE)) {
GST_ERROR_OBJECT (self, "could not flush");
+ gst_event_unref (event);
ret = FALSE;
}
gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);