{
GstVaapiDecoderMpeg2 * const decoder =
GST_VAAPI_DECODER_MPEG2(base_decoder);
+ GstVaapiParserState * const ps = GST_VAAPI_PARSER_STATE(base_decoder);
GstVaapiDecoderUnitMpeg2 *unit;
GstVaapiDecoderStatus status;
GstMpegVideoPacket *packet;
const guchar *buf;
guint32 start_code;
guint size, buf_size, flags;
- gint ofs;
+ gint ofs, ofs2;
status = ensure_decoder(decoder);
if (status != GST_VAAPI_DECODER_STATUS_SUCCESS)
ofs = scan_for_start_code(adapter, 0, size, &start_code);
if (ofs < 0)
return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
- gst_adapter_flush(adapter, ofs);
- size -= ofs;
- ofs = G_UNLIKELY(size < 8) ? -1 :
- scan_for_start_code(adapter, 4, size - 4, NULL);
+ if (ofs > 0) {
+ gst_adapter_flush(adapter, ofs);
+ size -= ofs;
+ }
+
+ ofs2 = ps->input_offset2 - ofs - 4;
+ if (ofs2 < 4)
+ ofs2 = 4;
+
+ ofs = G_UNLIKELY(size < ofs2 + 4) ? -1 :
+ scan_for_start_code(adapter, ofs2, size - ofs2, NULL);
if (ofs < 0) {
// Assume the whole packet is present if end-of-stream
- if (!at_eos)
+ if (!at_eos) {
+ ps->input_offset2 = size;
return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
+ }
ofs = size;
}
buf_size = ofs;
+ ps->input_offset2 = 0;
buf = gst_adapter_peek(adapter, buf_size);
if (!buf)