baseaudioencoder: Add support for requesting a minimum and maximum number of samples per frame

This extends the special case of a fixed number of samples per frame
that was supported before already.
This commit is contained in:
Sebastian Dröge 2011-08-17 14:28:44 +02:00
parent 1daa53e554
commit d42390efd9
2 changed files with 28 additions and 17 deletions

View file

@ -657,9 +657,11 @@ gst_base_audio_encoder_push_buffers (GstBaseAudioEncoder * enc, gboolean force)
g_assert (priv->offset <= av); g_assert (priv->offset <= av);
av -= priv->offset; av -= priv->offset;
need = ctx->frame_samples > 0 ? ctx->frame_samples * ctx->state.bpf : av; need =
GST_LOG_OBJECT (enc, "available: %d, needed: %d, force: %d", ctx->frame_samples_min >
av, need, force); 0 ? ctx->frame_samples_min * ctx->state.bpf : av;
GST_LOG_OBJECT (enc, "available: %d, needed: %d, force: %d", av, need,
force);
if ((need > av) || !av) { if ((need > av) || !av) {
if (G_UNLIKELY (force)) { if (G_UNLIKELY (force)) {
@ -672,14 +674,19 @@ gst_base_audio_encoder_push_buffers (GstBaseAudioEncoder * enc, gboolean force)
priv->force = FALSE; priv->force = FALSE;
} }
/* if we have some extra metadata, if (ctx->frame_samples_max > 0)
* provide for integer multiple of frames to allow for better granularity need = MIN (av, ctx->frame_samples_max * ctx->state.bpf);
* of processing */
if (ctx->frame_samples > 0 && need) { if (ctx->frame_samples_min == ctx->frame_samples_max) {
if (ctx->frame_max > 1) /* if we have some extra metadata,
need = need * MIN ((av / need), ctx->frame_max); * provide for integer multiple of frames to allow for better granularity
else if (ctx->frame_max == 0) * of processing */
need = need * (av / need); if (ctx->frame_samples_min > 0 && need) {
if (ctx->frame_max > 1)
need = need * MIN ((av / need), ctx->frame_max);
else if (ctx->frame_max == 0)
need = need * (av / need);
}
} }
if (need) { if (need) {
@ -964,7 +971,8 @@ gst_base_audio_encoder_sink_setcaps (GstPad * pad, GstCaps * caps)
gst_base_audio_encoder_drain (enc); gst_base_audio_encoder_drain (enc);
/* context defaults */ /* context defaults */
enc->ctx->frame_samples = 0; enc->ctx->frame_samples_min = 0;
enc->ctx->frame_samples_max = 0;
enc->ctx->frame_max = 0; enc->ctx->frame_max = 0;
enc->ctx->lookahead = 0; enc->ctx->lookahead = 0;

View file

@ -95,10 +95,13 @@ typedef struct _GstBaseAudioEncoderContext GstBaseAudioEncoderContext;
/** /**
* GstBaseAudioEncoderContext: * GstBaseAudioEncoderContext:
* @state: a #GstAudioState describing input audio format * @state: a #GstAudioState describing input audio format
* @frame_samples: number of samples (per channel) subclass needs to be handed, * @frame_samples_min: number of samples (per channel) subclass needs to be handed
* or will be handed all available if 0. * at least, or will be handed all available if 0.
* @frame_max: max number of frames of size @frame_bytes accepted at once * @frame_samples_max: number of samples (per channel) subclass needs to be handed
* (assumed minimally 1) * at most, or will be handed all available if 0.
* @frame_max: max number of frames of size @frame_samples accepted at once
* (assumed minimally 1). Requires @frame_samples_min and @frame_samples_max
* to be the equal.
* @min_latency: min latency of element * @min_latency: min latency of element
* @max_latency: max latency of element * @max_latency: max latency of element
* @lookahead: encoder lookahead (in units of input rate samples) * @lookahead: encoder lookahead (in units of input rate samples)
@ -110,7 +113,7 @@ struct _GstBaseAudioEncoderContext {
GstAudioState state; GstAudioState state;
/* output */ /* output */
gint frame_samples; gint frame_samples_min, frame_samples_max;
gint frame_max; gint frame_max;
gint lookahead; gint lookahead;
/* MT-protected (with LOCK) */ /* MT-protected (with LOCK) */