rtph264pay: only update last_spspps time if all sps/pps got sent successfully

This fixes an issue with gst-rtsp-server where no sps and pps are
sent for the first intra frame, because the payloader starts working
already when receiving DESCRIBE but there is no transports so it tries
to send sps and pps, but that fails with a FLUSHING flow. But the time
for last sent sps and pps would still be set, so when PLAY arrives and
the first intra frame is to be sent there is no sps and pps sent due to
that time since last sps pps is less than spspps_interval.

https://bugzilla.gnome.org/show_bug.cgi?id=724213
This commit is contained in:
Göran Jönsson 2014-02-11 12:41:29 +01:00 committed by Tim-Philipp Müller
parent b9a953161f
commit 53ffd9e1ca

View file

@ -711,6 +711,7 @@ gst_rtp_h264_pay_send_sps_pps (GstRTPBasePayload * basepayload,
GstRtpH264Pay * rtph264pay, GstClockTime dts, GstClockTime pts)
{
GstFlowReturn ret = GST_FLOW_OK;
gboolean sent_all_sps_pps = TRUE;
guint i;
for (i = 0; i < rtph264pay->sps->len; i++) {
@ -722,8 +723,10 @@ gst_rtp_h264_pay_send_sps_pps (GstRTPBasePayload * basepayload,
ret = gst_rtp_h264_pay_payload_nal (basepayload, gst_buffer_ref (sps_buf),
dts, pts, FALSE);
/* Not critical here; but throw a warning */
if (ret != GST_FLOW_OK)
if (ret != GST_FLOW_OK) {
sent_all_sps_pps = FALSE;
GST_WARNING ("Problem pushing SPS");
}
}
for (i = 0; i < rtph264pay->pps->len; i++) {
GstBuffer *pps_buf =
@ -734,11 +737,13 @@ gst_rtp_h264_pay_send_sps_pps (GstRTPBasePayload * basepayload,
ret = gst_rtp_h264_pay_payload_nal (basepayload, gst_buffer_ref (pps_buf),
dts, pts, FALSE);
/* Not critical here; but throw a warning */
if (ret != GST_FLOW_OK)
if (ret != GST_FLOW_OK) {
sent_all_sps_pps = FALSE;
GST_WARNING ("Problem pushing PPS");
}
}
if (pts != -1)
if (pts != -1 && sent_all_sps_pps)
rtph264pay->last_spspps = pts;
return ret;