baseaudiodecoder: move properties to private storage and add

_get/_set
This commit is contained in:
Mark Nauwelaerts 2011-08-16 21:11:42 +02:00 committed by Tim-Philipp Müller
parent 7939d37936
commit a4d5e33224
2 changed files with 175 additions and 20 deletions

View file

@ -254,6 +254,12 @@ struct _GstBaseAudioDecoderPrivate
/* context storage */ /* context storage */
GstBaseAudioDecoderContext ctx; GstBaseAudioDecoderContext ctx;
/* properties */
GstClockTime latency;
GstClockTime tolerance;
gboolean plc;
}; };
@ -388,8 +394,9 @@ gst_base_audio_decoder_init (GstBaseAudioDecoder * dec,
g_queue_init (&dec->priv->frames); g_queue_init (&dec->priv->frames);
/* property default */ /* property default */
dec->latency = DEFAULT_LATENCY; dec->priv->latency = DEFAULT_LATENCY;
dec->tolerance = DEFAULT_TOLERANCE; dec->priv->tolerance = DEFAULT_TOLERANCE;
dec->priv->plc = DEFAULT_PLC;
/* init state */ /* init state */
gst_base_audio_decoder_reset (dec, TRUE); gst_base_audio_decoder_reset (dec, TRUE);
@ -587,7 +594,7 @@ gst_base_audio_decoder_output (GstBaseAudioDecoder * dec, GstBuffer * buf)
again: again:
inbuf = NULL; inbuf = NULL;
if (priv->agg && dec->latency > 0) { if (priv->agg && dec->priv->latency > 0) {
gint av; gint av;
gboolean assemble = FALSE; gboolean assemble = FALSE;
const GstClockTimeDiff tol = 10 * GST_MSECOND; const GstClockTimeDiff tol = 10 * GST_MSECOND;
@ -618,7 +625,7 @@ again:
av += GST_BUFFER_SIZE (buf); av += GST_BUFFER_SIZE (buf);
buf = NULL; buf = NULL;
} }
if (priv->out_dur > dec->latency) if (priv->out_dur > dec->priv->latency)
assemble = TRUE; assemble = TRUE;
if (av && assemble) { if (av && assemble) {
GST_LOG_OBJECT (dec, "assembling fragment"); GST_LOG_OBJECT (dec, "assembling fragment");
@ -757,7 +764,7 @@ gst_base_audio_decoder_finish_frame (GstBaseAudioDecoder * dec, GstBuffer * buf,
/* slightly convoluted approach caters for perfect ts if subclass desires */ /* slightly convoluted approach caters for perfect ts if subclass desires */
if (GST_CLOCK_TIME_IS_VALID (ts)) { if (GST_CLOCK_TIME_IS_VALID (ts)) {
if (dec->tolerance > 0) { if (dec->priv->tolerance > 0) {
GstClockTimeDiff diff; GstClockTimeDiff diff;
g_assert (GST_CLOCK_TIME_IS_VALID (priv->base_ts)); g_assert (GST_CLOCK_TIME_IS_VALID (priv->base_ts));
@ -771,7 +778,8 @@ gst_base_audio_decoder_finish_frame (GstBaseAudioDecoder * dec, GstBuffer * buf,
/* if within tolerance, /* if within tolerance,
* discard buffer ts and carry on producing perfect stream, * discard buffer ts and carry on producing perfect stream,
* otherwise resync to ts */ * otherwise resync to ts */
if (G_UNLIKELY (diff < -dec->tolerance || diff > dec->tolerance)) { if (G_UNLIKELY (diff < -dec->priv->tolerance ||
diff > dec->priv->tolerance)) {
GST_DEBUG_OBJECT (dec, "base_ts resync"); GST_DEBUG_OBJECT (dec, "base_ts resync");
priv->base_ts = ts; priv->base_ts = ts;
priv->samples = 0; priv->samples = 0;
@ -1338,10 +1346,10 @@ gst_base_audio_decoder_sink_eventfunc (GstBaseAudioDecoder * dec,
* some concealment data */ * some concealment data */
GST_DEBUG_OBJECT (dec, GST_DEBUG_OBJECT (dec,
"segment update: plc %d, do_plc %d, last_stop %" GST_TIME_FORMAT, "segment update: plc %d, do_plc %d, last_stop %" GST_TIME_FORMAT,
dec->plc, dec->priv->ctx.do_plc, dec->priv->plc, dec->priv->ctx.do_plc,
GST_TIME_ARGS (dec->segment.last_stop)); GST_TIME_ARGS (dec->segment.last_stop));
if (dec->plc && dec->priv->ctx.do_plc && dec->segment.rate > 0.0 && if (dec->priv->plc && dec->priv->ctx.do_plc &&
dec->segment.last_stop < start) { dec->segment.rate > 0.0 && dec->segment.last_stop < start) {
GstBaseAudioDecoderClass *klass; GstBaseAudioDecoderClass *klass;
GstBuffer *buf; GstBuffer *buf;
@ -1785,13 +1793,13 @@ gst_base_audio_decoder_get_property (GObject * object, guint prop_id,
switch (prop_id) { switch (prop_id) {
case PROP_LATENCY: case PROP_LATENCY:
g_value_set_int64 (value, dec->latency); g_value_set_int64 (value, dec->priv->latency);
break; break;
case PROP_TOLERANCE: case PROP_TOLERANCE:
g_value_set_int64 (value, dec->tolerance); g_value_set_int64 (value, dec->priv->tolerance);
break; break;
case PROP_PLC: case PROP_PLC:
g_value_set_boolean (value, dec->plc); g_value_set_boolean (value, dec->priv->plc);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -1809,13 +1817,13 @@ gst_base_audio_decoder_set_property (GObject * object, guint prop_id,
switch (prop_id) { switch (prop_id) {
case PROP_LATENCY: case PROP_LATENCY:
dec->latency = g_value_get_int64 (value); dec->priv->latency = g_value_get_int64 (value);
break; break;
case PROP_TOLERANCE: case PROP_TOLERANCE:
dec->tolerance = g_value_get_int64 (value); dec->priv->tolerance = g_value_get_int64 (value);
break; break;
case PROP_PLC: case PROP_PLC:
dec->plc = g_value_get_boolean (value); dec->priv->plc = g_value_get_boolean (value);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -2076,3 +2084,139 @@ gst_base_audio_decoder_get_parse_state (GstBaseAudioDecoder * dec,
if (eos) if (eos)
*eos = dec->priv->ctx.eos; *eos = dec->priv->ctx.eos;
} }
/**
* gst_base_audio_decoder_set_plc:
* @dec: a #GstBaseAudioDecoder
* @enabled: new state
*
* Enable or disable decoder packet loss concealment, provided subclass
* and codec are capable and allow handling plc.
*
* MT safe.
*
*/
void
gst_base_audio_decoder_set_plc (GstBaseAudioDecoder * dec, gboolean enabled)
{
g_return_if_fail (GST_IS_BASE_AUDIO_DECODER (dec));
GST_LOG_OBJECT (dec, "enabled: %d", enabled);
GST_OBJECT_LOCK (dec);
dec->priv->plc = enabled;
GST_OBJECT_UNLOCK (dec);
}
/**
* gst_base_audio_decoder_get_plc:
* @dec: a #GstBaseAudioDecoder
*
* Queries decoder packet loss concealment handling.
*
* Returns: TRUE if packet loss concealment is enabled.
*
* MT safe.
*/
gboolean
gst_base_audio_decoder_get_plc (GstBaseAudioDecoder * dec)
{
gboolean result;
g_return_val_if_fail (GST_IS_BASE_AUDIO_DECODER (dec), FALSE);
GST_OBJECT_LOCK (dec);
result = dec->priv->plc;
GST_OBJECT_UNLOCK (dec);
return result;
}
/**
* gst_base_audio_decoder_set_min_latency:
* @dec: a #GstBaseAudioDecoder
* @num: new minimum latency
*
* Sets decoder minimum aggregation latency.
*
* MT safe.
*
*/
void
gst_base_audio_decoder_set_min_latency (GstBaseAudioDecoder * dec, gint64 num)
{
g_return_if_fail (GST_IS_BASE_AUDIO_DECODER (dec));
GST_OBJECT_LOCK (dec);
dec->priv->latency = num;
GST_OBJECT_UNLOCK (dec);
}
/**
* gst_base_audio_decoder_get_min_latency:
* @enc: a #GstBaseAudioDecoder
*
* Queries decoder's latency aggregation.
*
* Returns: aggregation latency.
*
* MT safe.
*/
gint64
gst_base_audio_decoder_get_min_latency (GstBaseAudioDecoder * dec)
{
gint64 result;
g_return_val_if_fail (GST_IS_BASE_AUDIO_DECODER (dec), FALSE);
GST_OBJECT_LOCK (dec);
result = dec->priv->latency;
GST_OBJECT_UNLOCK (dec);
return result;
}
/**
* gst_base_audio_decoder_set_tolerance:
* @dec: a #GstBaseAudioDecoder
* @tolerance: new tolerance
*
* Configures decoder audio jitter tolerance threshold.
*
* MT safe.
*
*/
void
gst_base_audio_decoder_set_tolerance (GstBaseAudioDecoder * dec,
gint64 tolerance)
{
g_return_if_fail (GST_IS_BASE_AUDIO_DECODER (dec));
GST_OBJECT_LOCK (dec);
dec->priv->tolerance = tolerance;
GST_OBJECT_UNLOCK (dec);
}
/**
* gst_base_audio_decoder_get_tolerance:
* @dec: a #GstBaseAudioDecoder
*
* Queries current audio jitter tolerance threshold.
*
* Returns: decoder audio jitter tolerance threshold.
*
* MT safe.
*/
gint64
gst_base_audio_decoder_get_tolerance (GstBaseAudioDecoder * dec)
{
gint64 result;
g_return_val_if_fail (GST_IS_BASE_AUDIO_DECODER (dec), 0);
GST_OBJECT_LOCK (dec);
result = dec->priv->tolerance;
GST_OBJECT_UNLOCK (dec);
return result;
}

View file

@ -137,11 +137,6 @@ struct _GstBaseAudioDecoder
/* MT-protected (with STREAM_LOCK) */ /* MT-protected (with STREAM_LOCK) */
GstSegment segment; GstSegment segment;
/* properties */
GstClockTime latency;
GstClockTime tolerance;
gboolean plc;
/*< private >*/ /*< private >*/
GstBaseAudioDecoderPrivate *priv; GstBaseAudioDecoderPrivate *priv;
gpointer _gst_reserved[GST_PADDING_LARGE]; gpointer _gst_reserved[GST_PADDING_LARGE];
@ -218,6 +213,7 @@ struct _GstBaseAudioDecoderClass
GstFlowReturn gst_base_audio_decoder_finish_frame (GstBaseAudioDecoder * dec, GstFlowReturn gst_base_audio_decoder_finish_frame (GstBaseAudioDecoder * dec,
GstBuffer * buf, gint frames); GstBuffer * buf, gint frames);
/* context parameters */
GstAudioFormatInfo *gst_base_audio_decoder_get_info (GstBaseAudioDecoder * dec); GstAudioFormatInfo *gst_base_audio_decoder_get_info (GstBaseAudioDecoder * dec);
void gst_base_audio_decoder_set_plc_aware (GstBaseAudioDecoder * dec, void gst_base_audio_decoder_set_plc_aware (GstBaseAudioDecoder * dec,
@ -242,6 +238,21 @@ void gst_base_audio_decoder_get_latency (GstBaseAudioDecoder * dec,
void gst_base_audio_decoder_get_parse_state (GstBaseAudioDecoder * dec, void gst_base_audio_decoder_get_parse_state (GstBaseAudioDecoder * dec,
gboolean * sync, gboolean * eos); gboolean * sync, gboolean * eos);
/* object properties */
void gst_base_audio_decoder_set_plc (GstBaseAudioDecoder * dec,
gboolean enabled);
gboolean gst_base_audio_decoder_get_plc (GstBaseAudioDecoder * dec);
void gst_base_audio_decoder_set_min_latency (GstBaseAudioDecoder * dec,
gint64 num);
gint64 gst_base_audio_decoder_get_min_latency (GstBaseAudioDecoder * dec);
void gst_base_audio_decoder_set_tolerance (GstBaseAudioDecoder * dec,
gint64 tolerance);
gint64 gst_base_audio_decoder_get_tolerance (GstBaseAudioDecoder * dec);
GType gst_base_audio_decoder_get_type (void); GType gst_base_audio_decoder_get_type (void);
G_END_DECLS G_END_DECLS