GstAdapter *adapter;
guint last_offset;
+ guint last_entropy_len;
/* negotiated state */
gint caps_width, caps_height;
* enough data.
*/
static guint
-gst_jpeg_parse_match_next_marker (const guint8 * data, guint size)
+gst_jpeg_parse_match_next_marker (GstJpegParse * parse, const guint8 * data,
+ guint size)
{
guint marker_len;
guint8 tag;
goto need_more_data;
if (G_UNLIKELY (gst_jpeg_parse_parse_tag_has_entropy_segment (tag))) {
+ if (parse->priv->last_entropy_len) {
+ marker_len = parse->priv->last_entropy_len;
+ GST_LOG_OBJECT (parse, "resuming entropy segment scan at len %u",
+ marker_len);
+ }
while (!(data[marker_len] == 0xff && data[marker_len + 1] != 0x00)) {
++marker_len;
- if (G_UNLIKELY (marker_len + 2 > size))
+ if (G_UNLIKELY (marker_len + 2 > size)) {
+ parse->priv->last_entropy_len = marker_len;
goto need_more_data;
+ }
}
+ parse->priv->last_entropy_len = 0;
}
return marker_len;
return offset;
}
/* Skip over this marker. */
- marker_len = gst_jpeg_parse_match_next_marker (data + offset,
+ marker_len = gst_jpeg_parse_match_next_marker (parse, data + offset,
size - offset);
if (G_UNLIKELY (marker_len == -1)) {
return -1;
/* reset the offset (only when we flushed) */
parse->priv->last_offset = 2;
+ parse->priv->last_entropy_len = 0;
outbuf = gst_adapter_take_buffer (parse->priv->adapter, len);
if (outbuf == NULL) {
parse->priv->next_ts = GST_CLOCK_TIME_NONE;
parse->priv->last_offset = 2;
+ parse->priv->last_entropy_len = 0;
default:
break;
}