mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-28 03:00:35 +00:00
rtph264depay: Insert SPS/PPS NALs into the stream
h264parse does the same and this fixes decoding of some streams with 32 SPS (or 256 PPS). It is allowed to have SPS ID 0 to 31 (or PPS ID 0 to 255), but the field in the codec_data for the number of SPS or PPS is only 5 (or 8) bit. As such, 32 SPS (or 256 PPS) are interpreted as 0 everywhere. This looks like a mistake in the part of the spec about the codec_data.
This commit is contained in:
parent
8b6a261703
commit
ef7863355c
1 changed files with 50 additions and 0 deletions
|
@ -396,6 +396,56 @@ gst_rtp_h264_set_src_caps (GstRtpH264Depay * rtph264depay)
|
|||
srccaps);
|
||||
gst_caps_unref (srccaps);
|
||||
|
||||
/* Insert SPS and PPS into the stream on next opportunity */
|
||||
{
|
||||
gint i;
|
||||
GstBuffer *codec_data;
|
||||
GstMapInfo map;
|
||||
guint8 *data;
|
||||
guint len = 0;
|
||||
|
||||
for (i = 0; i < rtph264depay->sps->len; i++) {
|
||||
len += 4 + gst_buffer_get_size (g_ptr_array_index (rtph264depay->sps, i));
|
||||
}
|
||||
|
||||
for (i = 0; i < rtph264depay->pps->len; i++) {
|
||||
len += 4 + gst_buffer_get_size (g_ptr_array_index (rtph264depay->pps, i));
|
||||
}
|
||||
|
||||
codec_data = gst_buffer_new_and_alloc (len);
|
||||
gst_buffer_map (codec_data, &map, GST_MAP_WRITE);
|
||||
data = map.data;
|
||||
|
||||
for (i = 0; i < rtph264depay->sps->len; i++) {
|
||||
GstBuffer *sps_buf = g_ptr_array_index (rtph264depay->sps, i);
|
||||
guint sps_size = gst_buffer_get_size (sps_buf);
|
||||
|
||||
if (rtph264depay->byte_stream)
|
||||
memcpy (data, sync_bytes, sizeof (sync_bytes));
|
||||
else
|
||||
GST_WRITE_UINT32_BE (data, sps_size);
|
||||
gst_buffer_extract (sps_buf, 0, data + 4, -1);
|
||||
data += 4 + sps_size;
|
||||
}
|
||||
|
||||
for (i = 0; i < rtph264depay->pps->len; i++) {
|
||||
GstBuffer *pps_buf = g_ptr_array_index (rtph264depay->pps, i);
|
||||
guint pps_size = gst_buffer_get_size (pps_buf);
|
||||
|
||||
if (rtph264depay->byte_stream)
|
||||
memcpy (data, sync_bytes, sizeof (sync_bytes));
|
||||
else
|
||||
GST_WRITE_UINT32_BE (data, pps_size);
|
||||
gst_buffer_extract (pps_buf, 0, data + 4, -1);
|
||||
data += 4 + pps_size;
|
||||
}
|
||||
|
||||
gst_buffer_unmap (codec_data, &map);
|
||||
if (rtph264depay->codec_data)
|
||||
gst_buffer_unref (rtph264depay->codec_data);
|
||||
rtph264depay->codec_data = codec_data;
|
||||
}
|
||||
|
||||
if (res)
|
||||
rtph264depay->new_codec_data = FALSE;
|
||||
|
||||
|
|
Loading…
Reference in a new issue