diff options
author | Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> | 2012-07-17 10:07:11 +0000 |
---|---|---|
committer | Vincent Penquerc'h <vincent.penquerch@collabora.co.uk> | 2012-07-17 10:17:33 +0000 |
commit | 489efa16ced550842bb80196580ff4aefdae6e3c (patch) | |
tree | f47270b1be0770fe0c8b19854f1ccb06592fce48 | |
parent | 7a19df69a600d071017d15f3d0799eb0a6ffd7c7 (diff) |
ducatividdec: do not discard unused input data
The video decoder may not use all data applied to it in a decode call.
When this happens, we want to supply the remaining data again next time,
or corruption will happen due to "missing" data.
The data is currently copied, which is not an issue in practice as this
seems to happen not often, and more a small amount of data.
-rw-r--r-- | src/gstducatividdec.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/gstducatividdec.c b/src/gstducatividdec.c index 7f3d8a5..205dca1 100644 --- a/src/gstducatividdec.c +++ b/src/gstducatividdec.c @@ -505,7 +505,9 @@ gst_ducati_viddec_codec_flush (GstDucatiVidDec * self, gboolean eos) 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; @@ -1019,7 +1021,6 @@ allocate_buffer: } have_out_buf: - self->in_size = 0; buf = GST_DUCATIVIDDEC_GET_CLASS (self)->push_input (self, buf); if (ts != GST_CLOCK_TIME_NONE) { @@ -1059,6 +1060,27 @@ have_out_buf: 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; |