|
|
@@ -80,6 +80,8 @@
|
|
|
#define PSY_3GPP_AH_THR_LONG 0.5f
|
|
|
#define PSY_3GPP_AH_THR_SHORT 0.63f
|
|
|
|
|
|
+#define PSY_PE_FORGET_SLOPE 511
|
|
|
+
|
|
|
enum {
|
|
|
PSY_3GPP_AH_NONE,
|
|
|
PSY_3GPP_AH_INACTIVE,
|
|
|
@@ -495,7 +497,7 @@ static int calc_bit_demand(AacPsyContext *ctx, float pe, int bits, int size,
|
|
|
const float bitspend_add = short_window ? PSY_3GPP_SPEND_ADD_S : PSY_3GPP_SPEND_ADD_L;
|
|
|
const float clip_low = short_window ? PSY_3GPP_CLIP_LO_S : PSY_3GPP_CLIP_LO_L;
|
|
|
const float clip_high = short_window ? PSY_3GPP_CLIP_HI_S : PSY_3GPP_CLIP_HI_L;
|
|
|
- float clipped_pe, bit_save, bit_spend, bit_factor, fill_level;
|
|
|
+ float clipped_pe, bit_save, bit_spend, bit_factor, fill_level, forgetful_min_pe;
|
|
|
|
|
|
ctx->fill_level += ctx->frame_bits - bits;
|
|
|
ctx->fill_level = av_clip(ctx->fill_level, 0, size);
|
|
|
@@ -512,9 +514,14 @@ static int calc_bit_demand(AacPsyContext *ctx, float pe, int bits, int size,
|
|
|
* Hopefully below is correct.
|
|
|
*/
|
|
|
bit_factor = 1.0f - bit_save + ((bit_spend - bit_save) / (ctx->pe.max - ctx->pe.min)) * (clipped_pe - ctx->pe.min);
|
|
|
- /* NOTE: The reference encoder attempts to center pe max/min around the current pe. */
|
|
|
+ /* NOTE: The reference encoder attempts to center pe max/min around the current pe.
|
|
|
+ * Here we do that by slowly forgetting pe.min when pe stays in a range that makes
|
|
|
+ * it unlikely (ie: above the mean)
|
|
|
+ */
|
|
|
ctx->pe.max = FFMAX(pe, ctx->pe.max);
|
|
|
- ctx->pe.min = FFMIN(pe, ctx->pe.min);
|
|
|
+ forgetful_min_pe = ((ctx->pe.min * PSY_PE_FORGET_SLOPE)
|
|
|
+ + FFMAX(ctx->pe.min, pe * (pe / ctx->pe.max))) / (PSY_PE_FORGET_SLOPE + 1);
|
|
|
+ ctx->pe.min = FFMIN(pe, forgetful_min_pe);
|
|
|
|
|
|
/* NOTE: allocate a minimum of 1/8th average frame bits, to avoid
|
|
|
* reservoir starvation from producing zero-bit frames
|