rtph264depay: fix FU-B handling

Skip extra 16-bit DON in FU-B header.

Fixes https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues/806

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6607>
This commit is contained in:
Tim-Philipp Müller 2024-04-11 01:49:40 +01:00 committed by GStreamer Marge Bot
parent b1a45b527a
commit eec64e372b

View file

@ -1307,6 +1307,11 @@ gst_rtp_h264_depay_process (GstRTPBaseDepayload * depayload, GstRTPBuffer * rtp)
/* FU-B Fragmentation unit 5.8 */ /* FU-B Fragmentation unit 5.8 */
gboolean S, E; gboolean S, E;
guint fu_hdr_size = (nal_unit_type == 28) ? 2 : 4;
if (payload_len < fu_hdr_size)
goto short_payload;
/* +---------------+ /* +---------------+
* |0|1|2|3|4|5|6|7| * |0|1|2|3|4|5|6|7|
* +-+-+-+-+-+-+-+-+ * +-+-+-+-+-+-+-+-+
@ -1344,9 +1349,9 @@ gst_rtp_h264_depay_process (GstRTPBaseDepayload * depayload, GstRTPBuffer * rtp)
/* reconstruct NAL header */ /* reconstruct NAL header */
nal_header = (payload[0] & 0xe0) | (payload[1] & 0x1f); nal_header = (payload[0] & 0xe0) | (payload[1] & 0x1f);
/* Strip type header, FU header */ /* Strip type header, FU header, and FU-B DON (if present) */
payload += 2; payload += fu_hdr_size;
payload_len -= 2; payload_len -= fu_hdr_size;
nalu_size = 1 + payload_len; nalu_size = 1 + payload_len;
outsize = nalu_size + sizeof (sync_bytes); outsize = nalu_size + sizeof (sync_bytes);
@ -1387,9 +1392,9 @@ gst_rtp_h264_depay_process (GstRTPBaseDepayload * depayload, GstRTPBuffer * rtp)
} }
rtph264depay->last_fu_seqnum = gst_rtp_buffer_get_seq (rtp); rtph264depay->last_fu_seqnum = gst_rtp_buffer_get_seq (rtp);
/* strip off FU indicator and FU header bytes */ /* strip off FU indicator, FU header bytes and FU-B DON (if present) */
payload += 2; payload += fu_hdr_size;
payload_len -= 2; payload_len -= fu_hdr_size;
outsize = payload_len; outsize = payload_len;
outbuf = gst_buffer_new_and_alloc (outsize); outbuf = gst_buffer_new_and_alloc (outsize);
@ -1449,6 +1454,12 @@ empty_packet:
gst_rtp_base_depayload_dropped (depayload); gst_rtp_base_depayload_dropped (depayload);
return NULL; return NULL;
} }
short_payload:
{
GST_DEBUG_OBJECT (rtph264depay, "short payload");
gst_rtp_base_depayload_dropped (depayload);
return NULL;
}
undefined_type: undefined_type:
{ {
GST_ELEMENT_WARNING (rtph264depay, STREAM, DECODE, GST_ELEMENT_WARNING (rtph264depay, STREAM, DECODE,