mpeg2: optimize scan for the second start code.

Optimize scan for the second start code, on the next parse() call so that
to avoid scanning again earlier bytes where we didn't find any start code.
This commit is contained in:
Gwenole Beauchesne 2013-01-02 14:18:31 +01:00
parent 9458bbdc16
commit 7ca43932e5

View file

@ -1160,13 +1160,14 @@ gst_vaapi_decoder_mpeg2_parse(GstVaapiDecoder *base_decoder,
{
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)
@ -1179,18 +1180,28 @@ gst_vaapi_decoder_mpeg2_parse(GstVaapiDecoder *base_decoder,
ofs = scan_for_start_code(adapter, 0, size, &start_code);
if (ofs < 0)
return GST_VAAPI_DECODER_STATUS_ERROR_NO_DATA;
if (ofs > 0) {
gst_adapter_flush(adapter, ofs);
size -= ofs;
}
ofs = G_UNLIKELY(size < 8) ? -1 :
scan_for_start_code(adapter, 4, size - 4, NULL);
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)