/* Output data */
PendingPacketState state;
+ /* PES header being reconstructed (optional, allocated) */
+ guint8 *pending_header_data;
+ guint pending_header_size;
+
/* Data being reconstructed (allocated) */
guint8 *data;
g_free (stream->data);
stream->data = NULL;
+ g_free (stream->pending_header_data);
+ stream->pending_header_data = NULL;
+ stream->pending_header_size = 0;
stream->state = PENDING_PACKET_EMPTY;
stream->expected_size = 0;
stream->allocated_size = 0;
GST_MEMDUMP ("Header buffer", data, MIN (length, 32));
+ if (G_UNLIKELY (stream->pending_header_data)) {
+ /* Accumulate with previous header if present */
+ stream->pending_header_data =
+ g_realloc (stream->pending_header_data,
+ stream->pending_header_size + length);
+ memcpy (stream->pending_header_data + stream->pending_header_size, data,
+ length);
+ data = stream->pending_header_data;
+ length = stream->pending_header_size + length;
+ }
+
parseres = mpegts_parse_pes_header (data, length, &header);
- if (G_UNLIKELY (parseres == PES_PARSING_NEED_MORE))
- goto discont;
+
+ if (G_UNLIKELY (parseres == PES_PARSING_NEED_MORE)) {
+ /* This can happen if PES header is bigger than a packet. */
+ if (!stream->pending_header_data)
+ stream->pending_header_data = g_memdup2 (data, length);
+ stream->pending_header_size = length;
+ return;
+ }
if (G_UNLIKELY (parseres == PES_PARSING_BAD)) {
GST_WARNING ("Error parsing PES header. pid: 0x%x stream_type: 0x%x",
stream->stream.pid, stream->stream.stream_type);
stream->state = PENDING_PACKET_BUFFER;
+ if (stream->pending_header_data) {
+ g_free (stream->pending_header_data);
+ stream->pending_header_data = NULL;
+ stream->pending_header_size = 0;
+ }
+
return;
discont:
+ if (stream->pending_header_data) {
+ g_free (stream->pending_header_data);
+ stream->pending_header_data = NULL;
+ stream->pending_header_size = 0;
+ }
stream->state = PENDING_PACKET_DISCONT;
return;
}
g_free (stream->data);
stream->data = NULL;
}
+ if (G_UNLIKELY (stream->pending_header_data)) {
+ g_free (stream->pending_header_data);
+ stream->pending_header_data = NULL;
+ }
stream->state = PENDING_PACKET_HEADER;
} else {
GST_ELEMENT_WARNING_WITH_DETAILS (demux, STREAM, DEMUX,
g_free (stream->data);
stream->data = NULL;
}
+ if (G_UNLIKELY (stream->pending_header_data)) {
+ g_free (stream->pending_header_data);
+ stream->pending_header_data = NULL;
+ }
stream->continuity_counter = CONTINUITY_UNSET;
break;
}