baseaudioencoder: move properties to private storage and add

_get/_set
This commit is contained in:
Mark Nauwelaerts 2011-08-16 18:59:13 +02:00 committed by Tim-Philipp Müller
parent 41a0d6f8f0
commit a39a66dd4b
2 changed files with 231 additions and 24 deletions

View file

@ -231,6 +231,12 @@ struct _GstBaseAudioEncoderPrivate
/* context storage */ /* context storage */
GstBaseAudioEncoderContext ctx; GstBaseAudioEncoderContext ctx;
/* properties */
gint64 tolerance;
gboolean perfect_ts;
gboolean hard_resync;
gboolean granule;
}; };
@ -385,9 +391,10 @@ gst_base_audio_encoder_init (GstBaseAudioEncoder * enc,
enc->priv->adapter = gst_adapter_new (); enc->priv->adapter = gst_adapter_new ();
/* property default */ /* property default */
enc->perfect_ts = DEFAULT_PERFECT_TS; enc->priv->granule = DEFAULT_GRANULE;
enc->hard_resync = DEFAULT_HARD_RESYNC; enc->priv->perfect_ts = DEFAULT_PERFECT_TS;
enc->tolerance = DEFAULT_TOLERANCE; enc->priv->hard_resync = DEFAULT_HARD_RESYNC;
enc->priv->tolerance = DEFAULT_TOLERANCE;
/* init state */ /* init state */
gst_base_audio_encoder_reset (enc, TRUE); gst_base_audio_encoder_reset (enc, TRUE);
@ -485,7 +492,7 @@ gst_base_audio_encoder_finish_frame (GstBaseAudioEncoder * enc, GstBuffer * buf,
if (G_LIKELY (samples)) { if (G_LIKELY (samples)) {
/* track upstream ts if so configured */ /* track upstream ts if so configured */
if (!enc->perfect_ts) { if (!enc->priv->perfect_ts) {
guint64 ts, distance; guint64 ts, distance;
ts = gst_adapter_prev_timestamp (priv->adapter, &distance); ts = gst_adapter_prev_timestamp (priv->adapter, &distance);
@ -509,7 +516,8 @@ gst_base_audio_encoder_finish_frame (GstBaseAudioEncoder * enc, GstBuffer * buf,
diff = GST_CLOCK_DIFF (next_ts, old_ts); diff = GST_CLOCK_DIFF (next_ts, old_ts);
GST_LOG_OBJECT (enc, "ts diff %d ms", (gint) (diff / GST_MSECOND)); GST_LOG_OBJECT (enc, "ts diff %d ms", (gint) (diff / GST_MSECOND));
/* only mark discontinuity if beyond tolerance */ /* only mark discontinuity if beyond tolerance */
if (G_UNLIKELY (diff < -enc->tolerance || diff > enc->tolerance)) { if (G_UNLIKELY (diff < -enc->priv->tolerance ||
diff > enc->priv->tolerance)) {
GST_DEBUG_OBJECT (enc, "marked discont"); GST_DEBUG_OBJECT (enc, "marked discont");
priv->discont = TRUE; priv->discont = TRUE;
} }
@ -738,7 +746,7 @@ gst_base_audio_encoder_set_base_gp (GstBaseAudioEncoder * enc)
{ {
GstClockTime ts; GstClockTime ts;
if (!enc->granule) if (!enc->priv->granule)
return; return;
/* use running time for granule */ /* use running time for granule */
@ -840,7 +848,7 @@ gst_base_audio_encoder_chain (GstPad * pad, GstBuffer * buffer)
/* check for continuity; /* check for continuity;
* checked elsewhere in non-perfect case */ * checked elsewhere in non-perfect case */
if (enc->perfect_ts) { if (enc->priv->perfect_ts) {
GstClockTimeDiff diff = 0; GstClockTimeDiff diff = 0;
GstClockTime next_ts = 0; GstClockTime next_ts = 0;
@ -861,14 +869,15 @@ gst_base_audio_encoder_chain (GstPad * pad, GstBuffer * buffer)
/* 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 clip or resync to ts */ * otherwise clip or resync to ts */
if (G_UNLIKELY (diff < -enc->tolerance || diff > enc->tolerance)) { if (G_UNLIKELY (diff < -enc->priv->tolerance ||
diff > enc->priv->tolerance)) {
GST_DEBUG_OBJECT (enc, "marked discont"); GST_DEBUG_OBJECT (enc, "marked discont");
discont = TRUE; discont = TRUE;
} }
} }
/* do some fancy tweaking in hard resync case */ /* do some fancy tweaking in hard resync case */
if (discont && enc->hard_resync) { if (discont && enc->priv->hard_resync) {
if (diff < 0) { if (diff < 0) {
guint64 diff_bytes; guint64 diff_bytes;
@ -1370,16 +1379,16 @@ gst_base_audio_encoder_set_property (GObject * object, guint prop_id,
switch (prop_id) { switch (prop_id) {
case PROP_PERFECT_TS: case PROP_PERFECT_TS:
if (enc->granule && !g_value_get_boolean (value)) if (enc->priv->granule && !g_value_get_boolean (value))
GST_WARNING_OBJECT (enc, "perfect-ts can not be set FALSE"); GST_WARNING_OBJECT (enc, "perfect-ts can not be set FALSE");
else else
enc->perfect_ts = g_value_get_boolean (value); enc->priv->perfect_ts = g_value_get_boolean (value);
break; break;
case PROP_HARD_RESYNC: case PROP_HARD_RESYNC:
enc->hard_resync = g_value_get_boolean (value); enc->priv->hard_resync = g_value_get_boolean (value);
break; break;
case PROP_TOLERANCE: case PROP_TOLERANCE:
enc->tolerance = g_value_get_int64 (value); enc->priv->tolerance = g_value_get_int64 (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);
@ -1397,16 +1406,16 @@ gst_base_audio_encoder_get_property (GObject * object, guint prop_id,
switch (prop_id) { switch (prop_id) {
case PROP_PERFECT_TS: case PROP_PERFECT_TS:
g_value_set_boolean (value, enc->perfect_ts); g_value_set_boolean (value, enc->priv->perfect_ts);
break; break;
case PROP_GRANULE: case PROP_GRANULE:
g_value_set_boolean (value, enc->granule); g_value_set_boolean (value, enc->priv->granule);
break; break;
case PROP_HARD_RESYNC: case PROP_HARD_RESYNC:
g_value_set_boolean (value, enc->hard_resync); g_value_set_boolean (value, enc->priv->hard_resync);
break; break;
case PROP_TOLERANCE: case PROP_TOLERANCE:
g_value_set_int64 (value, enc->tolerance); g_value_set_int64 (value, enc->priv->tolerance);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -1422,7 +1431,7 @@ gst_base_audio_encoder_activate (GstBaseAudioEncoder * enc, gboolean active)
klass = GST_BASE_AUDIO_ENCODER_GET_CLASS (enc); klass = GST_BASE_AUDIO_ENCODER_GET_CLASS (enc);
g_return_val_if_fail (!enc->granule || enc->perfect_ts, FALSE); g_return_val_if_fail (!enc->priv->granule || enc->priv->perfect_ts, FALSE);
GST_DEBUG_OBJECT (enc, "activate %d", active); GST_DEBUG_OBJECT (enc, "activate %d", active);
@ -1610,3 +1619,189 @@ gst_base_audio_encoder_get_latency (GstBaseAudioEncoder * enc,
*max = enc->priv->ctx.max_latency; *max = enc->priv->ctx.max_latency;
GST_OBJECT_UNLOCK (enc); GST_OBJECT_UNLOCK (enc);
} }
/**
* gst_base_audio_encoder_set_mark_granule:
* @enc: a #GstBaseAudioEncoder
* @enabled: new state
*
* Enable or disable encoder granule handling.
*
* MT safe.
*
*/
void
gst_base_audio_encoder_set_mark_granule (GstBaseAudioEncoder * enc,
gboolean enabled)
{
g_return_if_fail (GST_IS_BASE_AUDIO_ENCODER (enc));
GST_LOG_OBJECT (enc, "enabled: %d", enabled);
GST_OBJECT_LOCK (enc);
enc->priv->granule = enabled;
GST_OBJECT_UNLOCK (enc);
}
/**
* gst_base_audio_encoder_get_mark_granule:
* @enc: a #GstBaseAudioEncoder
*
* Queries if the encoder will handle granule marking.
*
* Returns: TRUE if granule marking is enabled.
*
* MT safe.
*/
gboolean
gst_base_audio_encoder_get_mark_granule (GstBaseAudioEncoder * enc)
{
gboolean result;
g_return_val_if_fail (GST_IS_BASE_AUDIO_ENCODER (enc), FALSE);
GST_OBJECT_LOCK (enc);
result = enc->priv->granule;
GST_OBJECT_UNLOCK (enc);
return result;
}
/**
* gst_base_audio_encoder_set_perfect_timestamp:
* @enc: a #GstBaseAudioEncoder
* @enabled: new state
*
* Enable or disable encoder perfect output timestamp preference.
*
* MT safe.
*
*/
void
gst_base_audio_encoder_set_perfect_timestamp (GstBaseAudioEncoder * enc,
gboolean enabled)
{
g_return_if_fail (GST_IS_BASE_AUDIO_ENCODER (enc));
GST_LOG_OBJECT (enc, "enabled: %d", enabled);
GST_OBJECT_LOCK (enc);
enc->priv->perfect_ts = enabled;
GST_OBJECT_UNLOCK (enc);
}
/**
* gst_base_audio_encoder_get_perfect_timestamp:
* @enc: a #GstBaseAudioEncoder
*
* Queries encoder perfect timestamp behaviour.
*
* Returns: TRUE if pefect timestamp setting enabled.
*
* MT safe.
*/
gboolean
gst_base_audio_encoder_get_perfect_timestamp (GstBaseAudioEncoder * enc)
{
gboolean result;
g_return_val_if_fail (GST_IS_BASE_AUDIO_ENCODER (enc), FALSE);
GST_OBJECT_LOCK (enc);
result = enc->priv->perfect_ts;
GST_OBJECT_UNLOCK (enc);
return result;
}
/**
* gst_base_audio_encoder_set_hard_sync:
* @enc: a #GstBaseAudioEncoder
* @enabled: new state
*
* Sets encoder hard resync handling.
*
* MT safe.
*
*/
void
gst_base_audio_encoder_set_hard_resync (GstBaseAudioEncoder * enc,
gboolean enabled)
{
g_return_if_fail (GST_IS_BASE_AUDIO_ENCODER (enc));
GST_LOG_OBJECT (enc, "enabled: %d", enabled);
GST_OBJECT_LOCK (enc);
enc->priv->hard_resync = enabled;
GST_OBJECT_UNLOCK (enc);
}
/**
* gst_base_audio_encoder_get_hard_sync:
* @enc: a #GstBaseAudioEncoder
*
* Queries encoder's hard resync setting.
*
* Returns: TRUE if hard resync is enabled.
*
* MT safe.
*/
gboolean
gst_base_audio_encoder_get_hard_resync (GstBaseAudioEncoder * enc)
{
gboolean result;
g_return_val_if_fail (GST_IS_BASE_AUDIO_ENCODER (enc), FALSE);
GST_OBJECT_LOCK (enc);
result = enc->priv->hard_resync;
GST_OBJECT_UNLOCK (enc);
return result;
}
/**
* gst_base_audio_encoder_set_tolerance:
* @enc: a #GstBaseAudioEncoder
* @tolerance: new tolerance
*
* Configures encoder audio jitter tolerance threshold.
*
* MT safe.
*
*/
void
gst_base_audio_encoder_set_tolerance (GstBaseAudioEncoder * enc,
gint64 tolerance)
{
g_return_if_fail (GST_IS_BASE_AUDIO_ENCODER (enc));
GST_OBJECT_LOCK (enc);
enc->priv->tolerance = tolerance;
GST_OBJECT_UNLOCK (enc);
}
/**
* gst_base_audio_encoder_get_tolerance:
* @enc: a #GstBaseAudioEncoder
*
* Queries current audio jitter tolerance threshold.
*
* Returns: encoder audio jitter tolerance threshold.
*
* MT safe.
*/
gint64
gst_base_audio_encoder_get_tolerance (GstBaseAudioEncoder * enc)
{
gint64 result;
g_return_val_if_fail (GST_IS_BASE_AUDIO_ENCODER (enc), 0);
GST_OBJECT_LOCK (enc);
result = enc->priv->tolerance;
GST_OBJECT_UNLOCK (enc);
return result;
}

View file

@ -106,12 +106,6 @@ struct _GstBaseAudioEncoder {
/* MT-protected (with STREAM_LOCK) */ /* MT-protected (with STREAM_LOCK) */
GstSegment segment; GstSegment segment;
/* properties */
gint64 tolerance;
gboolean perfect_ts;
gboolean hard_resync;
gboolean granule;
/*< private >*/ /*< private >*/
GstBaseAudioEncoderPrivate *priv; GstBaseAudioEncoderPrivate *priv;
gpointer _gst_reserved[GST_PADDING_LARGE]; gpointer _gst_reserved[GST_PADDING_LARGE];
@ -192,6 +186,7 @@ GstCaps * gst_base_audio_encoder_proxy_getcaps (GstBaseAudioEncoder * enc,
GstCaps * caps); GstCaps * caps);
/* context parameters */
GstAudioFormatInfo * gst_base_audio_encoder_get_info (GstBaseAudioEncoder * enc); GstAudioFormatInfo * gst_base_audio_encoder_get_info (GstBaseAudioEncoder * enc);
gint gst_base_audio_encoder_get_frame_samples (GstBaseAudioEncoder * enc); gint gst_base_audio_encoder_get_frame_samples (GstBaseAudioEncoder * enc);
@ -211,6 +206,23 @@ void gst_base_audio_encoder_get_latency (GstBaseAudioEncoder * enc,
void gst_base_audio_encoder_set_latency (GstBaseAudioEncoder * enc, void gst_base_audio_encoder_set_latency (GstBaseAudioEncoder * enc,
GstClockTime min, GstClockTime max); GstClockTime min, GstClockTime max);
/* object properties */
void gst_base_audio_encoder_set_mark_granule (GstBaseAudioEncoder * enc,
gboolean enabled);
gboolean gst_base_audio_encoder_get_mark_granule (GstBaseAudioEncoder * enc);
void gst_base_audio_encoder_set_perfect_timestamp (GstBaseAudioEncoder * enc,
gboolean enabled);
gboolean gst_base_audio_encoder_get_perfect_timestamp (GstBaseAudioEncoder * enc);
void gst_base_audio_encoder_set_hard_resync (GstBaseAudioEncoder * enc,
gboolean enabled);
gboolean gst_base_audio_encoder_get_hard_resync (GstBaseAudioEncoder * enc);
void gst_base_audio_encoder_set_tolerance (GstBaseAudioEncoder * enc,
gint64 tolerance);
gint64 gst_base_audio_encoder_get_tolerance (GstBaseAudioEncoder * enc);
G_END_DECLS G_END_DECLS
#endif /* __GST_BASE_AUDIO_ENCODER_H__ */ #endif /* __GST_BASE_AUDIO_ENCODER_H__ */