asfdemux: Refactor multiple packet pull.

This also fixes a bug by which the first buffer (in a multi-packet mode)
passed to asf_demux_parse_packet() would have a GST_BUFFER_SIZE of the
full incoming buffer and not just of the single asf packet.

Fixes corrupted frames introduced by latest commit.
This commit is contained in:
Edward Hervey 2009-06-29 11:10:42 +02:00
parent 0fc6f338dc
commit 6f58ca470e

View file

@ -1357,7 +1357,6 @@ gst_asf_demux_loop (GstASFDemux * demux)
GstFlowReturn flow = GST_FLOW_OK; GstFlowReturn flow = GST_FLOW_OK;
GstBuffer *buf = NULL; GstBuffer *buf = NULL;
guint64 off; guint64 off;
guint n;
if (G_UNLIKELY (demux->state == GST_ASF_DEMUX_STATE_HEADER)) { if (G_UNLIKELY (demux->state == GST_ASF_DEMUX_STATE_HEADER)) {
if (!gst_asf_demux_pull_headers (demux)) { if (!gst_asf_demux_pull_headers (demux)) {
@ -1391,19 +1390,30 @@ gst_asf_demux_loop (GstASFDemux * demux)
goto read_failed; goto read_failed;
} }
for (n = 0; n < demux->speed_packets; n++) { if (G_LIKELY (demux->speed_packets == 1)) {
GstBuffer *tmp = NULL, *sub = buf; /* FIXME: maybe we should just skip broken packets and error out only
* after a few broken packets in a row? */
if (G_UNLIKELY (!gst_asf_demux_parse_packet (demux, buf)))
goto parse_error;
if (G_UNLIKELY (n != 0)) flow = gst_asf_demux_push_complete_payloads (demux, FALSE);
tmp = sub =
++demux->packet;
} else {
guint n;
for (n = 0; n < demux->speed_packets; n++) {
GstBuffer *sub;
sub =
gst_buffer_create_sub (buf, n * demux->packet_size, gst_buffer_create_sub (buf, n * demux->packet_size,
demux->packet_size); demux->packet_size);
/* FIXME: maybe we should just skip broken packets and error out only /* FIXME: maybe we should just skip broken packets and error out only
* after a few broken packets in a row? */ * after a few broken packets in a row? */
if (G_UNLIKELY (!gst_asf_demux_parse_packet (demux, sub))) if (G_UNLIKELY (!gst_asf_demux_parse_packet (demux, sub)))
goto parse_error; goto parse_error;
if (G_UNLIKELY (n != 0))
gst_buffer_unref (tmp); gst_buffer_unref (sub);
flow = gst_asf_demux_push_complete_payloads (demux, FALSE); flow = gst_asf_demux_push_complete_payloads (demux, FALSE);
@ -1412,8 +1422,8 @@ gst_asf_demux_loop (GstASFDemux * demux)
} }
/* reset speed pull */ /* reset speed pull */
if (G_UNLIKELY (demux->speed_packets != 1))
demux->speed_packets = 1; demux->speed_packets = 1;
}
gst_buffer_unref (buf); gst_buffer_unref (buf);