[gst-cvs] CVS: gstreamer/gst gstdparam.c,1.6,1.7

Steve Baker sbaker3 at users.sourceforge.net
Mon Sep 17 12:15:05 PDT 2001


Update of /cvsroot/gstreamer/gstreamer/gst
In directory usw-pr-cvs1:/tmp/cvs-serv20226

Modified Files:
	gstdparam.c 
Log Message:
smooth dparam now does log smooths when it is a log param (like frequency)

Index: gstdparam.c
===================================================================
RCS file: /cvsroot/gstreamer/gstreamer/gst/gstdparam.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- gstdparam.c	2001/09/16 13:00:49	1.6
+++ gstdparam.c	2001/09/17 19:14:35	1.7
@@ -19,6 +19,8 @@
  * Boston, MA 02111-1307, USA.
  */
 
+#include <math.h>
+
 #include "gst_private.h"
 
 #include "gstdparam.h"
@@ -316,22 +318,36 @@
 	
 	switch (G_VALUE_TYPE(GST_DPARAM_VALUE(dparam))){
 		case G_TYPE_FLOAT: {
-			gfloat target = g_value_get_float(dparam->point[0]);
-			gfloat current = g_value_get_float(GST_DPARAM_VALUE(dparam));
-			gfloat max_change = time_ratio * g_value_get_float(dparam->point[1]);
+			gfloat current, target, max_change, current_diff, final_val;
 			
-			GST_DEBUG(GST_CAT_PARAMS, "target:%f current:%f max_change:%f \n", 
-			          target, current, max_change);
+			target = g_value_get_float(dparam->point[0]);
+			current = g_value_get_float(GST_DPARAM_VALUE(dparam));
+			max_change = time_ratio * g_value_get_float(dparam->point[1]);
 
-			if (ABS (current - target) < max_change){
-				GST_DPARAM_READY_FOR_UPDATE(dparam) = FALSE;
-				current = target;
-			}
+			GST_DEBUG(GST_CAT_PARAMS, "target:%f current:%f max_change:%f \n", 
+			                           target, current, max_change);
+			                           
+			if (dparam->spec->is_log){
+				gfloat current_log;
+				current_log = log(current);
+				current_diff = ABS(current_log - log(target));
+				if (current_diff > max_change)
+					final_val = (target < current) ? exp(current_log-max_change) : exp(current_log+max_change);
+				else
+					final_val = target;
+			} 
 			else {
-				current += (target < current) ? -max_change : max_change;				
+				current_diff = ABS (current - target);
+				if (current_diff > max_change)
+					final_val = (target < current) ? current-max_change : current+max_change;
+				else
+					final_val = target;									
 			}
-			g_value_set_float(GST_DPARAM_VALUE(dparam), current);
 
+			GST_DPARAM_READY_FOR_UPDATE(dparam) = (current_diff > max_change);
+			g_value_set_float(GST_DPARAM_VALUE(dparam), final_val);
+			
+			break;
 		}
 		default:
 			break;





More information about the Gstreamer-commits mailing list