mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 19:51:11 +00:00
libs/gst/controller/: Use gst_guint64_to_gdouble() when converting from a uint64 or
Original commit message from CVS: Patch by: Sebastien Moutte <sebastien at moutte dot net> * libs/gst/controller/gstinterpolation.c: * libs/gst/controller/gstlfocontrolsource.c: Use gst_guint64_to_gdouble() when converting from a uint64 or GstClockTime to double to fix the build on win32. Fixes #474371.
This commit is contained in:
parent
93634c30c2
commit
e332c34902
3 changed files with 105 additions and 92 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2007-09-13 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
|
Patch by: Sebastien Moutte <sebastien at moutte dot net>
|
||||||
|
|
||||||
|
* libs/gst/controller/gstinterpolation.c:
|
||||||
|
* libs/gst/controller/gstlfocontrolsource.c:
|
||||||
|
Use gst_guint64_to_gdouble() when converting from a uint64 or
|
||||||
|
GstClockTime to double to fix the build on win32. Fixes #474371.
|
||||||
|
|
||||||
2007-09-13 Sebastian Dröge <slomo@circular-chaos.org>
|
2007-09-13 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
* gst/gstbuffer.c: (gst_buffer_finalize):
|
* gst/gstbuffer.c: (gst_buffer_finalize):
|
||||||
|
|
|
@ -31,6 +31,8 @@
|
||||||
#define GST_CAT_DEFAULT gst_controller_debug
|
#define GST_CAT_DEFAULT gst_controller_debug
|
||||||
GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT);
|
GST_DEBUG_CATEGORY_EXTERN (GST_CAT_DEFAULT);
|
||||||
|
|
||||||
|
#define EMPTY(x) (x)
|
||||||
|
|
||||||
/* common helper */
|
/* common helper */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -533,7 +535,7 @@ static GstInterpolateMethod interpolate_trigger = {
|
||||||
/* linear interpolation */
|
/* linear interpolation */
|
||||||
/* smoothes inbetween values */
|
/* smoothes inbetween values */
|
||||||
|
|
||||||
#define DEFINE_LINEAR_GET(type,round) \
|
#define DEFINE_LINEAR_GET(type,round,convert) \
|
||||||
static inline gboolean \
|
static inline gboolean \
|
||||||
_interpolate_linear_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, g##type *ret) \
|
_interpolate_linear_get_##type (GstInterpolationControlSource *self, GstClockTime timestamp, g##type *ret) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -551,12 +553,12 @@ _interpolate_linear_get_##type (GstInterpolationControlSource *self, GstClockTim
|
||||||
\
|
\
|
||||||
value1 = g_value_get_##type (&cp1->value); \
|
value1 = g_value_get_##type (&cp1->value); \
|
||||||
value2 = g_value_get_##type (&cp2->value); \
|
value2 = g_value_get_##type (&cp2->value); \
|
||||||
slope = (gdouble) (value2 - value1) / gst_guint64_to_gdouble (cp2->timestamp - cp1->timestamp); \
|
slope = (gdouble) convert (value2 - value1) / gst_guint64_to_gdouble (cp2->timestamp - cp1->timestamp); \
|
||||||
\
|
\
|
||||||
if (round) \
|
if (round) \
|
||||||
*ret = (g##type) (value1 + gst_guint64_to_gdouble (timestamp - cp1->timestamp) * slope + 0.5); \
|
*ret = (g##type) (convert (value1) + gst_guint64_to_gdouble (timestamp - cp1->timestamp) * slope + 0.5); \
|
||||||
else \
|
else \
|
||||||
*ret = (g##type) (value1 + gst_guint64_to_gdouble (timestamp - cp1->timestamp) * slope); \
|
*ret = (g##type) (convert (value1) + gst_guint64_to_gdouble (timestamp - cp1->timestamp) * slope); \
|
||||||
} \
|
} \
|
||||||
else { \
|
else { \
|
||||||
*ret = g_value_get_##type (&cp1->value); \
|
*ret = g_value_get_##type (&cp1->value); \
|
||||||
|
@ -606,16 +608,16 @@ interpolate_linear_get_##type##_value_array (GstInterpolationControlSource *self
|
||||||
return TRUE; \
|
return TRUE; \
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_LINEAR_GET (int, TRUE);
|
DEFINE_LINEAR_GET (int, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_LINEAR_GET (uint, TRUE);
|
DEFINE_LINEAR_GET (uint, TRUE, EMPTY);
|
||||||
DEFINE_LINEAR_GET (long, TRUE);
|
DEFINE_LINEAR_GET (long, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_LINEAR_GET (ulong, TRUE);
|
DEFINE_LINEAR_GET (ulong, TRUE, EMPTY);
|
||||||
DEFINE_LINEAR_GET (int64, TRUE);
|
DEFINE_LINEAR_GET (int64, TRUE, EMPTY);
|
||||||
DEFINE_LINEAR_GET (uint64, TRUE);
|
DEFINE_LINEAR_GET (uint64, TRUE, gst_util_guint64_to_gdouble);
|
||||||
DEFINE_LINEAR_GET (float, FALSE);
|
DEFINE_LINEAR_GET (float, FALSE, EMPTY);
|
||||||
DEFINE_LINEAR_GET (double, FALSE);
|
DEFINE_LINEAR_GET (double, FALSE, EMPTY);
|
||||||
|
|
||||||
static GstInterpolateMethod interpolate_linear = {
|
static GstInterpolateMethod interpolate_linear = {
|
||||||
(GstControlSourceGetValue) interpolate_linear_get_int,
|
(GstControlSourceGetValue) interpolate_linear_get_int,
|
||||||
|
@ -659,7 +661,7 @@ static GstInterpolateMethod interpolate_linear = {
|
||||||
* . . . . .
|
* . . . . .
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DEFINE_CUBIC_GET(type,round) \
|
#define DEFINE_CUBIC_GET(type,round, convert) \
|
||||||
static void \
|
static void \
|
||||||
_interpolate_cubic_update_cache_##type (GstInterpolationControlSource *self) \
|
_interpolate_cubic_update_cache_##type (GstInterpolationControlSource *self) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -706,7 +708,7 @@ _interpolate_cubic_update_cache_##type (GstInterpolationControlSource *self) \
|
||||||
o[i] = h[i-1]; \
|
o[i] = h[i-1]; \
|
||||||
p[i] = 2.0 * (h[i-1] + h[i]); \
|
p[i] = 2.0 * (h[i-1] + h[i]); \
|
||||||
q[i] = h[i]; \
|
q[i] = h[i]; \
|
||||||
b[i] = (y_next - y) / h[i] - (y - y_prev) / h[i-1]; \
|
b[i] = convert (y_next - y) / h[i] - convert (y - y_prev) / h[i-1]; \
|
||||||
} \
|
} \
|
||||||
p[n-1] = 1.0; \
|
p[n-1] = 1.0; \
|
||||||
\
|
\
|
||||||
|
@ -772,8 +774,8 @@ _interpolate_cubic_get_##type (GstInterpolationControlSource *self, GstClockTime
|
||||||
diff2 = gst_guint64_to_gdouble (cp2->timestamp - timestamp); \
|
diff2 = gst_guint64_to_gdouble (cp2->timestamp - timestamp); \
|
||||||
\
|
\
|
||||||
out = (cp2->cache.cubic.z * diff1 * diff1 * diff1 + cp1->cache.cubic.z * diff2 * diff2 * diff2) / cp1->cache.cubic.h; \
|
out = (cp2->cache.cubic.z * diff1 * diff1 * diff1 + cp1->cache.cubic.z * diff2 * diff2 * diff2) / cp1->cache.cubic.h; \
|
||||||
out += (value2 / cp1->cache.cubic.h - cp1->cache.cubic.h * cp2->cache.cubic.z) * diff1; \
|
out += (convert (value2) / cp1->cache.cubic.h - cp1->cache.cubic.h * cp2->cache.cubic.z) * diff1; \
|
||||||
out += (value1 / cp1->cache.cubic.h - cp1->cache.cubic.h * cp1->cache.cubic.z) * diff2; \
|
out += (convert (value1) / cp1->cache.cubic.h - cp1->cache.cubic.h * cp1->cache.cubic.z) * diff2; \
|
||||||
\
|
\
|
||||||
if (round) \
|
if (round) \
|
||||||
*ret = (g##type) (out + 0.5); \
|
*ret = (g##type) (out + 0.5); \
|
||||||
|
@ -828,16 +830,16 @@ interpolate_cubic_get_##type##_value_array (GstInterpolationControlSource *self,
|
||||||
return TRUE; \
|
return TRUE; \
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_CUBIC_GET (int, TRUE);
|
DEFINE_CUBIC_GET (int, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_CUBIC_GET (uint, TRUE);
|
DEFINE_CUBIC_GET (uint, TRUE, EMPTY);
|
||||||
DEFINE_CUBIC_GET (long, TRUE);
|
DEFINE_CUBIC_GET (long, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_CUBIC_GET (ulong, TRUE);
|
DEFINE_CUBIC_GET (ulong, TRUE, EMPTY);
|
||||||
DEFINE_CUBIC_GET (int64, TRUE);
|
DEFINE_CUBIC_GET (int64, TRUE, EMPTY);
|
||||||
DEFINE_CUBIC_GET (uint64, TRUE);
|
DEFINE_CUBIC_GET (uint64, TRUE, gst_util_guint64_to_gdouble);
|
||||||
DEFINE_CUBIC_GET (float, FALSE);
|
DEFINE_CUBIC_GET (float, FALSE, EMPTY);
|
||||||
DEFINE_CUBIC_GET (double, FALSE);
|
DEFINE_CUBIC_GET (double, FALSE, EMPTY);
|
||||||
|
|
||||||
static GstInterpolateMethod interpolate_cubic = {
|
static GstInterpolateMethod interpolate_cubic = {
|
||||||
(GstControlSourceGetValue) interpolate_cubic_get_int,
|
(GstControlSourceGetValue) interpolate_cubic_get_int,
|
||||||
|
|
|
@ -45,6 +45,8 @@
|
||||||
|
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
|
|
||||||
|
#define EMPTY(x) (x)
|
||||||
|
|
||||||
/* FIXME: as % in C is not the modulo operator we need here for
|
/* FIXME: as % in C is not the modulo operator we need here for
|
||||||
* negative numbers implement our own. Are there better ways? */
|
* negative numbers implement our own. Are there better ways? */
|
||||||
static inline GstClockTime
|
static inline GstClockTime
|
||||||
|
@ -59,7 +61,7 @@ _calculate_pos (GstClockTime timestamp, GstClockTime timeshift,
|
||||||
return timestamp % period;
|
return timestamp % period;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEFINE_SINE(type,round) \
|
#define DEFINE_SINE(type,round,convert) \
|
||||||
\
|
\
|
||||||
static inline g##type \
|
static inline g##type \
|
||||||
_sine_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
_sine_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
||||||
|
@ -67,18 +69,18 @@ _sine_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
||||||
gdouble ret; \
|
gdouble ret; \
|
||||||
g##type max = g_value_get_##type (&self->priv->maximum_value); \
|
g##type max = g_value_get_##type (&self->priv->maximum_value); \
|
||||||
g##type min = g_value_get_##type (&self->priv->minimum_value); \
|
g##type min = g_value_get_##type (&self->priv->minimum_value); \
|
||||||
gdouble amp = g_value_get_##type (&self->priv->amplitude); \
|
gdouble amp = convert (g_value_get_##type (&self->priv->amplitude)); \
|
||||||
gdouble off = g_value_get_##type (&self->priv->offset); \
|
gdouble off = convert (g_value_get_##type (&self->priv->offset)); \
|
||||||
GstClockTime pos = _calculate_pos (timestamp, self->priv->timeshift, self->priv->period); \
|
GstClockTime pos = _calculate_pos (timestamp, self->priv->timeshift, self->priv->period); \
|
||||||
\
|
\
|
||||||
ret = sin (2.0 * M_PI * (self->priv->frequency / GST_SECOND) * pos); \
|
ret = sin (2.0 * M_PI * (self->priv->frequency / GST_SECOND) * gst_util_guint64_to_gdouble (pos)); \
|
||||||
ret *= amp; \
|
ret *= amp; \
|
||||||
ret += off; \
|
ret += off; \
|
||||||
\
|
\
|
||||||
if (round) \
|
if (round) \
|
||||||
ret += 0.5; \
|
ret += 0.5; \
|
||||||
\
|
\
|
||||||
return (g##type) CLAMP (ret, min, max); \
|
return (g##type) CLAMP (ret, convert (min), convert (max)); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static gboolean \
|
static gboolean \
|
||||||
|
@ -111,15 +113,15 @@ waveform_sine_get_##type##_value_array (GstLFOControlSource *self, \
|
||||||
return TRUE; \
|
return TRUE; \
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_SINE (int, TRUE);
|
DEFINE_SINE (int, TRUE, EMPTY);
|
||||||
DEFINE_SINE (uint, TRUE);
|
DEFINE_SINE (uint, TRUE, EMPTY);
|
||||||
DEFINE_SINE (long, TRUE);
|
DEFINE_SINE (long, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_SINE (ulong, TRUE);
|
DEFINE_SINE (ulong, TRUE, EMPTY);
|
||||||
DEFINE_SINE (int64, TRUE);
|
DEFINE_SINE (int64, TRUE, EMPTY);
|
||||||
DEFINE_SINE (uint64, TRUE);
|
DEFINE_SINE (uint64, TRUE, gst_util_guint64_to_gdouble);
|
||||||
DEFINE_SINE (float, FALSE);
|
DEFINE_SINE (float, FALSE, EMPTY);
|
||||||
DEFINE_SINE (double, FALSE);
|
DEFINE_SINE (double, FALSE, EMPTY);
|
||||||
|
|
||||||
static GstWaveformImplementation waveform_sine = {
|
static GstWaveformImplementation waveform_sine = {
|
||||||
(GstControlSourceGetValue) waveform_sine_get_int,
|
(GstControlSourceGetValue) waveform_sine_get_int,
|
||||||
|
@ -140,15 +142,15 @@ static GstWaveformImplementation waveform_sine = {
|
||||||
(GstControlSourceGetValueArray) waveform_sine_get_double_value_array
|
(GstControlSourceGetValueArray) waveform_sine_get_double_value_array
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFINE_SQUARE(type,round) \
|
#define DEFINE_SQUARE(type,round, convert) \
|
||||||
\
|
\
|
||||||
static inline g##type \
|
static inline g##type \
|
||||||
_square_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
_square_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
||||||
{ \
|
{ \
|
||||||
g##type max = g_value_get_##type (&self->priv->maximum_value); \
|
g##type max = g_value_get_##type (&self->priv->maximum_value); \
|
||||||
g##type min = g_value_get_##type (&self->priv->minimum_value); \
|
g##type min = g_value_get_##type (&self->priv->minimum_value); \
|
||||||
gdouble amp = g_value_get_##type (&self->priv->amplitude); \
|
gdouble amp = convert (g_value_get_##type (&self->priv->amplitude)); \
|
||||||
gdouble off = g_value_get_##type (&self->priv->offset); \
|
gdouble off = convert (g_value_get_##type (&self->priv->offset)); \
|
||||||
GstClockTime period = self->priv->period; \
|
GstClockTime period = self->priv->period; \
|
||||||
GstClockTime pos = _calculate_pos (timestamp, self->priv->timeshift, period); \
|
GstClockTime pos = _calculate_pos (timestamp, self->priv->timeshift, period); \
|
||||||
gdouble ret; \
|
gdouble ret; \
|
||||||
|
@ -163,7 +165,7 @@ _square_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
||||||
if (round) \
|
if (round) \
|
||||||
ret += 0.5; \
|
ret += 0.5; \
|
||||||
\
|
\
|
||||||
return (g##type) CLAMP (ret, min, max); \
|
return (g##type) CLAMP (ret, convert (min), convert (max)); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static gboolean \
|
static gboolean \
|
||||||
|
@ -196,16 +198,16 @@ waveform_square_get_##type##_value_array (GstLFOControlSource *self, \
|
||||||
return TRUE; \
|
return TRUE; \
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_SQUARE (int, TRUE);
|
DEFINE_SQUARE (int, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_SQUARE (uint, TRUE);
|
DEFINE_SQUARE (uint, TRUE, EMPTY);
|
||||||
DEFINE_SQUARE (long, TRUE);
|
DEFINE_SQUARE (long, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_SQUARE (ulong, TRUE);
|
DEFINE_SQUARE (ulong, TRUE, EMPTY);
|
||||||
DEFINE_SQUARE (int64, TRUE);
|
DEFINE_SQUARE (int64, TRUE, EMPTY);
|
||||||
DEFINE_SQUARE (uint64, TRUE);
|
DEFINE_SQUARE (uint64, TRUE, gst_util_guint64_to_gdouble);
|
||||||
DEFINE_SQUARE (float, FALSE);
|
DEFINE_SQUARE (float, FALSE, EMPTY);
|
||||||
DEFINE_SQUARE (double, FALSE);
|
DEFINE_SQUARE (double, FALSE, EMPTY);
|
||||||
|
|
||||||
static GstWaveformImplementation waveform_square = {
|
static GstWaveformImplementation waveform_square = {
|
||||||
(GstControlSourceGetValue) waveform_square_get_int,
|
(GstControlSourceGetValue) waveform_square_get_int,
|
||||||
|
@ -226,27 +228,27 @@ static GstWaveformImplementation waveform_square = {
|
||||||
(GstControlSourceGetValueArray) waveform_square_get_double_value_array
|
(GstControlSourceGetValueArray) waveform_square_get_double_value_array
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFINE_SAW(type,round) \
|
#define DEFINE_SAW(type,round,convert) \
|
||||||
\
|
\
|
||||||
static inline g##type \
|
static inline g##type \
|
||||||
_saw_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
_saw_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
||||||
{ \
|
{ \
|
||||||
g##type max = g_value_get_##type (&self->priv->maximum_value); \
|
g##type max = g_value_get_##type (&self->priv->maximum_value); \
|
||||||
g##type min = g_value_get_##type (&self->priv->minimum_value); \
|
g##type min = g_value_get_##type (&self->priv->minimum_value); \
|
||||||
gdouble amp = g_value_get_##type (&self->priv->amplitude); \
|
gdouble amp = convert (g_value_get_##type (&self->priv->amplitude)); \
|
||||||
gdouble off = g_value_get_##type (&self->priv->offset); \
|
gdouble off = convert (g_value_get_##type (&self->priv->offset)); \
|
||||||
GstClockTime period = self->priv->period; \
|
GstClockTime period = self->priv->period; \
|
||||||
GstClockTime pos = _calculate_pos (timestamp, self->priv->timeshift, period); \
|
GstClockTime pos = _calculate_pos (timestamp, self->priv->timeshift, period); \
|
||||||
gdouble ret; \
|
gdouble ret; \
|
||||||
\
|
\
|
||||||
ret = - ((pos - period / 2.0) * ((2.0 * amp) / period));\
|
ret = - ((gst_util_guint64_to_gdouble (pos) - gst_util_guint64_to_gdouble (period) / 2.0) * ((2.0 * amp) / gst_util_guint64_to_gdouble (period)));\
|
||||||
\
|
\
|
||||||
ret += off; \
|
ret += off; \
|
||||||
\
|
\
|
||||||
if (round) \
|
if (round) \
|
||||||
ret += 0.5; \
|
ret += 0.5; \
|
||||||
\
|
\
|
||||||
return (g##type) CLAMP (ret, min, max); \
|
return (g##type) CLAMP (ret, convert (min), convert (max)); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static gboolean \
|
static gboolean \
|
||||||
|
@ -279,16 +281,16 @@ waveform_saw_get_##type##_value_array (GstLFOControlSource *self, \
|
||||||
return TRUE; \
|
return TRUE; \
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_SAW (int, TRUE);
|
DEFINE_SAW (int, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_SAW (uint, TRUE);
|
DEFINE_SAW (uint, TRUE, EMPTY);
|
||||||
DEFINE_SAW (long, TRUE);
|
DEFINE_SAW (long, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_SAW (ulong, TRUE);
|
DEFINE_SAW (ulong, TRUE, EMPTY);
|
||||||
DEFINE_SAW (int64, TRUE);
|
DEFINE_SAW (int64, TRUE, EMPTY);
|
||||||
DEFINE_SAW (uint64, TRUE);
|
DEFINE_SAW (uint64, TRUE, gst_util_guint64_to_gdouble);
|
||||||
DEFINE_SAW (float, FALSE);
|
DEFINE_SAW (float, FALSE, EMPTY);
|
||||||
DEFINE_SAW (double, FALSE);
|
DEFINE_SAW (double, FALSE, EMPTY);
|
||||||
|
|
||||||
static GstWaveformImplementation waveform_saw = {
|
static GstWaveformImplementation waveform_saw = {
|
||||||
(GstControlSourceGetValue) waveform_saw_get_int,
|
(GstControlSourceGetValue) waveform_saw_get_int,
|
||||||
|
@ -309,27 +311,27 @@ static GstWaveformImplementation waveform_saw = {
|
||||||
(GstControlSourceGetValueArray) waveform_saw_get_double_value_array
|
(GstControlSourceGetValueArray) waveform_saw_get_double_value_array
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFINE_RSAW(type,round) \
|
#define DEFINE_RSAW(type,round,convert) \
|
||||||
\
|
\
|
||||||
static inline g##type \
|
static inline g##type \
|
||||||
_rsaw_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
_rsaw_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
||||||
{ \
|
{ \
|
||||||
g##type max = g_value_get_##type (&self->priv->maximum_value); \
|
g##type max = g_value_get_##type (&self->priv->maximum_value); \
|
||||||
g##type min = g_value_get_##type (&self->priv->minimum_value); \
|
g##type min = g_value_get_##type (&self->priv->minimum_value); \
|
||||||
gdouble amp = g_value_get_##type (&self->priv->amplitude); \
|
gdouble amp = convert (g_value_get_##type (&self->priv->amplitude)); \
|
||||||
gdouble off = g_value_get_##type (&self->priv->offset); \
|
gdouble off = convert (g_value_get_##type (&self->priv->offset)); \
|
||||||
GstClockTime period = self->priv->period; \
|
GstClockTime period = self->priv->period; \
|
||||||
GstClockTime pos = _calculate_pos (timestamp, self->priv->timeshift, period); \
|
GstClockTime pos = _calculate_pos (timestamp, self->priv->timeshift, period); \
|
||||||
gdouble ret; \
|
gdouble ret; \
|
||||||
\
|
\
|
||||||
ret = ((pos - period / 2.0) * ((2.0 * amp) / period));\
|
ret = ((gst_util_guint64_to_gdouble (pos) - gst_util_guint64_to_gdouble (period) / 2.0) * ((2.0 * amp) / gst_util_guint64_to_gdouble (period)));\
|
||||||
\
|
\
|
||||||
ret += off; \
|
ret += off; \
|
||||||
\
|
\
|
||||||
if (round) \
|
if (round) \
|
||||||
ret += 0.5; \
|
ret += 0.5; \
|
||||||
\
|
\
|
||||||
return (g##type) CLAMP (ret, min, max); \
|
return (g##type) CLAMP (ret, convert (min), convert (max)); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static gboolean \
|
static gboolean \
|
||||||
|
@ -362,16 +364,16 @@ waveform_rsaw_get_##type##_value_array (GstLFOControlSource *self, \
|
||||||
return TRUE; \
|
return TRUE; \
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_RSAW (int, TRUE);
|
DEFINE_RSAW (int, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_RSAW (uint, TRUE);
|
DEFINE_RSAW (uint, TRUE, EMPTY);
|
||||||
DEFINE_RSAW (long, TRUE);
|
DEFINE_RSAW (long, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_RSAW (ulong, TRUE);
|
DEFINE_RSAW (ulong, TRUE, EMPTY);
|
||||||
DEFINE_RSAW (int64, TRUE);
|
DEFINE_RSAW (int64, TRUE, EMPTY);
|
||||||
DEFINE_RSAW (uint64, TRUE);
|
DEFINE_RSAW (uint64, TRUE, gst_util_guint64_to_gdouble);
|
||||||
DEFINE_RSAW (float, FALSE);
|
DEFINE_RSAW (float, FALSE, EMPTY);
|
||||||
DEFINE_RSAW (double, FALSE);
|
DEFINE_RSAW (double, FALSE, EMPTY);
|
||||||
|
|
||||||
static GstWaveformImplementation waveform_rsaw = {
|
static GstWaveformImplementation waveform_rsaw = {
|
||||||
(GstControlSourceGetValue) waveform_rsaw_get_int,
|
(GstControlSourceGetValue) waveform_rsaw_get_int,
|
||||||
|
@ -392,32 +394,32 @@ static GstWaveformImplementation waveform_rsaw = {
|
||||||
(GstControlSourceGetValueArray) waveform_rsaw_get_double_value_array
|
(GstControlSourceGetValueArray) waveform_rsaw_get_double_value_array
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFINE_TRIANGLE(type,round) \
|
#define DEFINE_TRIANGLE(type,round,convert) \
|
||||||
\
|
\
|
||||||
static inline g##type \
|
static inline g##type \
|
||||||
_triangle_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
_triangle_get_##type (GstLFOControlSource *self, GstClockTime timestamp) \
|
||||||
{ \
|
{ \
|
||||||
g##type max = g_value_get_##type (&self->priv->maximum_value); \
|
g##type max = g_value_get_##type (&self->priv->maximum_value); \
|
||||||
g##type min = g_value_get_##type (&self->priv->minimum_value); \
|
g##type min = g_value_get_##type (&self->priv->minimum_value); \
|
||||||
gdouble amp = g_value_get_##type (&self->priv->amplitude); \
|
gdouble amp = convert (g_value_get_##type (&self->priv->amplitude)); \
|
||||||
gdouble off = g_value_get_##type (&self->priv->offset); \
|
gdouble off = convert (g_value_get_##type (&self->priv->offset)); \
|
||||||
GstClockTime period = self->priv->period; \
|
GstClockTime period = self->priv->period; \
|
||||||
GstClockTime pos = _calculate_pos (timestamp, self->priv->timeshift, period); \
|
GstClockTime pos = _calculate_pos (timestamp, self->priv->timeshift, period); \
|
||||||
gdouble ret; \
|
gdouble ret; \
|
||||||
\
|
\
|
||||||
if (pos <= period / 4.0) \
|
if (gst_util_guint64_to_gdouble (pos) <= gst_util_guint64_to_gdouble (period) / 4.0) \
|
||||||
ret = pos * ((4.0 * amp) / period); \
|
ret = gst_util_guint64_to_gdouble (pos) * ((4.0 * amp) / gst_util_guint64_to_gdouble (period)); \
|
||||||
else if (pos <= (3.0 * period) / 4.0) \
|
else if (gst_util_guint64_to_gdouble (pos) <= (3.0 * gst_util_guint64_to_gdouble (period)) / 4.0) \
|
||||||
ret = -(pos - period / 2.0) * ((4.0 * amp) / period); \
|
ret = -(gst_util_guint64_to_gdouble (pos) - gst_util_guint64_to_gdouble (period) / 2.0) * ((4.0 * amp) / gst_util_guint64_to_gdouble (period)); \
|
||||||
else \
|
else \
|
||||||
ret = (period - pos) * ((4.0 * amp) / period); \
|
ret = gst_util_guint64_to_gdouble (period) - gst_util_guint64_to_gdouble (pos) * ((4.0 * amp) / gst_util_guint64_to_gdouble (period)); \
|
||||||
\
|
\
|
||||||
ret += off; \
|
ret += off; \
|
||||||
\
|
\
|
||||||
if (round) \
|
if (round) \
|
||||||
ret += 0.5; \
|
ret += 0.5; \
|
||||||
\
|
\
|
||||||
return (g##type) CLAMP (ret, min, max); \
|
return (g##type) CLAMP (ret, convert (min), convert (max)); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static gboolean \
|
static gboolean \
|
||||||
|
@ -450,16 +452,16 @@ waveform_triangle_get_##type##_value_array (GstLFOControlSource *self, \
|
||||||
return TRUE; \
|
return TRUE; \
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_TRIANGLE (int, TRUE);
|
DEFINE_TRIANGLE (int, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_TRIANGLE (uint, TRUE);
|
DEFINE_TRIANGLE (uint, TRUE, EMPTY);
|
||||||
DEFINE_TRIANGLE (long, TRUE);
|
DEFINE_TRIANGLE (long, TRUE, EMPTY);
|
||||||
|
|
||||||
DEFINE_TRIANGLE (ulong, TRUE);
|
DEFINE_TRIANGLE (ulong, TRUE, EMPTY);
|
||||||
DEFINE_TRIANGLE (int64, TRUE);
|
DEFINE_TRIANGLE (int64, TRUE, EMPTY);
|
||||||
DEFINE_TRIANGLE (uint64, TRUE);
|
DEFINE_TRIANGLE (uint64, TRUE, gst_util_guint64_to_gdouble);
|
||||||
DEFINE_TRIANGLE (float, FALSE);
|
DEFINE_TRIANGLE (float, FALSE, EMPTY);
|
||||||
DEFINE_TRIANGLE (double, FALSE);
|
DEFINE_TRIANGLE (double, FALSE, EMPTY);
|
||||||
|
|
||||||
static GstWaveformImplementation waveform_triangle = {
|
static GstWaveformImplementation waveform_triangle = {
|
||||||
(GstControlSourceGetValue) waveform_triangle_get_int,
|
(GstControlSourceGetValue) waveform_triangle_get_int,
|
||||||
|
|
Loading…
Reference in a new issue