mpegtspacketizer: Fix flushing/sync handling

There was a stray adapter_flush() now that we used a temporary buffer
This commit is contained in:
Edward Hervey 2012-07-24 20:39:41 +02:00
parent 121aa3ad13
commit 105737db54

View File

@ -2459,6 +2459,8 @@ mpegts_packetizer_clear (MpegTSPacketizer2 * packetizer)
void void
mpegts_packetizer_flush (MpegTSPacketizer2 * packetizer) mpegts_packetizer_flush (MpegTSPacketizer2 * packetizer)
{ {
GST_DEBUG ("Flushing");
if (packetizer->streams) { if (packetizer->streams) {
int i; int i;
for (i = 0; i < 8192; i++) { for (i = 0; i < 8192; i++) {
@ -2606,6 +2608,7 @@ MpegTSPacketizerPacketReturn
mpegts_packetizer_next_packet (MpegTSPacketizer2 * packetizer, mpegts_packetizer_next_packet (MpegTSPacketizer2 * packetizer,
MpegTSPacketizerPacket * packet) MpegTSPacketizerPacket * packet)
{ {
MpegTSPacketizerPrivate *priv = packetizer->priv;
guint avail; guint avail;
int i; int i;
@ -2614,17 +2617,15 @@ mpegts_packetizer_next_packet (MpegTSPacketizer2 * packetizer,
return PACKET_NEED_MORE; return PACKET_NEED_MORE;
} }
while ((avail = packetizer->priv->available) >= packetizer->packet_size) { while ((avail = priv->available) >= packetizer->packet_size) {
if (packetizer->priv->mapped == NULL) { if (priv->mapped == NULL) {
packetizer->priv->mapped_size = priv->mapped_size =
packetizer->priv->available - priv->available - (priv->available % packetizer->packet_size);
(packetizer->priv->available % packetizer->packet_size); priv->mapped =
packetizer->priv->mapped = (guint8 *) gst_adapter_map (packetizer->adapter, priv->mapped_size);
(guint8 *) gst_adapter_map (packetizer->adapter, priv->offset = 0;
packetizer->priv->mapped_size);
packetizer->priv->offset = 0;
} }
packet->data_start = packetizer->priv->mapped + packetizer->priv->offset; packet->data_start = priv->mapped + priv->offset;
/* M2TS packets don't start with the sync byte, all other variants do */ /* M2TS packets don't start with the sync byte, all other variants do */
if (packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE) if (packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE)
@ -2638,7 +2639,7 @@ mpegts_packetizer_next_packet (MpegTSPacketizer2 * packetizer,
GST_LOG ("offset %" G_GUINT64_FORMAT, packet->offset); GST_LOG ("offset %" G_GUINT64_FORMAT, packet->offset);
packetizer->offset += packetizer->packet_size; packetizer->offset += packetizer->packet_size;
GST_MEMDUMP ("data_start", packet->data_start, 16); GST_MEMDUMP ("data_start", packet->data_start, 16);
packet->origts = packetizer->priv->last_in_time; packet->origts = priv->last_in_time;
/* Check sync byte */ /* Check sync byte */
if (G_LIKELY (packet->data_start[0] == 0x47)) if (G_LIKELY (packet->data_start[0] == 0x47))
@ -2658,13 +2659,15 @@ mpegts_packetizer_next_packet (MpegTSPacketizer2 * packetizer,
i += 188; i += 188;
} }
gst_adapter_flush (packetizer->adapter, i); GST_DEBUG ("Flushing %d bytes out", i);
/* gst_adapter_flush (packetizer->adapter, i); */
/* Pop out the remaining data... */ /* Pop out the remaining data... */
packetizer->priv->offset += i; priv->offset += i;
packetizer->priv->available -= i; priv->available -= i;
if (G_UNLIKELY (packetizer->priv->available < packetizer->packet_size)) { if (G_UNLIKELY (priv->available < packetizer->packet_size)) {
gst_adapter_flush (packetizer->adapter, packetizer->priv->offset); GST_DEBUG ("Flushing %d bytes out", priv->offset);
packetizer->priv->mapped = NULL; gst_adapter_flush (packetizer->adapter, priv->offset);
priv->mapped = NULL;
} }
continue; continue;
} }
@ -2697,11 +2700,14 @@ void
mpegts_packetizer_clear_packet (MpegTSPacketizer2 * packetizer, mpegts_packetizer_clear_packet (MpegTSPacketizer2 * packetizer,
MpegTSPacketizerPacket * packet) MpegTSPacketizerPacket * packet)
{ {
packetizer->priv->offset += packetizer->packet_size; MpegTSPacketizerPrivate *priv = packetizer->priv;
packetizer->priv->available -= packetizer->packet_size;
if (G_UNLIKELY (packetizer->priv->available < packetizer->packet_size)) { priv->offset += packetizer->packet_size;
gst_adapter_flush (packetizer->adapter, packetizer->priv->offset); priv->available -= packetizer->packet_size;
packetizer->priv->mapped = NULL;
if (G_UNLIKELY (priv->mapped && priv->available < packetizer->packet_size)) {
gst_adapter_flush (packetizer->adapter, priv->offset);
priv->mapped = NULL;
} }
} }