/* take the currently configured SPS and PPS lists and set them on the caps as
* sprop-parameter-sets */
-static gboolean
+static gchar *
gst_rtp_h264_pay_set_sps_pps (GstRTPBasePayload * basepayload)
{
GstRtpH264Pay *payloader = GST_RTP_H264_PAY (basepayload);
- gchar *profile;
gchar *set;
GList *walk;
GString *sprops;
guint count;
- gboolean res;
GstMapInfo map;
sprops = g_string_new ("");
count++;
}
- if (G_LIKELY (count)) {
- /* profile is 24 bit. Force it to respect the limit */
- profile = g_strdup_printf ("%06x", payloader->profile & 0xffffff);
- /* combine into output caps */
- res = gst_rtp_base_payload_set_outcaps (basepayload,
- "sprop-parameter-sets", G_TYPE_STRING, sprops->str, NULL);
- g_free (profile);
- } else {
- res = gst_rtp_base_payload_set_outcaps (basepayload, NULL);
+ if (G_UNLIKELY (count == 0)) {
+ g_string_free (sprops, TRUE);
+ return NULL;
}
- g_string_free (sprops, TRUE);
- return res;
+ return g_string_free (sprops, FALSE);
}
static GList *
gsize size;
GstBuffer *buffer;
const gchar *alignment, *stream_format;
+ gchar *sprops;
+ gboolean caps_set;
rtph264pay = GST_RTP_H264_PAY (basepayload);
}
gst_buffer_unmap (buffer, &map);
/* and update the caps with the collected data */
- if (!gst_rtp_h264_pay_set_sps_pps (basepayload))
- goto set_sps_pps_failed;
+ sprops = gst_rtp_h264_pay_set_sps_pps (basepayload);
} else {
GST_DEBUG_OBJECT (rtph264pay, "have bytestream h264");
+ sprops = NULL;
+ }
+
+ if (sprops != NULL) {
+ caps_set = gst_rtp_base_payload_set_outcaps (basepayload,
+ "sprop-parameter-sets", G_TYPE_STRING, sprops, NULL);
+ } else {
+ caps_set = gst_rtp_base_payload_set_outcaps (basepayload, NULL);
+ }
+
+ if (sprops != NULL) {
+ g_free (sprops);
+ }
+
+ if (!caps_set) {
+ goto set_caps_failed;
}
return TRUE;
GST_ERROR_OBJECT (rtph264pay, "avcC too small ");
goto error;
}
-set_sps_pps_failed:
+set_caps_failed:
{
- GST_ERROR_OBJECT (rtph264pay, "failed to set sps/pps");
- goto error;
+ GST_ERROR_OBJECT (rtph264pay, "failed to set caps");
+ return FALSE;
}
error:
{