From 8416cc94b58e0ea9d3c54fbf439202e0591a7b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 28 Oct 2008 16:28:45 +0000 Subject: gst/speexresample/gstspeexresample.c: Fixate to the nearest supported rate instead of the first one. Original commit message from CVS: * gst/speexresample/gstspeexresample.c: (gst_speex_resample_class_init), (gst_speex_resample_fixate_caps), (gst_speex_resample_process): Fixate to the nearest supported rate instead of the first one. --- gst/speexresample/gstspeexresample.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'gst/speexresample') diff --git a/gst/speexresample/gstspeexresample.c b/gst/speexresample/gstspeexresample.c index 096c6b93..63c20111 100644 --- a/gst/speexresample/gstspeexresample.c +++ b/gst/speexresample/gstspeexresample.c @@ -88,6 +88,8 @@ static gboolean gst_speex_resample_get_unit_size (GstBaseTransform * base, GstCaps * caps, guint * size); static GstCaps *gst_speex_resample_transform_caps (GstBaseTransform * base, GstPadDirection direction, GstCaps * caps); +static void gst_speex_resample_fixate_caps (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); static gboolean gst_speex_resample_transform_size (GstBaseTransform * trans, GstPadDirection direction, GstCaps * incaps, guint insize, GstCaps * outcaps, guint * outsize); @@ -148,6 +150,8 @@ gst_speex_resample_class_init (GstSpeexResampleClass * klass) GST_DEBUG_FUNCPTR (gst_speex_resample_get_unit_size); GST_BASE_TRANSFORM_CLASS (klass)->transform_caps = GST_DEBUG_FUNCPTR (gst_speex_resample_transform_caps); + GST_BASE_TRANSFORM_CLASS (klass)->fixate_caps = + GST_DEBUG_FUNCPTR (gst_speex_resample_fixate_caps); GST_BASE_TRANSFORM_CLASS (klass)->set_caps = GST_DEBUG_FUNCPTR (gst_speex_resample_set_caps); GST_BASE_TRANSFORM_CLASS (klass)->transform = @@ -239,6 +243,22 @@ gst_speex_resample_transform_caps (GstBaseTransform * base, return res; } +/* Fixate rate to the allowed rate that has the smallest difference */ +static void +gst_speex_resample_fixate_caps (GstBaseTransform * base, + GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) +{ + GstStructure *s; + gint rate; + + s = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (s, "rate", &rate)) + return; + + s = gst_caps_get_structure (othercaps, 0); + gst_structure_fixate_field_nearest_int (s, "rate", rate); +} + static SpeexResamplerState * gst_speex_resample_init_state (guint channels, guint inrate, guint outrate, guint quality, gboolean fp) @@ -735,9 +755,11 @@ gst_speex_resample_process (GstSpeexResample * resample, GstBuffer * inbuf, } return GST_BASE_TRANSFORM_FLOW_DROPPED; - } else if (out_len - out_processed != 1) + } else if (out_len - out_processed != 1) { GST_WARNING ("Converted to %d instead of %d output samples", out_processed, out_len); + } + if (out_len > out_processed) { gst_speex_fix_output_buffer (resample, outbuf, out_len - out_processed); } else { @@ -757,6 +779,7 @@ gst_speex_resample_process (GstSpeexResample * resample, GstBuffer * inbuf, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)), GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)), GST_BUFFER_OFFSET (outbuf), GST_BUFFER_OFFSET_END (outbuf)); + return GST_FLOW_OK; } } -- cgit v1.2.1