baseparse: implement leftover draining in pull mode

This commit is contained in:
Mark Nauwelaerts 2009-12-18 21:02:40 +01:00
parent c4db8697d7
commit 90c86c600b

View file

@ -1226,6 +1226,8 @@ done:
return ret; return ret;
} }
/* pull @size bytes at current offset,
* i.e. at least try to and possibly return a shorter buffer if near the end */
static GstFlowReturn static GstFlowReturn
gst_base_parse_pull_range (GstBaseParse * parse, guint size, gst_base_parse_pull_range (GstBaseParse * parse, guint size,
GstBuffer ** buffer) GstBuffer ** buffer)
@ -1282,15 +1284,14 @@ gst_base_parse_pull_range (GstBaseParse * parse, guint size,
} }
if (GST_BUFFER_SIZE (parse->priv->cache) < size) { if (GST_BUFFER_SIZE (parse->priv->cache) < size) {
GST_WARNING_OBJECT (parse, "Dropping short buffer at offset %" GST_DEBUG_OBJECT (parse, "Returning short buffer at offset %"
G_GUINT64_FORMAT ": wanted %u bytes, got %u bytes", parse->priv->offset, G_GUINT64_FORMAT ": wanted %u bytes, got %u bytes", parse->priv->offset,
size, GST_BUFFER_SIZE (parse->priv->cache)); size, GST_BUFFER_SIZE (parse->priv->cache));
gst_buffer_unref (parse->priv->cache); *buffer = parse->priv->cache;
parse->priv->cache = NULL; parse->priv->cache = NULL;
*buffer = NULL; return GST_FLOW_OK;
return GST_FLOW_UNEXPECTED;
} }
*buffer = gst_buffer_create_sub (parse->priv->cache, 0, size); *buffer = gst_buffer_create_sub (parse->priv->cache, 0, size);
@ -1338,10 +1339,17 @@ gst_base_parse_loop (GstPad * pad)
GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT); GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
} }
/* if we got a short read, inform subclass we are draining leftover
* and no more is to be expected */
if (GST_BUFFER_SIZE (buffer) < min_size)
parse->priv->drain = TRUE;
skip = -1; skip = -1;
if (klass->check_valid_frame (parse, buffer, &fsize, &skip)) { if (klass->check_valid_frame (parse, buffer, &fsize, &skip)) {
parse->priv->drain = FALSE;
break; break;
} }
parse->priv->drain = FALSE;
if (skip > 0) { if (skip > 0) {
GST_LOG_OBJECT (parse, "finding sync, skipping %d bytes", skip); GST_LOG_OBJECT (parse, "finding sync, skipping %d bytes", skip);
parse->priv->offset += skip; parse->priv->offset += skip;
@ -1367,6 +1375,8 @@ gst_base_parse_loop (GstPad * pad)
goto eos; goto eos;
else if (ret != GST_FLOW_OK) else if (ret != GST_FLOW_OK)
goto need_pause; goto need_pause;
if (GST_BUFFER_SIZE (outbuf) < fsize)
goto eos;
} }
parse->priv->offset += fsize; parse->priv->offset += fsize;