diff options
| author | Flavio Oliveira <flavio.oliveira@indt.org.br> | 2005-10-27 18:46:32 +0000 | 
|---|---|---|
| committer | Flavio Oliveira <flavio.oliveira@indt.org.br> | 2005-10-27 18:46:32 +0000 | 
| commit | 3a08bb8732ecf81d03ccbd487dddf9b00d2aee22 (patch) | |
| tree | 6ff1e0f4d73ddeaee167cf362fec16f545d334f0 | |
| parent | e7a14b7a008a04b9266a2755085fed683ee08dc8 (diff) | |
Fix to set timestamp on buffer, it was tested with RTP G711 elements.
Original commit message from CVS:
Fix to set timestamp on buffer, it was tested with RTP G711 elements.
| -rw-r--r-- | ChangeLog | 11 | ||||
| -rw-r--r-- | gst/law/alaw-encode.c | 37 | ||||
| -rw-r--r-- | gst/law/alaw-encode.h | 4 | ||||
| -rw-r--r-- | gst/law/mulaw-encode.c | 38 | ||||
| -rw-r--r-- | gst/law/mulaw-encode.h | 4 | 
5 files changed, 74 insertions, 20 deletions
@@ -1,3 +1,14 @@ +2005-10-27  Edgard Lima  Edgard Lima  <edgard.lima@indt.org.br> + +	* gst/law/alaw-encode.c: (gst_alawenc_init), +        (alawenc_setcaps), (gst_alawenc_chain) +	* gst/law/alaw-encode.h: +	* gst/law/mulaw-encode.c: (gst_mulawenc_init), +        (mulawenc_setcaps), (gst_mulawenc_chain) +	* gst/law/mulaw-encode.h: +	Set timestamp on buffer and it allows RTP G711 elements +	work properly. +  2005-10-27  Wim Taymans  <wim@fluendo.com>  	* sys/oss/gstosssrc.c: (gst_oss_src_prepare): diff --git a/gst/law/alaw-encode.c b/gst/law/alaw-encode.c index d0bff55e..7a16784f 100644 --- a/gst/law/alaw-encode.c +++ b/gst/law/alaw-encode.c @@ -171,16 +171,13 @@ alawenc_setcaps (GstPad * pad, GstCaps * caps)    GstALawEnc *alawenc;    GstPad *otherpad;    GstStructure *structure; -  const GValue *rate, *chans;    GstCaps *base_caps;    alawenc = GST_ALAWENC (GST_PAD_PARENT (pad));    structure = gst_caps_get_structure (caps, 0); -  rate = gst_structure_get_value (structure, "rate"); -  chans = gst_structure_get_value (structure, "channels"); -  if (!rate || !chans) -    return FALSE; +  gst_structure_get_int (structure, "channels", &alawenc->channels); +  gst_structure_get_int (structure, "rate", &alawenc->rate);    if (pad == alawenc->sinkpad) {      otherpad = alawenc->srcpad; @@ -190,8 +187,9 @@ alawenc_setcaps (GstPad * pad, GstCaps * caps)    base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad));    structure = gst_caps_get_structure (base_caps, 0); -  gst_structure_set_value (structure, "rate", rate); -  gst_structure_set_value (structure, "channels", chans); +  gst_structure_set (structure, "rate", G_TYPE_INT, alawenc->rate, NULL); +  gst_structure_set (structure, "channels", G_TYPE_INT, alawenc->channels, +      NULL);    gst_pad_set_caps (otherpad, base_caps); @@ -260,6 +258,11 @@ gst_alawenc_init (GstALawEnc * alawenc)    gst_pad_set_setcaps_function (alawenc->srcpad, alawenc_setcaps);    gst_pad_set_getcaps_function (alawenc->srcpad, alawenc_getcaps);    gst_element_add_pad (GST_ELEMENT (alawenc), alawenc->srcpad); + +  /* init rest */ +  alawenc->channels = 0; +  alawenc->rate = 0; +  alawenc->ts = 0;  }  static GstFlowReturn @@ -269,14 +272,23 @@ gst_alawenc_chain (GstPad * pad, GstBuffer * buffer)    gint16 *linear_data;    guint8 *alaw_data;    GstBuffer *outbuf; +  gint bufsize;    gint i;    alawenc = GST_ALAWENC (GST_OBJECT_PARENT (pad)); +  if (!alawenc->rate || !alawenc->channels) +    goto not_negotiated; +    linear_data = (gint16 *) GST_BUFFER_DATA (buffer); -  outbuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (buffer) / 2); -  GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); -  GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buffer); +  bufsize = GST_BUFFER_SIZE (buffer) / 2; +  outbuf = gst_buffer_new_and_alloc (bufsize); + +  GST_BUFFER_DURATION (outbuf) = GST_SECOND * (bufsize) / +      (alawenc->rate * alawenc->channels); +  GST_BUFFER_TIMESTAMP (outbuf) = alawenc->ts; +  alawenc->ts += GST_BUFFER_DURATION (outbuf); +    gst_buffer_set_caps (outbuf, GST_PAD_CAPS (alawenc->srcpad));    alaw_data = (guint8 *) GST_BUFFER_DATA (outbuf); @@ -289,4 +301,9 @@ gst_alawenc_chain (GstPad * pad, GstBuffer * buffer)    gst_buffer_unref (buffer);    return gst_pad_push (alawenc->srcpad, outbuf); + +not_negotiated: +  { +    return GST_FLOW_NOT_NEGOTIATED; +  }  } diff --git a/gst/law/alaw-encode.h b/gst/law/alaw-encode.h index e0801036..d7ed5be5 100644 --- a/gst/law/alaw-encode.h +++ b/gst/law/alaw-encode.h @@ -49,6 +49,10 @@ struct _GstALawEnc {    GstElement element;    GstPad *sinkpad,*srcpad; +  guint64 ts; + +  gint channels; +  gint rate;    /*MetaAudioRaw meta; */ diff --git a/gst/law/mulaw-encode.c b/gst/law/mulaw-encode.c index e17b5193..defb7dde 100644 --- a/gst/law/mulaw-encode.c +++ b/gst/law/mulaw-encode.c @@ -104,16 +104,13 @@ mulawenc_setcaps (GstPad * pad, GstCaps * caps)    GstMuLawEnc *mulawenc;    GstPad *otherpad;    GstStructure *structure; -  const GValue *rate, *chans;    GstCaps *base_caps;    mulawenc = GST_MULAWENC (gst_pad_get_parent (pad));    structure = gst_caps_get_structure (caps, 0); -  rate = gst_structure_get_value (structure, "rate"); -  chans = gst_structure_get_value (structure, "channels"); -  if (!rate || !chans) -    return FALSE; +  gst_structure_get_int (structure, "channels", &mulawenc->channels); +  gst_structure_get_int (structure, "rate", &mulawenc->rate);    if (pad == mulawenc->sinkpad) {      otherpad = mulawenc->srcpad; @@ -123,10 +120,12 @@ mulawenc_setcaps (GstPad * pad, GstCaps * caps)    base_caps = gst_caps_copy (gst_pad_get_pad_template_caps (otherpad));    structure = gst_caps_get_structure (base_caps, 0); -  gst_structure_set_value (structure, "rate", rate); -  gst_structure_set_value (structure, "channels", chans); +  gst_structure_set (structure, "rate", G_TYPE_INT, mulawenc->rate, NULL); +  gst_structure_set (structure, "channels", G_TYPE_INT, mulawenc->channels, +      NULL);    gst_pad_set_caps (otherpad, base_caps); +    gst_caps_unref (base_caps);    return TRUE; @@ -193,6 +192,11 @@ gst_mulawenc_init (GstMuLawEnc * mulawenc)    gst_pad_set_setcaps_function (mulawenc->srcpad, mulawenc_setcaps);    gst_pad_set_getcaps_function (mulawenc->srcpad, mulawenc_getcaps);    gst_element_add_pad (GST_ELEMENT (mulawenc), mulawenc->srcpad); + +  /* init rest */ +  mulawenc->channels = 0; +  mulawenc->rate = 0; +  mulawenc->ts = 0;  }  static GstFlowReturn @@ -202,13 +206,22 @@ gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer)    gint16 *linear_data;    guint8 *mulaw_data;    GstBuffer *outbuf; +  gint bufsize;    mulawenc = GST_MULAWENC (GST_OBJECT_PARENT (pad)); +  if (!mulawenc->rate || !mulawenc->channels) +    goto not_negotiated; +    linear_data = (gint16 *) GST_BUFFER_DATA (buffer); -  outbuf = gst_buffer_new_and_alloc (GST_BUFFER_SIZE (buffer) / 2); -  GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer); -  GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buffer); +  bufsize = GST_BUFFER_SIZE (buffer) / 2; +  outbuf = gst_buffer_new_and_alloc (bufsize); + +  GST_BUFFER_DURATION (outbuf) = GST_SECOND * (bufsize) / +      (mulawenc->rate * mulawenc->channels); +  GST_BUFFER_TIMESTAMP (outbuf) = mulawenc->ts; +  mulawenc->ts += GST_BUFFER_DURATION (outbuf); +    gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mulawenc->srcpad));    mulaw_data = (guint8 *) GST_BUFFER_DATA (outbuf); @@ -217,4 +230,9 @@ gst_mulawenc_chain (GstPad * pad, GstBuffer * buffer)    gst_buffer_unref (buffer);    return gst_pad_push (mulawenc->srcpad, outbuf); + +not_negotiated: +  { +    return GST_FLOW_NOT_NEGOTIATED; +  }  } diff --git a/gst/law/mulaw-encode.h b/gst/law/mulaw-encode.h index 6d99759b..3f431fd6 100644 --- a/gst/law/mulaw-encode.h +++ b/gst/law/mulaw-encode.h @@ -50,6 +50,10 @@ struct _GstMuLawEnc {    GstPad *sinkpad,*srcpad; +  guint64 ts; + +  gint channels; +  gint rate;    /*MetaAudioRaw meta; */  };  | 
