summaryrefslogtreecommitdiffstats
path: root/gst/speexresample
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2008-10-28 16:28:45 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2008-10-28 16:28:45 +0000
commit8416cc94b58e0ea9d3c54fbf439202e0591a7b9f (patch)
treed0f3962a0f1570bc79501acb72252def2d214153 /gst/speexresample
parente4493882765edefb70c2dcbc4eaf21d17d5a2b0a (diff)
downloadgst-plugins-bad-8416cc94b58e0ea9d3c54fbf439202e0591a7b9f.tar.gz
gst-plugins-bad-8416cc94b58e0ea9d3c54fbf439202e0591a7b9f.tar.bz2
gst-plugins-bad-8416cc94b58e0ea9d3c54fbf439202e0591a7b9f.zip
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.
Diffstat (limited to 'gst/speexresample')
-rw-r--r--gst/speexresample/gstspeexresample.c25
1 files changed, 24 insertions, 1 deletions
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;
}
}