diff --git a/src/gstducatividdec.c b/src/gstducatividdec.c
index ebb852d5efdb3ba355e4e51cf3512e400975be32..afb36749a5c47048a6f095e1c685cd4c4beb2f01 100644 (file)
--- a/src/gstducatividdec.c
+++ b/src/gstducatividdec.c
self->first_out_buffer = TRUE;
/* allocate input buffer and initialize inBufs: */
+ /* FIXME: needed size here has nothing to do with width * height */
self->input_bo = omap_bo_new (self->device,
self->width * self->height, OMAP_BO_WC);
self->input = omap_bo_map (self->input_bo);
self->outArgs->extendedError, self->status->extendedError);
}
+ /* we now let the codec decide */
+ self->dynParams->newFrameFlag = XDAS_FALSE;
+
+ if (err == XDM_EFAIL || self->outArgs->outBufsInUseFlag)
+ goto skip_outbuf_processing;
+
for (i = 0; i < IVIDEO2_MAX_IO_BUFFERS && self->outArgs->outputID[i]; i++) {
gboolean interlaced;
self->send_crop_event = FALSE;
}
- if (G_UNLIKELY (self->first_out_buffer) && send) {
+ if (G_UNLIKELY (self->first_out_buffer) && send && !self->outArgs->outBufsInUseFlag) {
GstDRMBufferPool *pool;
self->first_out_buffer = FALSE;
gst_drm_buffer_pool_destroy (pool);
}
- if (send) {
+ if (send && !self->outArgs->outBufsInUseFlag) {
GstClockTime ts;
ts = GST_BUFFER_TIMESTAMP (outbuf);
}
}
+skip_outbuf_processing:
for (i = 0; i < IVIDEO2_MAX_IO_BUFFERS && self->outArgs->freeBufID[i]; i++) {
codec_unlock_outbuf (self, self->outArgs->freeBufID[i]);
}
self->ts_may_be_pts = TRUE;
self->ts_is_pts = FALSE;
self->wait_keyframe = TRUE;
+ self->in_size = 0;
+ self->needs_flushing = FALSE;
+ self->need_out_buf = TRUE;
if (G_UNLIKELY (self->first_in_buffer)) {
goto out;
memset (&self->outArgs->outputID, 0, sizeof (self->outArgs->outputID));
memset (&self->outArgs->freeBufID, 0, sizeof (self->outArgs->freeBufID));
+ self->dynParams->newFrameFlag = XDAS_TRUE;
+
/* on a flush, it is normal (and not an error) for the last _process() call
* to return an error..
*/
}
have_out_buf:
- self->in_size = 0;
buf = GST_DUCATIVIDDEC_GET_CLASS (self)->push_input (self, buf);
if (ts != GST_CLOCK_TIME_NONE) {
self->first_in_buffer = FALSE;
+ /* The copy could be avoided by playing with the buffer pointer,
+ but it seems to be rare and for not many bytes */
+ GST_DEBUG_OBJECT (self, "Consumed %d/%d (%d) bytes, %d left",
+ self->outArgs->bytesConsumed, self->in_size,
+ self->inArgs->numBytes,
+ self->in_size - self->outArgs->bytesConsumed);
+ if (self->outArgs->bytesConsumed > 0) {
+ if (self->outArgs->bytesConsumed > self->in_size) {
+ GST_WARNING_OBJECT (self, "Codec claims to have used more bytes than supplied");
+ self->in_size = 0;
+ } else {
+ if (self->outArgs->bytesConsumed < self->in_size) {
+ GST_DEBUG_OBJECT (self, "First 16 were:");
+ gst_util_dump_mem (self->input, 16);
+ memmove (self->input, self->input + self->outArgs->bytesConsumed,
+ self->in_size - self->outArgs->bytesConsumed);
+ }
+ self->in_size -= self->outArgs->bytesConsumed;
+ }
+ }
+
if (self->outArgs->outBufsInUseFlag) {
GST_DEBUG_OBJECT (self, "outBufsInUseFlag set");
self->need_out_buf = FALSE;
goto allocate_buffer;
}
+ if (self->needs_flushing)
+ gst_ducati_viddec_codec_flush (self, FALSE);
+
return GST_FLOW_OK;
}