diff options
| author | Wim Taymans <wim.taymans@gmail.com> | 2005-09-21 12:19:24 +0000 | 
|---|---|---|
| committer | Wim Taymans <wim.taymans@gmail.com> | 2005-09-21 12:19:24 +0000 | 
| commit | 9dd3929730bc3e2656eabfd8a8edfc7a61bb0176 (patch) | |
| tree | b67f40938625cb38ade8500e3a1650ed3db04c9d | |
| parent | eb20f045f8fcbf9e6459cb7d7c608acb72c5f8b6 (diff) | |
gst/rtp/README: Update README
Original commit message from CVS:
* gst/rtp/README:
Update README
* gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_sink_setcaps):
Make extra params as strings.
* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_state),
(gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps),
(gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_send):
Make state change return NO_PREROLL as this is a live
source.
* gst/udp/gstudpsrc.c: (gst_udpsrc_set_property):
Don't unref old caps when NULL.
| -rw-r--r-- | ChangeLog | 17 | ||||
| -rw-r--r-- | gst/rtp/README | 11 | ||||
| -rw-r--r-- | gst/rtp/gstrtpamrdec.c | 28 | ||||
| -rw-r--r-- | gst/rtp/gstrtpamrdepay.c | 28 | ||||
| -rw-r--r-- | gst/rtsp/gstrtspsrc.c | 111 | ||||
| -rw-r--r-- | gst/udp/gstudpsrc.c | 3 | 
6 files changed, 140 insertions, 58 deletions
@@ -1,3 +1,20 @@ +2005-09-21  Wim Taymans  <wim@fluendo.com> + +	* gst/rtp/README: +	Update README + +	* gst/rtp/gstrtpamrdec.c: (gst_rtpamrdec_sink_setcaps): +	Make extra params as strings. + +	* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_state), +	(gst_rtspsrc_parse_rtpmap), (gst_rtspsrc_media_to_caps), +	(gst_rtspsrc_stream_setup_rtp), (gst_rtspsrc_send): +	Make state change return NO_PREROLL as this is a live +	source. + +	* gst/udp/gstudpsrc.c: (gst_udpsrc_set_property): +	Don't unref old caps when NULL. +  2005-09-20  Wim Taymans  <wim@fluendo.com>  	* gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_get_type), diff --git a/gst/rtp/README b/gst/rtp/README index 13f0fd93..ed1a27b6 100644 --- a/gst/rtp/README +++ b/gst/rtp/README @@ -35,7 +35,8 @@ The following fields can or must (*) be specified in the structure:       extra encoding parameters (as in the SDP a=rtpmap: field). only required       if different from the default of the encoding-name. -   Optional parameters as key/value pairs, media type specific. +   Optional parameters as key/value pairs, media type specific. The value type +   should be of type G_TYPE_STRING.   Example: @@ -45,10 +46,10 @@ The following fields can or must (*) be specified in the structure:        "clock-rate", G_TYPE_INT, 8000,           -]        "encoding-name", G_TYPE_STRING, "AMR",    -] - required since payload >= 96        "encoding-params", G_TYPE_STRING, "1",	-] - optional param for AMR -      "octet-align", G_TYPE_BOOLEAN, TRUE,	-] -      "crc", G_TYPE_BOOLEAN, FALSE,              ] -      "robust-sorting", G_TYPE_BOOLEAN, FALSE,   ]  AMR specific params. -      "interleaving", G_TYPE_BOOLEAN, FALSE,    -] +      "octet-align", G_TYPE_STRING, "1",	-] +      "crc", G_TYPE_STRING, "0",                 ] +      "robust-sorting", G_TYPE_STRING, "0",      ]  AMR specific params. +      "interleaving", G_TYPE_STRING, "0",       -]   Mapping of caps to and from SDP fields: diff --git a/gst/rtp/gstrtpamrdec.c b/gst/rtp/gstrtpamrdec.c index 7fc6c9de..f2136625 100644 --- a/gst/rtp/gstrtpamrdec.c +++ b/gst/rtp/gstrtpamrdec.c @@ -63,10 +63,10 @@ GST_STATIC_PAD_TEMPLATE ("sink",          "clock-rate = (int) 8000, "          "encoding-name = (string) \"AMR\", "          "encoding-params = (string) \"1\", " -        "octet-align = (boolean) TRUE, " -        "crc = (boolean) FALSE, " -        "robust-sorting = (boolean) FALSE, " "interleaving = (boolean) FALSE" -        /* following options are not needed for a decoder +        "octet-align = (string) 1, " +        "crc = (string) 0, " +        "robust-sorting = (string) 0, " "interleaving = (string) 0" +        /* following options are not needed for a decoder            *           "mode-set = (int) [ 0, 7 ], "           "mode-change-period = (int) [ 1, MAX ], " @@ -180,35 +180,41 @@ gst_rtpamrdec_sink_setcaps (GstPad * pad, GstCaps * caps)    GstCaps *srccaps;    GstRtpAMRDec *rtpamrdec;    const gchar *params; +  const gchar *str;    rtpamrdec = GST_RTP_AMR_DEC (GST_OBJECT_PARENT (pad));    structure = gst_caps_get_structure (caps, 0); -  if (!gst_structure_get_boolean (structure, "octet-align", -          &rtpamrdec->octet_align)) +  if (!(str = gst_structure_get_string (structure, "octet-align")))      rtpamrdec->octet_align = FALSE; +  else +    rtpamrdec->octet_align = (atoi (str) == 1); -  if (!gst_structure_get_boolean (structure, "crc", &rtpamrdec->crc)) +  if (!(str = gst_structure_get_string (structure, "crc")))      rtpamrdec->crc = FALSE; +  else +    rtpamrdec->crc = (atoi (str) == 1);    if (rtpamrdec->crc) {      /* crc mode implies octet aligned mode */      rtpamrdec->octet_align = TRUE;    } -  if (!gst_structure_get_boolean (structure, "robust-sorting", -          &rtpamrdec->robust_sorting)) +  if (!(str = gst_structure_get_string (structure, "robust-sorting")))      rtpamrdec->robust_sorting = FALSE; +  else +    rtpamrdec->robust_sorting = (atoi (str) == 1);    if (rtpamrdec->robust_sorting) {      /* robust_sorting mode implies octet aligned mode */      rtpamrdec->octet_align = TRUE;    } -  if (!gst_structure_get_boolean (structure, "interleaving", -          &rtpamrdec->interleaving)) +  if (!(str = gst_structure_get_string (structure, "interleaving")))      rtpamrdec->interleaving = FALSE; +  else +    rtpamrdec->interleaving = (atoi (str) == 1);    if (rtpamrdec->interleaving) {      /* interleaving mode implies octet aligned mode */ diff --git a/gst/rtp/gstrtpamrdepay.c b/gst/rtp/gstrtpamrdepay.c index 7fc6c9de..f2136625 100644 --- a/gst/rtp/gstrtpamrdepay.c +++ b/gst/rtp/gstrtpamrdepay.c @@ -63,10 +63,10 @@ GST_STATIC_PAD_TEMPLATE ("sink",          "clock-rate = (int) 8000, "          "encoding-name = (string) \"AMR\", "          "encoding-params = (string) \"1\", " -        "octet-align = (boolean) TRUE, " -        "crc = (boolean) FALSE, " -        "robust-sorting = (boolean) FALSE, " "interleaving = (boolean) FALSE" -        /* following options are not needed for a decoder +        "octet-align = (string) 1, " +        "crc = (string) 0, " +        "robust-sorting = (string) 0, " "interleaving = (string) 0" +        /* following options are not needed for a decoder            *           "mode-set = (int) [ 0, 7 ], "           "mode-change-period = (int) [ 1, MAX ], " @@ -180,35 +180,41 @@ gst_rtpamrdec_sink_setcaps (GstPad * pad, GstCaps * caps)    GstCaps *srccaps;    GstRtpAMRDec *rtpamrdec;    const gchar *params; +  const gchar *str;    rtpamrdec = GST_RTP_AMR_DEC (GST_OBJECT_PARENT (pad));    structure = gst_caps_get_structure (caps, 0); -  if (!gst_structure_get_boolean (structure, "octet-align", -          &rtpamrdec->octet_align)) +  if (!(str = gst_structure_get_string (structure, "octet-align")))      rtpamrdec->octet_align = FALSE; +  else +    rtpamrdec->octet_align = (atoi (str) == 1); -  if (!gst_structure_get_boolean (structure, "crc", &rtpamrdec->crc)) +  if (!(str = gst_structure_get_string (structure, "crc")))      rtpamrdec->crc = FALSE; +  else +    rtpamrdec->crc = (atoi (str) == 1);    if (rtpamrdec->crc) {      /* crc mode implies octet aligned mode */      rtpamrdec->octet_align = TRUE;    } -  if (!gst_structure_get_boolean (structure, "robust-sorting", -          &rtpamrdec->robust_sorting)) +  if (!(str = gst_structure_get_string (structure, "robust-sorting")))      rtpamrdec->robust_sorting = FALSE; +  else +    rtpamrdec->robust_sorting = (atoi (str) == 1);    if (rtpamrdec->robust_sorting) {      /* robust_sorting mode implies octet aligned mode */      rtpamrdec->octet_align = TRUE;    } -  if (!gst_structure_get_boolean (structure, "interleaving", -          &rtpamrdec->interleaving)) +  if (!(str = gst_structure_get_string (structure, "interleaving")))      rtpamrdec->interleaving = FALSE; +  else +    rtpamrdec->interleaving = (atoi (str) == 1);    if (rtpamrdec->interleaving) {      /* interleaving mode implies octet aligned mode */ diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index 106e568a..f0c5d06a 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -287,6 +287,7 @@ gst_rtspsrc_set_state (GstRTSPSrc * src, GstState state)                    state)) == GST_STATE_CHANGE_FAILURE)          goto done;      } +      if (stream->rtcpsrc) {        if ((ret =                gst_element_set_state (stream->rtcpsrc, @@ -299,6 +300,36 @@ done:    return ret;  } +#define PARSE_INT(p, del, res) 		\ +G_STMT_START {				\ +  gchar *t = p;				\ +  p = strstr (p, del);			\ +  if (p == NULL)			\ +    res = -1;				\ +  else {				\ +    *p = '\0';				\ +    p++;				\ +    res = atoi (t);			\ +  }					\ +} G_STMT_END + +#define PARSE_STRING(p, del, res) 	\ +G_STMT_START {				\ +  gchar *t = p;				\ +  p = strstr (p, del);			\ +  if (p == NULL)			\ +    res = NULL;				\ +  else {				\ +    *p = '\0';				\ +    p++;				\ +    res = t;				\ +  }					\ +} G_STMT_END + +#define SKIP_SPACES(p) 			\ +  while (*p && g_ascii_isspace (*p))	\ +    p++; +  static gboolean  gst_rtspsrc_parse_rtpmap (gchar * rtpmap, gint * payload, gchar ** name,      gint * rate, gchar ** params) @@ -307,27 +338,17 @@ gst_rtspsrc_parse_rtpmap (gchar * rtpmap, gint * payload, gchar ** name,    t = p = rtpmap; -  p = strstr (p, " "); -  if (p == NULL) +  PARSE_INT (p, " ", *payload); +  if (*payload == -1)      return FALSE; -  *p = '\0'; -  p++; - -  *payload = atoi (t); - -  while (*p && g_ascii_isspace (*p)) -    p++; +  SKIP_SPACES (p);    if (*p == '\0')      return FALSE; -  t = p; -  p = strstr (p, "/"); -  if (p == NULL) +  PARSE_STRING (p, "/", *name); +  if (*name == NULL)      return FALSE; -  *p = '\0'; -  p++; -  *name = t;    t = p;    p = strstr (p, "/"); @@ -360,8 +381,7 @@ gst_rtspsrc_media_to_caps (SDPMedia * media)    GstCaps *caps;    gchar *payload;    gchar *rtpmap; - -  //gchar *fmtp; +  gchar *fmtp;    gint pt;    gchar *name = NULL;    gint rate = -1; @@ -379,21 +399,23 @@ gst_rtspsrc_media_to_caps (SDPMedia * media)      gint payload = 0;      gboolean ret; -    rtpmap = sdp_media_get_attribute_val (media, "rtpmap"); -    if (rtpmap == NULL) { -      g_warning ("rtpmap type not given"); +    if ((rtpmap = sdp_media_get_attribute_val (media, "rtpmap"))) { +      if ((ret = +              gst_rtspsrc_parse_rtpmap (rtpmap, &payload, &name, &rate, +                  ¶ms))) { +        if (payload != pt) { +          g_warning ("rtpmap of wrong payload type"); +          name = NULL; +          rate = -1; +          params = NULL; +        } +      } else { +        g_warning ("error parsing rtpmap"); +      } +    } else { +      g_warning ("rtpmap type not given fot dynamic payload %d", pt);        return NULL;      } -    ret = gst_rtspsrc_parse_rtpmap (rtpmap, &payload, &name, &rate, ¶ms); -    if (!ret) { -      g_warning ("error parsing rtpmap"); -    } -    if (payload != pt) { -      g_warning ("rtpmap of wrong payload type"); -      name = NULL; -      rate = -1; -      params = NULL; -    }    }    caps = gst_caps_new_simple ("application/x-rtp", @@ -409,6 +431,32 @@ gst_rtspsrc_media_to_caps (SDPMedia * media)    if (params != NULL)      gst_structure_set (s, "encoding-params", G_TYPE_STRING, params, NULL); +  /* parse optional fmtp: field */ +  if ((fmtp = sdp_media_get_attribute_val (media, "fmtp"))) { +    gchar *p; +    gint payload = 0; + +    p = fmtp; + +    PARSE_INT (p, " ", payload); +    if (payload != -1 && payload == pt) { +      gchar **pairs; +      gint i; + +      pairs = g_strsplit (p, ";", 0); +      for (i = 0; pairs[i]; i++) { +        gchar **keyval; + +        keyval = g_strsplit (pairs[i], "=", 0); +        if (keyval[0] && keyval[1]) { +          gst_structure_set (s, keyval[0], G_TYPE_STRING, keyval[1], NULL); +        } +        g_strfreev (keyval); +      } +      g_strfreev (pairs); +    } +  } +    return caps;  } @@ -451,6 +499,9 @@ gst_rtspsrc_stream_setup_rtp (GstRTSPStream * stream, SDPMedia * media,    g_object_get (G_OBJECT (stream->rtpsrc), "port", rtpport, NULL);    g_object_get (G_OBJECT (stream->rtcpsrc), "port", rtcpport, NULL); +  gst_element_set_state (stream->rtpsrc, GST_STATE_READY); +  gst_element_set_state (stream->rtcpsrc, GST_STATE_READY); +    return TRUE;    /* ERRORS, FIXME, cleanup */ diff --git a/gst/udp/gstudpsrc.c b/gst/udp/gstudpsrc.c index 3c95ee60..d992151f 100644 --- a/gst/udp/gstudpsrc.c +++ b/gst/udp/gstudpsrc.c @@ -407,7 +407,8 @@ gst_udpsrc_set_property (GObject * object, guint prop_id, const GValue * value,        old_caps = udpsrc->caps;        udpsrc->caps = new_caps; -      gst_caps_unref (old_caps); +      if (old_caps) +        gst_caps_unref (old_caps);        gst_pad_set_caps (GST_BASE_SRC (udpsrc)->srcpad, new_caps);        break;      }  | 
