From: Mersad Jelacic Date: Mon, 3 Mar 2008 16:11:50 +0000 (+0000) Subject: gst-libs/gst/rtp/gstbasertpaudiopayload.*: API: add gst_base_rtp_audio_payload_set_sa... X-Git-Tag: 1.19.3~511^2~10625 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ed814cbaed2f4e677d9524ab5a55b15adbee9d00;p=platform%2Fupstream%2Fgstreamer.git gst-libs/gst/rtp/gstbasertpaudiopayload.*: API: add gst_base_rtp_audio_payload_set_samplebits_options() to make it po... Original commit message from CVS: Patch by: Mersad Jelacic * gst-libs/gst/rtp/gstbasertpaudiopayload.c: * gst-libs/gst/rtp/gstbasertpaudiopayload.h: API: add gst_base_rtp_audio_payload_set_samplebits_options() to make it possible to specify the sample size in bits. (#509637) --- diff --git a/ChangeLog b/ChangeLog index 9aff920..73503b0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-03-03 Peter Kjellerstedt + + Patch by: Mersad Jelacic + + * gst-libs/gst/rtp/gstbasertpaudiopayload.c: + * gst-libs/gst/rtp/gstbasertpaudiopayload.h: + API: add gst_base_rtp_audio_payload_set_samplebits_options() to make it + possible to specify the sample size in bits. (#509637) + 2008-03-03 Tim-Philipp Müller * tests/check/libs/mixer.c: diff --git a/gst-libs/gst/rtp/gstbasertpaudiopayload.c b/gst-libs/gst/rtp/gstbasertpaudiopayload.c index 3438fca..828f147 100644 --- a/gst-libs/gst/rtp/gstbasertpaudiopayload.c +++ b/gst-libs/gst/rtp/gstbasertpaudiopayload.c @@ -45,12 +45,13 @@ * gst_base_rtp_audio_payload_set_frame_based() or * gst_base_rtp_audio_payload_set_sample_based(). This is usually done in the * element's _init() function. Then, the child element must call either - * gst_base_rtp_audio_payload_set_frame_options() or - * gst_base_rtp_audio_payload_set_sample_options(). Since GstBaseRTPAudioPayload - * derives from GstBaseRTPPayload, the child element must set any variables or - * call/override any functions required by that base class. The child element - * does not need to override any other functions specific to - * GstBaseRTPAudioPayload. + * gst_base_rtp_audio_payload_set_frame_options(), + * gst_base_rtp_audio_payload_set_sample_options() or + * gst_base_rtp_audio_payload_set_samplebits_options. Since + * GstBaseRTPAudioPayload derives from GstBaseRTPPayload, the child element + * must set any variables or call/override any functions required by that base + * class. The child element does not need to override any other functions + * specific to GstBaseRTPAudioPayload. * * */ @@ -251,6 +252,29 @@ gst_base_rtp_audio_payload_set_sample_options (GstBaseRTPAudioPayload { g_return_if_fail (basertpaudiopayload != NULL); + /* sample_size is in bits internally */ + basertpaudiopayload->sample_size = sample_size * 8; + + if (basertpaudiopayload->priv->adapter) { + gst_adapter_clear (basertpaudiopayload->priv->adapter); + } +} + +/** + * gst_base_rtp_audio_payload_set_samplebits_options: + * @basertpaudiopayload: a pointer to the element. + * @sample_size: Size per sample in bits. + * + * Sets the options for sample based audio codecs. + * + * Since: 0.10.18 + */ +void +gst_base_rtp_audio_payload_set_samplebits_options (GstBaseRTPAudioPayload + * basertpaudiopayload, gint sample_size) +{ + g_return_if_fail (basertpaudiopayload != NULL); + basertpaudiopayload->sample_size = sample_size; if (basertpaudiopayload->priv->adapter) { @@ -435,7 +459,7 @@ gst_base_rtp_audio_payload_handle_sample_based_buffer (GstBaseRTPPayload * guint max_payload_len; gboolean use_adapter = FALSE; - guint sample_size; + guint fragment_size; ret = GST_FLOW_OK; @@ -446,12 +470,17 @@ gst_base_rtp_audio_payload_handle_sample_based_buffer (GstBaseRTPPayload * gst_buffer_unref (buffer); return GST_FLOW_ERROR; } - sample_size = basertpaudiopayload->sample_size; + + /* sample_size is in bits and is converted into multiple bytes */ + fragment_size = basertpaudiopayload->sample_size; + while ((fragment_size % 8) != 0) + fragment_size += fragment_size; + fragment_size /= 8; /* max number of bytes based on given ptime */ if (basepayload->max_ptime != -1) { - maxptime_octets = basepayload->max_ptime * basepayload->clock_rate / - (sample_size * GST_SECOND); + maxptime_octets = 8 * basepayload->max_ptime * basepayload->clock_rate / + (basertpaudiopayload->sample_size * GST_SECOND); } max_payload_len = MIN ( @@ -463,10 +492,10 @@ gst_base_rtp_audio_payload_handle_sample_based_buffer (GstBaseRTPPayload * /* min number of bytes based on a given ptime, has to be a multiple of sample rate */ - minptime_octets = basepayload->min_ptime * basepayload->clock_rate / - (sample_size * GST_SECOND); + minptime_octets = 8 * basepayload->min_ptime * basepayload->clock_rate / + (basertpaudiopayload->sample_size * GST_SECOND); - min_payload_len = MAX (minptime_octets, sample_size); + min_payload_len = MAX (minptime_octets, fragment_size); if (min_payload_len > max_payload_len) { min_payload_len = max_payload_len; @@ -506,7 +535,7 @@ gst_base_rtp_audio_payload_handle_sample_based_buffer (GstBaseRTPPayload * gfloat num, datarate; payload_len = - MIN (max_payload_len, (available / sample_size) * sample_size); + MIN (max_payload_len, (available / fragment_size) * fragment_size); if (use_adapter) { data = gst_adapter_peek (basertpaudiopayload->priv->adapter, payload_len); @@ -516,11 +545,11 @@ gst_base_rtp_audio_payload_handle_sample_based_buffer (GstBaseRTPPayload * gst_base_rtp_audio_payload_push (basertpaudiopayload, data, payload_len, basertpaudiopayload->base_ts); - num = payload_len; - datarate = (sample_size * basepayload->clock_rate); + num = payload_len * 8; + datarate = (basertpaudiopayload->sample_size * basepayload->clock_rate); basertpaudiopayload->base_ts += - /* payload_len (bytes) * nsecs/sec / datarate (bytes*sec) */ + /* payload_len (bits) * nsecs/sec / datarate (bits*sec) */ gst_gdouble_to_guint64 (num / datarate * GST_SECOND); GST_DEBUG_OBJECT (basertpaudiopayload, "New ts is %" GST_TIME_FORMAT, GST_TIME_ARGS (basertpaudiopayload->base_ts)); diff --git a/gst-libs/gst/rtp/gstbasertpaudiopayload.h b/gst-libs/gst/rtp/gstbasertpaudiopayload.h index 22a084b..c1be9f0 100644 --- a/gst-libs/gst/rtp/gstbasertpaudiopayload.h +++ b/gst-libs/gst/rtp/gstbasertpaudiopayload.h @@ -84,6 +84,10 @@ void gst_base_rtp_audio_payload_set_sample_options (GstBaseRTPAudioPayload *basertpaudiopayload, gint sample_size); +void +gst_base_rtp_audio_payload_set_samplebits_options (GstBaseRTPAudioPayload + *basertpaudiopayload, gint sample_size); + GstFlowReturn gst_base_rtp_audio_payload_push (GstBaseRTPAudioPayload * baseaudiopayload, const guint8 * data, guint payload_len, GstClockTime timestamp);