gst-libs/gst/rtp/gstbasertppayload.*: Fix ranges of rtp payloader properties so that the full range can be used in ad...

Original commit message from CVS:
* gst-libs/gst/rtp/gstbasertppayload.c:
(gst_basertppayload_class_init), (gst_basertppayload_init),
(gst_basertppayload_event), (gst_basertppayload_push),
(gst_basertppayload_set_property),
(gst_basertppayload_get_property),
(gst_basertppayload_change_state):
* gst-libs/gst/rtp/gstbasertppayload.h:
Fix ranges of rtp payloader properties so that the full range can be
used in addition to -1 (random).
Fix wrong seqnum reporting in caps.
Fixes #420326.
This commit is contained in:
Wim Taymans 2007-07-14 17:23:42 +00:00
parent e59c110631
commit c82275a51d
3 changed files with 89 additions and 25 deletions

View file

@ -1,3 +1,17 @@
2007-07-14 Wim Taymans <wim.taymans@gmail.com>
* gst-libs/gst/rtp/gstbasertppayload.c:
(gst_basertppayload_class_init), (gst_basertppayload_init),
(gst_basertppayload_event), (gst_basertppayload_push),
(gst_basertppayload_set_property),
(gst_basertppayload_get_property),
(gst_basertppayload_change_state):
* gst-libs/gst/rtp/gstbasertppayload.h:
Fix ranges of rtp payloader properties so that the full range can be
used in addition to -1 (random).
Fix wrong seqnum reporting in caps.
Fixes #420326.
2007-07-13 Wim Taymans <wim.taymans@gmail.com> 2007-07-13 Wim Taymans <wim.taymans@gmail.com>
* gst/videorate/gstvideorate.c: (gst_video_rate_init), * gst/videorate/gstvideorate.c: (gst_video_rate_init),

View file

