summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>2010-05-15 09:43:28 +0000
committerGwenole Beauchesne <gbeauchesne@splitted-desktop.com>2010-09-20 12:55:46 +0200
commita777a98f2f135469478f9cdf3ea9551bc853f142 (patch)
treed90b06b8e6516b268914a71b3ba0b158541016a7
parent9a3b4a7844f9cca2376117a1236dc3d04a7afb7e (diff)
Add mechanism to reinsert buffer leftovers into the queue.
-rw-r--r--gst-libs/gst/vaapi/gstvaapidecoder.c29
-rw-r--r--gst-libs/gst/vaapi/gstvaapidecoder_ffmpeg.c21
-rw-r--r--gst-libs/gst/vaapi/gstvaapidecoder_priv.h8
3 files changed, 51 insertions, 7 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder.c b/gst-libs/gst/vaapi/gstvaapidecoder.c
index 0bdf05eb..7fb4e86b 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder.c
@@ -70,6 +70,17 @@ push_buffer(GstVaapiDecoder *decoder, GstBuffer *buffer)
return TRUE;
}
+static void
+push_back_buffer(GstVaapiDecoder *decoder, GstBuffer *buffer)
+{
+ GstVaapiDecoderPrivate * const priv = decoder->priv;
+
+ GST_DEBUG("requeue encoded data buffer %p (%d bytes)",
+ buffer, GST_BUFFER_SIZE(buffer));
+
+ g_queue_push_head(priv->buffers, buffer);
+}
+
static GstBuffer *
pop_buffer(GstVaapiDecoder *decoder)
{
@@ -414,6 +425,24 @@ gst_vaapi_decoder_ensure_context(
}
gboolean
+gst_vaapi_decoder_push_buffer_sub(
+ GstVaapiDecoder *decoder,
+ GstBuffer *buffer,
+ guint offset,
+ guint size
+)
+{
+ GstBuffer *subbuffer;
+
+ subbuffer = gst_buffer_create_sub(buffer, offset, size);
+ if (!subbuffer)
+ return FALSE;
+
+ push_back_buffer(decoder, subbuffer);
+ return TRUE;
+}
+
+gboolean
gst_vaapi_decoder_push_surface(
GstVaapiDecoder *decoder,
GstVaapiSurface *surface,
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_ffmpeg.c b/gst-libs/gst/vaapi/gstvaapidecoder_ffmpeg.c
index 79fa94fb..5537ea30 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_ffmpeg.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_ffmpeg.c
@@ -490,8 +490,8 @@ gst_vaapi_decoder_ffmpeg_decode(GstVaapiDecoder *decoder, GstBuffer *buffer)
GstVaapiDecoderFfmpeg * const ffdecoder = GST_VAAPI_DECODER_FFMPEG(decoder);
GstVaapiDecoderFfmpegPrivate * const priv = ffdecoder->priv;
GstClockTime inbuf_ts;
- guchar *inbuf, *outbuf;
- gint inbuf_size, outbuf_size;
+ guchar *outbuf;
+ gint inbuf_ofs, inbuf_size, outbuf_size;
gboolean got_frame;
g_return_val_if_fail(priv->is_constructed,
@@ -503,7 +503,7 @@ gst_vaapi_decoder_ffmpeg_decode(GstVaapiDecoder *decoder, GstBuffer *buffer)
return GST_VAAPI_DECODER_STATUS_ERROR_UNSUPPORTED_CODEC;
}
- inbuf = GST_BUFFER_DATA(buffer);
+ inbuf_ofs = 0;
inbuf_size = GST_BUFFER_SIZE(buffer);
inbuf_ts = GST_BUFFER_TIMESTAMP(buffer);
@@ -513,24 +513,31 @@ gst_vaapi_decoder_ffmpeg_decode(GstVaapiDecoder *decoder, GstBuffer *buffer)
priv->pctx,
priv->avctx,
&outbuf, &outbuf_size,
- inbuf, inbuf_size,
+ GST_BUFFER_DATA(buffer) + inbuf_ofs, inbuf_size,
inbuf_ts, inbuf_ts
);
got_frame = outbuf && outbuf_size > 0;
if (parsed_size > 0) {
- inbuf += parsed_size;
+ inbuf_ofs += parsed_size;
inbuf_size -= parsed_size;
}
} while (!got_frame && inbuf_size > 0);
inbuf_ts = priv->pctx->pts;
}
else {
- outbuf = inbuf;
+ outbuf = GST_BUFFER_DATA(buffer);
outbuf_size = inbuf_size;
- got_frame = inbuf && inbuf_size > 0;
+ got_frame = outbuf && outbuf_size > 0;
+ inbuf_ofs = inbuf_size;
+ inbuf_size = 0;
}
+ if (inbuf_size > 0 &&
+ !gst_vaapi_decoder_push_buffer_sub(decoder, buffer,
+ inbuf_ofs, inbuf_size))
+ return GST_VAAPI_DECODER_STATUS_ERROR_ALLOCATION_FAILED;
+
if (!got_frame && !GST_BUFFER_IS_EOS(buffer))
return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_priv.h b/gst-libs/gst/vaapi/gstvaapidecoder_priv.h
index 2b30cf34..2dd02850 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_priv.h
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_priv.h
@@ -132,6 +132,14 @@ gst_vaapi_decoder_ensure_context(
) attribute_hidden;
gboolean
+gst_vaapi_decoder_push_buffer_sub(
+ GstVaapiDecoder *decoder,
+ GstBuffer *buffer,
+ guint offset,
+ guint size
+) attribute_hidden;
+
+gboolean
gst_vaapi_decoder_push_surface(
GstVaapiDecoder *decoder,
GstVaapiSurface *surface,