rtpasfdepay: simplify and refactor packet parsing

Specifically, refactor buffer padding and consider marker bit for fragment
assembling.
This commit is contained in:
Mark Nauwelaerts 2011-04-27 15:20:20 +02:00
parent 4f2627e737
commit 58e445d91f

View file

@ -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,