mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-23 14:36:24 +00:00
rtpasfdepay: simplify and refactor packet parsing
Specifically, refactor buffer padding and consider marker bit for fragment assembling.
This commit is contained in:
parent
4f2627e737
commit
58e445d91f
1 changed files with 37 additions and 41 deletions
|
@ -427,50 +427,46 @@ gst_rtp_asf_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
|
||||||
/* Fragmented packet handling */
|
/* Fragmented packet handling */
|
||||||
outbuf = NULL;
|
outbuf = NULL;
|
||||||
|
|
||||||
if (len_offs == 0 && (available = gst_adapter_available (depay->adapter))) {
|
if (len_offs == (available = gst_adapter_available (depay->adapter))) {
|
||||||
/* Beginning of a new fragmented packet, Extract the previous buffer if any */
|
/* fragment aligns with what we have, add it */
|
||||||
GST_DEBUG ("Extracting previous fragmented buffer from adapter");
|
GST_LOG_OBJECT (depay, "collecting fragment");
|
||||||
sub = gst_adapter_take_buffer (depay->adapter, available);
|
sub = gst_rtp_buffer_get_payload_subbuffer (buf, offset, packet_len);
|
||||||
if (available < depay->packet_size) {
|
gst_adapter_push (depay->adapter, sub);
|
||||||
/* Add padding if needed */
|
/* RTP marker bit M is set if this is last fragment */
|
||||||
GST_DEBUG ("Padding outgoing buffer to packet_size (%d, was %d",
|
if (gst_rtp_buffer_get_marker (buf)) {
|
||||||
depay->packet_size, available);
|
GST_LOG_OBJECT (depay, "last fragment, assembling packet");
|
||||||
outbuf = gst_buffer_new_and_alloc (depay->packet_size);
|
outbuf =
|
||||||
memcpy (GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (sub), available);
|
gst_adapter_take_buffer (depay->adapter, available + packet_len);
|
||||||
memset (GST_BUFFER_DATA (outbuf) + available, 0,
|
|
||||||
depay->packet_size - available);
|
|
||||||
gst_buffer_unref (sub);
|
|
||||||
gst_rtp_asf_depay_set_padding (depay, outbuf,
|
|
||||||
depay->packet_size - available);
|
|
||||||
} else
|
|
||||||
outbuf = sub;
|
|
||||||
}
|
|
||||||
GST_DEBUG ("storing fragmented buffer continuation and returning");
|
|
||||||
available = gst_adapter_available (depay->adapter);
|
|
||||||
GST_DEBUG ("Available bytes (%d), len_offs (%d)", available, len_offs);
|
|
||||||
if ((available = gst_adapter_available (depay->adapter))) {
|
|
||||||
if (available != len_offs) {
|
|
||||||
GST_WARNING ("Available bytes (%d) != len_offs (%d), trimming buffer",
|
|
||||||
available, len_offs);
|
|
||||||
sub = gst_adapter_take_buffer (depay->adapter, len_offs);
|
|
||||||
gst_adapter_clear (depay->adapter);
|
|
||||||
if (sub)
|
|
||||||
gst_adapter_push (depay->adapter, sub);
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (available) {
|
||||||
|
GST_WARNING_OBJECT (depay, "Offset doesn't match previous data?!");
|
||||||
|
GST_DEBUG_OBJECT (depay, "clearing for re-sync");
|
||||||
|
gst_adapter_clear (depay->adapter);
|
||||||
|
} else
|
||||||
|
GST_DEBUG_OBJECT (depay, "waiting for start of packet");
|
||||||
}
|
}
|
||||||
sub = gst_rtp_buffer_get_payload_subbuffer (buf, offset, packet_len);
|
|
||||||
gst_adapter_push (depay->adapter, sub);
|
|
||||||
/* If we haven't completed a full ASF packet, return */
|
|
||||||
if (!outbuf)
|
|
||||||
return NULL;
|
|
||||||
} else if (packet_len >= depay->packet_size) {
|
|
||||||
GST_LOG_OBJECT (depay, "creating subbuffer");
|
|
||||||
outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, offset, packet_len);
|
|
||||||
} else {
|
} else {
|
||||||
GST_LOG_OBJECT (depay, "padding buffer");
|
GST_LOG_OBJECT (depay, "collecting packet");
|
||||||
/* we need to pad with zeroes to packet_size if it's smaller */
|
outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, offset, packet_len);
|
||||||
outbuf = gst_buffer_new_and_alloc (depay->packet_size);
|
}
|
||||||
memcpy (GST_BUFFER_DATA (outbuf), payload, packet_len);
|
|
||||||
|
/* If we haven't completed a full ASF packet, return */
|
||||||
|
if (!outbuf)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* we need to pad with zeroes to packet_size if it's smaller */
|
||||||
|
g_assert (packet_len == GST_BUFFER_SIZE (outbuf));
|
||||||
|
packet_len = GST_BUFFER_SIZE (outbuf);
|
||||||
|
if (packet_len < depay->packet_size) {
|
||||||
|
GstBuffer *tmp;
|
||||||
|
|
||||||
|
GST_LOG_OBJECT (depay, "padding buffer size %d to packet size %d",
|
||||||
|
packet_len, depay->packet_size);
|
||||||
|
tmp = gst_buffer_new_and_alloc (depay->packet_size);
|
||||||
|
memcpy (GST_BUFFER_DATA (tmp), GST_BUFFER_DATA (outbuf), packet_len);
|
||||||
|
gst_buffer_unref (outbuf);
|
||||||
|
outbuf = tmp;
|
||||||
memset (GST_BUFFER_DATA (outbuf) + packet_len, 0,
|
memset (GST_BUFFER_DATA (outbuf) + packet_len, 0,
|
||||||
depay->packet_size - packet_len);
|
depay->packet_size - packet_len);
|
||||||
gst_rtp_asf_depay_set_padding (depay, outbuf,
|
gst_rtp_asf_depay_set_padding (depay, outbuf,
|
||||||
|
|
Loading…
Reference in a new issue