mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 02:31:03 +00:00
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:
parent
0fc6f338dc
commit
6f58ca470e
1 changed files with 24 additions and 14 deletions
|
@ -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,29 +1390,40 @@ 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;
|
|
||||||
|
|
||||||
if (G_UNLIKELY (n != 0))
|
|
||||||
tmp = sub =
|
|
||||||
gst_buffer_create_sub (buf, n * 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, buf)))
|
||||||
goto parse_error;
|
goto parse_error;
|
||||||
if (G_UNLIKELY (n != 0))
|
|
||||||
gst_buffer_unref (tmp);
|
|
||||||
|
|
||||||
flow = gst_asf_demux_push_complete_payloads (demux, FALSE);
|
flow = gst_asf_demux_push_complete_payloads (demux, FALSE);
|
||||||
|
|
||||||
++demux->packet;
|
++demux->packet;
|
||||||
|
|
||||||
}
|
} else {
|
||||||
|
guint n;
|
||||||
|
for (n = 0; n < demux->speed_packets; n++) {
|
||||||
|
GstBuffer *sub;
|
||||||
|
|
||||||
/* reset speed pull */
|
sub =
|
||||||
if (G_UNLIKELY (demux->speed_packets != 1))
|
gst_buffer_create_sub (buf, n * demux->packet_size,
|
||||||
|
demux->packet_size);
|
||||||
|
/* 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, sub)))
|
||||||
|
goto parse_error;
|
||||||
|
|
||||||
|
gst_buffer_unref (sub);
|
||||||
|
|
||||||
|
flow = gst_asf_demux_push_complete_payloads (demux, FALSE);
|
||||||
|
|
||||||
|
++demux->packet;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reset speed pull */
|
||||||
demux->speed_packets = 1;
|
demux->speed_packets = 1;
|
||||||
|
}
|
||||||
|
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue