diff options
author | Olivier CrĂȘte <olivier.crete@collabora.co.uk> | 2010-03-26 19:00:47 -0400 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2010-04-09 16:17:31 +0200 |
commit | 66cc2faba736ae07bb8cf0e1804eea17c5ec6fe9 (patch) | |
tree | b6ddb8e6345e8157e2a7c7bd207f43aaad216ee6 | |
parent | 1fa171d3960dea447283d6eda05e2ed96e602049 (diff) |
audiopayload: use ptime-multiple
Based on patch by Olivier CrĂȘte <olivier.crete@collabora.co.uk>
Fixes #613248
-rw-r--r-- | gst-libs/gst/rtp/gstbasertpaudiopayload.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/gst-libs/gst/rtp/gstbasertpaudiopayload.c b/gst-libs/gst/rtp/gstbasertpaudiopayload.c index dddbf4980..5d431643e 100644 --- a/gst-libs/gst/rtp/gstbasertpaudiopayload.c +++ b/gst-libs/gst/rtp/gstbasertpaudiopayload.c @@ -110,6 +110,8 @@ struct _GstBaseRTPAudioPayloadPrivate guint cached_ptime; guint cached_min_length; guint cached_max_length; + guint cached_ptime_multiple; + guint cached_align; gboolean buffer_list; }; @@ -637,6 +639,7 @@ gst_base_rtp_audio_payload_get_lengths (GstBaseRTPPayload * guint max_mtu, mtu; guint maxptime_octets; guint minptime_octets; + guint ptime_mult_octets; payload = GST_BASE_RTP_AUDIO_PAYLOAD_CAST (basepayload); priv = payload->priv; @@ -644,21 +647,26 @@ gst_base_rtp_audio_payload_get_lengths (GstBaseRTPPayload * if (priv->align == 0) return FALSE; - *align = priv->align; - mtu = GST_BASE_RTP_PAYLOAD_MTU (payload); /* check cached values */ if (G_LIKELY (priv->cached_mtu == mtu + && priv->cached_ptime_multiple == + basepayload->abidata.ABI.ptime_multiple && priv->cached_ptime == basepayload->abidata.ABI.ptime && priv->cached_max_ptime == basepayload->max_ptime && priv->cached_min_ptime == basepayload->min_ptime)) { /* if nothing changed, return cached values */ *min_payload_len = priv->cached_min_length; *max_payload_len = priv->cached_max_length; + *align = priv->cached_align; return TRUE; } + ptime_mult_octets = priv->time_to_bytes (payload, + basepayload->abidata.ABI.ptime_multiple); + *align = ALIGN_DOWN (MAX (priv->align, ptime_mult_octets), priv->align); + /* ptime max */ if (basepayload->max_ptime != -1) { maxptime_octets = priv->time_to_bytes (payload, basepayload->max_ptime); @@ -698,8 +706,10 @@ gst_base_rtp_audio_payload_get_lengths (GstBaseRTPPayload * priv->cached_ptime = basepayload->abidata.ABI.ptime; priv->cached_min_ptime = basepayload->min_ptime; priv->cached_max_ptime = basepayload->max_ptime; + priv->cached_ptime_multiple = basepayload->abidata.ABI.ptime_multiple; priv->cached_min_length = *min_payload_len; priv->cached_max_length = *max_payload_len; + priv->cached_align = *align; return TRUE; } @@ -849,7 +859,8 @@ gst_base_rtp_audio_payload_handle_buffer (GstBaseRTPPayload * GST_DEBUG_OBJECT (payload, "got buffer size %u, available %u", size, available); - if (available == 0 && (size >= min_payload_len && size <= max_payload_len)) { + if (available == 0 && (size >= min_payload_len && size <= max_payload_len) && + (size % align == 0)) { /* If buffer fits on an RTP packet, let's just push it through * this will check against max_ptime and max_mtu */ GST_DEBUG_OBJECT (payload, "Fast packet push"); |