gst-libs/gst/audio/gstbaseaudiosink.h: Clarify some docs.
Original commit message from CVS: * gst-libs/gst/audio/gstbaseaudiosink.h: Clarify some docs. * gst-libs/gst/audio/gstbaseaudiosrc.c: (slave_method_get_type), (gst_base_audio_src_class_init), (gst_base_audio_src_init), (gst_base_audio_src_set_slave_method), (gst_base_audio_src_get_slave_method), (gst_base_audio_src_set_property), (gst_base_audio_src_get_property), (gst_base_audio_src_create): * gst-libs/gst/audio/gstbaseaudiosrc.h: Add property and methods for selecting the clock slave method in the source, like in the sink. We only implement "none" and "re-timestamp" for now. API: gst_base_audio_src_set_slave_method() API: gst_base_audio_src_get_slave_method()
This commit is contained in:
parent
0c5d01b59f
commit
7916e386ca
18
ChangeLog
18
ChangeLog
@ -1,3 +1,21 @@
|
|||||||
|
2008-04-28 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst-libs/gst/audio/gstbaseaudiosink.h:
|
||||||
|
Clarify some docs.
|
||||||
|
|
||||||
|
* gst-libs/gst/audio/gstbaseaudiosrc.c: (slave_method_get_type),
|
||||||
|
(gst_base_audio_src_class_init), (gst_base_audio_src_init),
|
||||||
|
(gst_base_audio_src_set_slave_method),
|
||||||
|
(gst_base_audio_src_get_slave_method),
|
||||||
|
(gst_base_audio_src_set_property),
|
||||||
|
(gst_base_audio_src_get_property), (gst_base_audio_src_create):
|
||||||
|
* gst-libs/gst/audio/gstbaseaudiosrc.h:
|
||||||
|
Add property and methods for selecting the clock slave method in the
|
||||||
|
source, like in the sink.
|
||||||
|
We only implement "none" and "re-timestamp" for now.
|
||||||
|
API: gst_base_audio_src_set_slave_method()
|
||||||
|
API: gst_base_audio_src_get_slave_method()
|
||||||
|
|
||||||
2008-04-25 Wim Taymans <wim.taymans@collabora.co.uk>
|
2008-04-25 Wim Taymans <wim.taymans@collabora.co.uk>
|
||||||
|
|
||||||
* gst-libs/gst/rtp/gstrtpbuffer.c:
|
* gst-libs/gst/rtp/gstrtpbuffer.c:
|
||||||
|
@ -85,7 +85,8 @@ G_BEGIN_DECLS
|
|||||||
* drifts too much.
|
* drifts too much.
|
||||||
* @GST_BASE_AUDIO_SINK_SLAVE_NONE: No adjustment is done.
|
* @GST_BASE_AUDIO_SINK_SLAVE_NONE: No adjustment is done.
|
||||||
*
|
*
|
||||||
* Different possible clock slaving algorithms
|
* Different possible clock slaving algorithms used when the internal audio
|
||||||
|
* clock is not selected as the pipeline master clock.
|
||||||
*/
|
*/
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
@ -45,12 +45,36 @@
|
|||||||
GST_DEBUG_CATEGORY_STATIC (gst_base_audio_src_debug);
|
GST_DEBUG_CATEGORY_STATIC (gst_base_audio_src_debug);
|
||||||
#define GST_CAT_DEFAULT gst_base_audio_src_debug
|
#define GST_CAT_DEFAULT gst_base_audio_src_debug
|
||||||
|
|
||||||
|
#define GST_TYPE_SLAVE_METHOD (slave_method_get_type ())
|
||||||
|
|
||||||
|
static GType
|
||||||
|
slave_method_get_type (void)
|
||||||
|
{
|
||||||
|
static GType slave_method_type = 0;
|
||||||
|
static const GEnumValue slave_method[] = {
|
||||||
|
{GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE, "Resampling slaving", "resample"},
|
||||||
|
{GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP, "Re-timestamp", "re-timestamp"},
|
||||||
|
{GST_BASE_AUDIO_SRC_SLAVE_SKEW, "Skew", "skew"},
|
||||||
|
{GST_BASE_AUDIO_SRC_SLAVE_NONE, "No slaving", "none"},
|
||||||
|
{0, NULL, NULL},
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!slave_method_type) {
|
||||||
|
slave_method_type =
|
||||||
|
g_enum_register_static ("GstBaseAudioSrcSlaveMethod", slave_method);
|
||||||
|
}
|
||||||
|
return slave_method_type;
|
||||||
|
}
|
||||||
|
|
||||||
#define GST_BASE_AUDIO_SRC_GET_PRIVATE(obj) \
|
#define GST_BASE_AUDIO_SRC_GET_PRIVATE(obj) \
|
||||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_AUDIO_SRC, GstBaseAudioSrcPrivate))
|
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_BASE_AUDIO_SRC, GstBaseAudioSrcPrivate))
|
||||||
|
|
||||||
struct _GstBaseAudioSrcPrivate
|
struct _GstBaseAudioSrcPrivate
|
||||||
{
|
{
|
||||||
gboolean provide_clock;
|
gboolean provide_clock;
|
||||||
|
|
||||||
|
/* the clock slaving algorithm in use */
|
||||||
|
GstBaseAudioSrcSlaveMethod slave_method;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* BaseAudioSrc signals and args */
|
/* BaseAudioSrc signals and args */
|
||||||
@ -63,13 +87,16 @@ enum
|
|||||||
#define DEFAULT_BUFFER_TIME ((200 * GST_MSECOND) / GST_USECOND)
|
#define DEFAULT_BUFFER_TIME ((200 * GST_MSECOND) / GST_USECOND)
|
||||||
#define DEFAULT_LATENCY_TIME ((10 * GST_MSECOND) / GST_USECOND)
|
#define DEFAULT_LATENCY_TIME ((10 * GST_MSECOND) / GST_USECOND)
|
||||||
#define DEFAULT_PROVIDE_CLOCK TRUE
|
#define DEFAULT_PROVIDE_CLOCK TRUE
|
||||||
|
#define DEFAULT_SLAVE_METHOD GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_BUFFER_TIME,
|
PROP_BUFFER_TIME,
|
||||||
PROP_LATENCY_TIME,
|
PROP_LATENCY_TIME,
|
||||||
PROP_PROVIDE_CLOCK
|
PROP_PROVIDE_CLOCK,
|
||||||
|
PROP_SLAVE_METHOD,
|
||||||
|
PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -157,6 +184,12 @@ gst_base_audio_src_class_init (GstBaseAudioSrcClass * klass)
|
|||||||
"Provide a clock to be used as the global pipeline clock",
|
"Provide a clock to be used as the global pipeline clock",
|
||||||
DEFAULT_PROVIDE_CLOCK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
DEFAULT_PROVIDE_CLOCK, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
|
g_object_class_install_property (gobject_class, PROP_SLAVE_METHOD,
|
||||||
|
g_param_spec_enum ("slave-method", "Slave Method",
|
||||||
|
"Algorithm to use to match the rate of the masterclock",
|
||||||
|
GST_TYPE_SLAVE_METHOD, DEFAULT_SLAVE_METHOD,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
gstelement_class->change_state =
|
gstelement_class->change_state =
|
||||||
GST_DEBUG_FUNCPTR (gst_base_audio_src_change_state);
|
GST_DEBUG_FUNCPTR (gst_base_audio_src_change_state);
|
||||||
gstelement_class->provide_clock =
|
gstelement_class->provide_clock =
|
||||||
@ -187,6 +220,7 @@ gst_base_audio_src_init (GstBaseAudioSrc * baseaudiosrc,
|
|||||||
baseaudiosrc->buffer_time = DEFAULT_BUFFER_TIME;
|
baseaudiosrc->buffer_time = DEFAULT_BUFFER_TIME;
|
||||||
baseaudiosrc->latency_time = DEFAULT_LATENCY_TIME;
|
baseaudiosrc->latency_time = DEFAULT_LATENCY_TIME;
|
||||||
baseaudiosrc->priv->provide_clock = DEFAULT_PROVIDE_CLOCK;
|
baseaudiosrc->priv->provide_clock = DEFAULT_PROVIDE_CLOCK;
|
||||||
|
baseaudiosrc->priv->slave_method = DEFAULT_SLAVE_METHOD;
|
||||||
/* reset blocksize we use latency time to calculate a more useful
|
/* reset blocksize we use latency time to calculate a more useful
|
||||||
* value based on negotiated format. */
|
* value based on negotiated format. */
|
||||||
GST_BASE_SRC (baseaudiosrc)->blocksize = 0;
|
GST_BASE_SRC (baseaudiosrc)->blocksize = 0;
|
||||||
@ -341,6 +375,50 @@ gst_base_audio_src_get_provide_clock (GstBaseAudioSrc * src)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_base_audio_src_set_slave_method:
|
||||||
|
* @src: a #GstBaseAudioSrc
|
||||||
|
* @method: the new slave method
|
||||||
|
*
|
||||||
|
* Controls how clock slaving will be performed in @src.
|
||||||
|
*
|
||||||
|
* Since: 0.10.20
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_base_audio_src_set_slave_method (GstBaseAudioSrc * src,
|
||||||
|
GstBaseAudioSrcSlaveMethod method)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GST_IS_BASE_AUDIO_SRC (src));
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (src);
|
||||||
|
src->priv->slave_method = method;
|
||||||
|
GST_OBJECT_UNLOCK (src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_base_audio_src_get_slave_method:
|
||||||
|
* @src: a #GstBaseAudioSrc
|
||||||
|
*
|
||||||
|
* Get the current slave method used by @src.
|
||||||
|
*
|
||||||
|
* Returns: The current slave method used by @src.
|
||||||
|
*
|
||||||
|
* Since: 0.10.20
|
||||||
|
*/
|
||||||
|
GstBaseAudioSrcSlaveMethod
|
||||||
|
gst_base_audio_src_get_slave_method (GstBaseAudioSrc * src)
|
||||||
|
{
|
||||||
|
GstBaseAudioSrcSlaveMethod result;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_BASE_AUDIO_SRC (src), -1);
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (src);
|
||||||
|
result = src->priv->slave_method;
|
||||||
|
GST_OBJECT_UNLOCK (src);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_base_audio_src_set_property (GObject * object, guint prop_id,
|
gst_base_audio_src_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
@ -359,6 +437,9 @@ gst_base_audio_src_set_property (GObject * object, guint prop_id,
|
|||||||
case PROP_PROVIDE_CLOCK:
|
case PROP_PROVIDE_CLOCK:
|
||||||
gst_base_audio_src_set_provide_clock (src, g_value_get_boolean (value));
|
gst_base_audio_src_set_provide_clock (src, g_value_get_boolean (value));
|
||||||
break;
|
break;
|
||||||
|
case PROP_SLAVE_METHOD:
|
||||||
|
gst_base_audio_src_set_slave_method (src, g_value_get_enum (value));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -383,6 +464,9 @@ gst_base_audio_src_get_property (GObject * object, guint prop_id,
|
|||||||
case PROP_PROVIDE_CLOCK:
|
case PROP_PROVIDE_CLOCK:
|
||||||
g_value_set_boolean (value, gst_base_audio_src_get_provide_clock (src));
|
g_value_set_boolean (value, gst_base_audio_src_get_provide_clock (src));
|
||||||
break;
|
break;
|
||||||
|
case PROP_SLAVE_METHOD:
|
||||||
|
g_value_set_enum (value, gst_base_audio_src_get_slave_method (src));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -682,25 +766,40 @@ gst_base_audio_src_create (GstBaseSrc * bsrc, guint64 offset, guint length,
|
|||||||
GST_OBJECT_LOCK (src);
|
GST_OBJECT_LOCK (src);
|
||||||
clock = GST_ELEMENT_CLOCK (src);
|
clock = GST_ELEMENT_CLOCK (src);
|
||||||
if (clock != NULL && clock != src->clock) {
|
if (clock != NULL && clock != src->clock) {
|
||||||
GstClockTime base_time, latency;
|
switch (src->priv->slave_method) {
|
||||||
|
case GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE:
|
||||||
|
/* not implemented, use retimestamp algorithm. This algorithm should
|
||||||
|
* work on the readout pointer and produces more or less samples based
|
||||||
|
* on the clock drift */
|
||||||
|
case GST_BASE_AUDIO_SRC_SLAVE_SKEW:
|
||||||
|
/* not implemented, use retimestamp algorithm. This algortihm should work
|
||||||
|
* on the readout pointer above and creates small jumps when needed. */
|
||||||
|
case GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP:
|
||||||
|
{
|
||||||
|
GstClockTime base_time, latency;
|
||||||
|
|
||||||
/* We are slaved to another clock, take running time of the clock and just
|
/* We are slaved to another clock, take running time of the pipeline clock and
|
||||||
* timestamp against it. Somebody else in the pipeline should figure out the
|
* timestamp against it. Somebody else in the pipeline should figure out the
|
||||||
* clock drift, for now. We keep the duration we calculated above. */
|
* clock drift. We keep the duration we calculated above. */
|
||||||
timestamp = gst_clock_get_time (clock);
|
timestamp = gst_clock_get_time (clock);
|
||||||
base_time = GST_ELEMENT_CAST (src)->base_time;
|
base_time = GST_ELEMENT_CAST (src)->base_time;
|
||||||
|
|
||||||
if (timestamp > base_time)
|
if (timestamp > base_time)
|
||||||
timestamp -= base_time;
|
timestamp -= base_time;
|
||||||
else
|
else
|
||||||
timestamp = 0;
|
timestamp = 0;
|
||||||
|
|
||||||
/* subtract latency */
|
/* subtract latency */
|
||||||
latency = gst_util_uint64_scale_int (total_samples, GST_SECOND, spec->rate);
|
latency =
|
||||||
if (timestamp > latency)
|
gst_util_uint64_scale_int (total_samples, GST_SECOND, spec->rate);
|
||||||
timestamp -= latency;
|
if (timestamp > latency)
|
||||||
else
|
timestamp -= latency;
|
||||||
timestamp = 0;
|
else
|
||||||
|
timestamp = 0;
|
||||||
|
}
|
||||||
|
case GST_BASE_AUDIO_SRC_SLAVE_NONE:
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
GST_OBJECT_UNLOCK (src);
|
GST_OBJECT_UNLOCK (src);
|
||||||
|
|
||||||
|
@ -59,6 +59,26 @@ typedef struct _GstBaseAudioSrc GstBaseAudioSrc;
|
|||||||
typedef struct _GstBaseAudioSrcClass GstBaseAudioSrcClass;
|
typedef struct _GstBaseAudioSrcClass GstBaseAudioSrcClass;
|
||||||
typedef struct _GstBaseAudioSrcPrivate GstBaseAudioSrcPrivate;
|
typedef struct _GstBaseAudioSrcPrivate GstBaseAudioSrcPrivate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstBaseAudioSrcSlaveMethod:
|
||||||
|
* @GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE: Resample to match the master clock.
|
||||||
|
* @GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP: Retimestamp output buffers with master
|
||||||
|
* clock time.
|
||||||
|
* @GST_BASE_AUDIO_SRC_SLAVE_SKEW: Adjust capture pointer when master clock
|
||||||
|
* drifts too much.
|
||||||
|
* @GST_BASE_AUDIO_SRC_SLAVE_NONE: No adjustment is done.
|
||||||
|
*
|
||||||
|
* Different possible clock slaving algorithms when the internal audio clock was
|
||||||
|
* not selected as the pipeline clock.
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
GST_BASE_AUDIO_SRC_SLAVE_RESAMPLE,
|
||||||
|
GST_BASE_AUDIO_SRC_SLAVE_RETIMESTAMP,
|
||||||
|
GST_BASE_AUDIO_SRC_SLAVE_SKEW,
|
||||||
|
GST_BASE_AUDIO_SRC_SLAVE_NONE
|
||||||
|
} GstBaseAudioSrcSlaveMethod;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GstBaseAudioSrc:
|
* GstBaseAudioSrc:
|
||||||
*
|
*
|
||||||
@ -112,6 +132,12 @@ GstRingBuffer *gst_base_audio_src_create_ringbuffer (GstBaseAudioSrc *src);
|
|||||||
void gst_base_audio_src_set_provide_clock (GstBaseAudioSrc *src, gboolean provide);
|
void gst_base_audio_src_set_provide_clock (GstBaseAudioSrc *src, gboolean provide);
|
||||||
gboolean gst_base_audio_src_get_provide_clock (GstBaseAudioSrc *src);
|
gboolean gst_base_audio_src_get_provide_clock (GstBaseAudioSrc *src);
|
||||||
|
|
||||||
|
void gst_base_audio_src_set_slave_method (GstBaseAudioSrc *src,
|
||||||
|
GstBaseAudioSrcSlaveMethod method);
|
||||||
|
GstBaseAudioSrcSlaveMethod
|
||||||
|
gst_base_audio_src_get_slave_method (GstBaseAudioSrc *src);
|
||||||
|
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __GST_BASE_AUDIO_SRC_H__ */
|
#endif /* __GST_BASE_AUDIO_SRC_H__ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user