@ -36,6 +36,17 @@
GST_DEBUG_CATEGORY_STATIC (basertppayload_debug); GST_DEBUG_CATEGORY_STATIC (basertppayload_debug);
#define GST_CAT_DEFAULT (basertppayload_debug) #define GST_CAT_DEFAULT (basertppayload_debug)
#define GST_BASE_RTP_PAYLOAD_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_RTP_PAYLOAD, GstBaseRTPPayloadPrivate))
struct _GstBaseRTPPayloadPrivate
{
gboolean ts_offset_random;
gboolean seqnum_offset_random;
gboolean ssrc_random;
guint16 next_seqnum;
};
/* BaseRTPPayload signals and args */ /* BaseRTPPayload signals and args */
enum enum
{ {
@ -133,6 +144,8 @@ gst_basertppayload_class_init (GstBaseRTPPayloadClass * klass)
gobject_class = (GObjectClass *) klass; gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass; gstelement_class = (GstElementClass *) klass;
g_type_class_add_private (klass, sizeof (GstBaseRTPPayloadPrivate));
parent_class = g_type_class_peek_parent (klass); parent_class = g_type_class_peek_parent (klass);
gobject_class->finalize = gst_basertppayload_finalize; gobject_class->finalize = gst_basertppayload_finalize;
@ -149,17 +162,17 @@ gst_basertppayload_class_init (GstBaseRTPPayloadClass * klass)
"The payload type of the packets", "The payload type of the packets",
0, 0x80, DEFAULT_PT, G_PARAM_READWRITE)); 0, 0x80, DEFAULT_PT, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SSRC, g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SSRC,
g_param_spec_uint ("ssrc", "SSRC", g_param_spec_int64 ("ssrc", "SSRC",
"The SSRC of the packets (-1 == random)", "The SSRC of the packets (-1 == random)",
0, G_MAXUINT, DEFAULT_SSRC, G_PARAM_READWRITE)); -1, G_MAXUINT32, DEFAULT_SSRC, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), g_object_class_install_property (G_OBJECT_CLASS (klass),
PROP_TIMESTAMP_OFFSET, g_param_spec_int ("timestamp-offset", PROP_TIMESTAMP_OFFSET, g_param_spec_int64 ("timestamp-offset",
"Timestamp Offset", "Timestamp Offset",
"Offset to add to all outgoing timestamps (-1 = random)", -1, "Offset to add to all outgoing timestamps (-1 = random)", -1,
G_MAXINT, DEFAULT_TIMESTAMP_OFFSET, G_PARAM_READWRITE)); G_MAXUINT32, DEFAULT_TIMESTAMP_OFFSET, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SEQNUM_OFFSET, g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SEQNUM_OFFSET,
g_param_spec_int ("seqnum-offset", "Sequence number Offset", g_param_spec_int ("seqnum-offset", "Sequence number Offset",
"Offset to add to all outgoing seqnum (-1 = random)", -1, G_MAXINT, "Offset to add to all outgoing seqnum (-1 = random)", -1, G_MAXUINT16,
DEFAULT_SEQNUM_OFFSET, G_PARAM_READWRITE)); DEFAULT_SEQNUM_OFFSET, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MAX_PTIME, g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_MAX_PTIME,
g_param_spec_int64 ("max-ptime", "Max packet time", g_param_spec_int64 ("max-ptime", "Max packet time",
@ -180,11 +193,11 @@ gst_basertppayload_class_init (GstBaseRTPPayloadClass * klass)
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TIMESTAMP, g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TIMESTAMP,
g_param_spec_uint ("timestamp", "Timestamp", g_param_spec_uint ("timestamp", "Timestamp",
"The RTP timestamp of the last processed packet", "The RTP timestamp of the last processed packet",
0, G_MAXUINT, 0, G_PARAM_READABLE)); 0, G_MAXUINT32, 0, G_PARAM_READABLE));
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SEQNUM, g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SEQNUM,
g_param_spec_uint ("seqnum", "Sequence number", g_param_spec_uint ("seqnum", "Sequence number",
"The RTP sequence number of the last processed packet", "The RTP sequence number of the last processed packet",
0, G_MAXUINT, 0, G_PARAM_READABLE)); 0, G_MAXUINT16, 0, G_PARAM_READABLE));
gstelement_class->change_state = gst_basertppayload_change_state; gstelement_class->change_state = gst_basertppayload_change_state;
@ -196,6 +209,10 @@ static void
gst_basertppayload_init (GstBaseRTPPayload * basertppayload, gpointer g_class) gst_basertppayload_init (GstBaseRTPPayload * basertppayload, gpointer g_class)
{ {
GstPadTemplate *templ; GstPadTemplate *templ;
GstBaseRTPPayloadPrivate *priv;
basertppayload->priv = priv =
GST_BASE_RTP_PAYLOAD_GET_PRIVATE (basertppayload);
templ = templ =
gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src"); gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
@ -226,6 +243,10 @@ gst_basertppayload_init (GstBaseRTPPayload * basertppayload, gpointer g_class)
basertppayload->seqnum_offset = DEFAULT_SEQNUM_OFFSET; basertppayload->seqnum_offset = DEFAULT_SEQNUM_OFFSET;
basertppayload->ssrc = DEFAULT_SSRC; basertppayload->ssrc = DEFAULT_SSRC;
basertppayload->ts_offset = DEFAULT_TIMESTAMP_OFFSET; basertppayload->ts_offset = DEFAULT_TIMESTAMP_OFFSET;
priv->seqnum_offset_random = (basertppayload->seqnum_offset == -1);
priv->ts_offset_random = (basertppayload->ts_offset == -1);
priv->ssrc_random = (basertppayload->ssrc == -1);
basertppayload->max_ptime = DEFAULT_MAX_PTIME; basertppayload->max_ptime = DEFAULT_MAX_PTIME;
basertppayload->min_ptime = DEFAULT_MIN_PTIME; basertppayload->min_ptime = DEFAULT_MIN_PTIME;
@ -288,11 +309,8 @@ gst_basertppayload_event (GstPad * pad, GstEvent * event)
if (basertppayload_class->handle_event) { if (basertppayload_class->handle_event) {
res = basertppayload_class->handle_event (pad, event); res = basertppayload_class->handle_event (pad, event);
if (res) { if (res)
gst_object_unref (basertppayload); goto done;
return res;
}
} }
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
@ -321,6 +339,7 @@ gst_basertppayload_event (GstPad * pad, GstEvent * event)
break; break;
} }
done:
gst_object_unref (basertppayload); gst_object_unref (basertppayload);
return res; return res;
@ -421,21 +440,26 @@ gst_basertppayload_push (GstBaseRTPPayload * payload, GstBuffer * buffer)
GstFlowReturn res; GstFlowReturn res;
GstClockTime timestamp; GstClockTime timestamp;
guint32 ts; guint32 ts;
GstBaseRTPPayloadPrivate *priv;
if (payload->clock_rate == 0) if (payload->clock_rate == 0)
goto no_rate; goto no_rate;
priv = payload->priv;
gst_rtp_buffer_set_ssrc (buffer, payload->current_ssrc); gst_rtp_buffer_set_ssrc (buffer, payload->current_ssrc);
gst_rtp_buffer_set_payload_type (buffer, payload->pt); gst_rtp_buffer_set_payload_type (buffer, payload->pt);
/* can wrap around, which is perfectly fine */
/* update first, so that the property is set to the last /* update first, so that the property is set to the last
* seqnum pushed */ * seqnum pushed */
payload->seqnum++; payload->seqnum = priv->next_seqnum;
GST_LOG_OBJECT (payload, "setting RTP seqnum %d", payload->seqnum); GST_LOG_OBJECT (payload, "setting RTP seqnum %d", payload->seqnum);
gst_rtp_buffer_set_seq (buffer, payload->seqnum); gst_rtp_buffer_set_seq (buffer, payload->seqnum);
/* can wrap around, which is perfectly fine */
priv->next_seqnum++;
/* add our random offset to the timestamp */ /* add our random offset to the timestamp */
ts = payload->ts_base; ts = payload->ts_base;
@ -480,8 +504,11 @@ gst_basertppayload_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec) const GValue * value, GParamSpec * pspec)
{ {
GstBaseRTPPayload *basertppayload; GstBaseRTPPayload *basertppayload;
GstBaseRTPPayloadPrivate *priv;
gint64 val;
basertppayload = GST_BASE_RTP_PAYLOAD (object); basertppayload = GST_BASE_RTP_PAYLOAD (object);
priv = basertppayload->priv;
switch (prop_id) { switch (prop_id) {
case PROP_MTU: case PROP_MTU:
@ -491,13 +518,21 @@ gst_basertppayload_set_property (GObject * object, guint prop_id,
basertppayload->pt = g_value_get_uint (value); basertppayload->pt = g_value_get_uint (value);
break; break;
case PROP_SSRC: case PROP_SSRC:
basertppayload->ssrc = g_value_get_uint (value); val = g_value_get_int64 (value);
basertppayload->ssrc = val;
priv->ssrc_random = (val == -1);
break; break;
case PROP_TIMESTAMP_OFFSET: case PROP_TIMESTAMP_OFFSET:
basertppayload->ts_offset = g_value_get_int (value); val = g_value_get_int64 (value);
basertppayload->ts_offset = val;
priv->ts_offset_random = (val == -1);
break; break;
case PROP_SEQNUM_OFFSET: case PROP_SEQNUM_OFFSET:
basertppayload->seqnum_offset = g_value_get_int (value); val = g_value_get_int (value);
basertppayload->seqnum_offset = val;
priv->seqnum_offset_random = (val == -1);
GST_DEBUG_OBJECT (basertppayload, "seqnum offset 0x%04x, random %d",
basertppayload->seqnum_offset, priv->seqnum_offset_random);
break; break;
case PROP_MAX_PTIME: case PROP_MAX_PTIME:
basertppayload->max_ptime = g_value_get_int64 (value); basertppayload->max_ptime = g_value_get_int64 (value);
@ -516,8 +551,10 @@ gst_basertppayload_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec) GValue * value, GParamSpec * pspec)
{ {
GstBaseRTPPayload *basertppayload; GstBaseRTPPayload *basertppayload;
GstBaseRTPPayloadPrivate *priv;
basertppayload = GST_BASE_RTP_PAYLOAD (object); basertppayload = GST_BASE_RTP_PAYLOAD (object);
priv = basertppayload->priv;
switch (prop_id) { switch (prop_id) {
case PROP_MTU: case PROP_MTU:
@ -527,13 +564,22 @@ gst_basertppayload_get_property (GObject * object, guint prop_id,
g_value_set_uint (value, basertppayload->pt); g_value_set_uint (value, basertppayload->pt);
break; break;
case PROP_SSRC: case PROP_SSRC:
g_value_set_uint (value, basertppayload->ssrc); if (priv->ssrc_random)
g_value_set_int64 (value, -1);
else
g_value_set_int64 (value, basertppayload->ssrc);
break; break;
case PROP_TIMESTAMP_OFFSET: case PROP_TIMESTAMP_OFFSET:
g_value_set_int (value, basertppayload->ts_offset); if (priv->ts_offset_random)
g_value_set_int64 (value, -1);
else
g_value_set_int64 (value, (guint32) basertppayload->ts_offset);
break; break;
case PROP_SEQNUM_OFFSET: case PROP_SEQNUM_OFFSET:
g_value_set_int (value, basertppayload->seqnum_offset); if (priv->seqnum_offset_random)
g_value_set_int (value, -1);
else
g_value_set_int (value, (guint16) basertppayload->seqnum_offset);
break; break;
case PROP_MAX_PTIME: case PROP_MAX_PTIME:
g_value_set_int64 (value, basertppayload->max_ptime); g_value_set_int64 (value, basertppayload->max_ptime);
@ -558,9 +604,11 @@ gst_basertppayload_change_state (GstElement * element,
GstStateChange transition) GstStateChange transition)
{ {
GstBaseRTPPayload *basertppayload; GstBaseRTPPayload *basertppayload;
GstBaseRTPPayloadPrivate *priv;
GstStateChangeReturn ret; GstStateChangeReturn ret;
basertppayload = GST_BASE_RTP_PAYLOAD (element); basertppayload = GST_BASE_RTP_PAYLOAD (element);
priv = basertppayload->priv;
switch (transition) { switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_NULL_TO_READY:
@ -568,19 +616,19 @@ gst_basertppayload_change_state (GstElement * element,
case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_READY_TO_PAUSED:
gst_segment_init (&basertppayload->segment, GST_FORMAT_UNDEFINED); gst_segment_init (&basertppayload->segment, GST_FORMAT_UNDEFINED);
if (basertppayload->seqnum_offset == -1) if (priv->seqnum_offset_random)
basertppayload->seqnum_base = basertppayload->seqnum_base =
g_rand_int_range (basertppayload->seq_rand, 0, G_MAXUINT16); g_rand_int_range (basertppayload->seq_rand, 0, G_MAXUINT16);
else else
basertppayload->seqnum_base = basertppayload->seqnum_offset; basertppayload->seqnum_base = basertppayload->seqnum_offset;
basertppayload->seqnum = basertppayload->seqnum_base; priv->next_seqnum = basertppayload->seqnum_base;
if (basertppayload->ssrc == -1) if (priv->ssrc_random)
basertppayload->current_ssrc = g_rand_int (basertppayload->ssrc_rand); basertppayload->current_ssrc = g_rand_int (basertppayload->ssrc_rand);
else else
basertppayload->current_ssrc = basertppayload->ssrc; basertppayload->current_ssrc = basertppayload->ssrc;
if (basertppayload->ts_offset == -1) if (priv->ts_offset_random)
basertppayload->ts_base = g_rand_int (basertppayload->ts_rand); basertppayload->ts_base = g_rand_int (basertppayload->ts_rand);
else else
basertppayload->ts_base = basertppayload->ts_offset; basertppayload->ts_base = basertppayload->ts_offset;

View file

@ -38,6 +38,7 @@ G_BEGIN_DECLS
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_RTP_PAYLOAD)) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASE_RTP_PAYLOAD))
typedef struct _GstBaseRTPPayload GstBaseRTPPayload; typedef struct _GstBaseRTPPayload GstBaseRTPPayload;
typedef struct _GstBaseRTPPayloadPrivate GstBaseRTPPayloadPrivate;
typedef struct _GstBaseRTPPayloadClass GstBaseRTPPayloadClass; typedef struct _GstBaseRTPPayloadClass GstBaseRTPPayloadClass;
#define GST_BASE_RTP_PAYLOAD_SINKPAD(payload) (GST_BASE_RTP_PAYLOAD (payload)->sinkpad) #define GST_BASE_RTP_PAYLOAD_SINKPAD(payload) (GST_BASE_RTP_PAYLOAD (payload)->sinkpad)
@ -81,8 +82,9 @@ struct _GstBaseRTPPayload
guint64 min_ptime; guint64 min_ptime;
/*< private >*/ /*< private >*/
GstBaseRTPPayloadPrivate *priv;
gpointer _gst_reserved[GST_PADDING - (sizeof(guint64)/sizeof(gpointer))]; gpointer _gst_reserved[GST_PADDING - (sizeof(guint64)/sizeof(gpointer)) - 1];
}; };
struct _GstBaseRTPPayloadClass struct _GstBaseRTPPayloadClass