avcodec/aacdec: PredictorState array out of SingleChannelElement
sizeof(PredictorState) is different for the floating-point and the fixed-point AAC decoders; this is an obstacle for deduplicating code between these decoders. So don't include this array in SingleChannelElement, instead add a union of pointers to the fixed-point PredictorState and the floating-point PredictorState. The actual arrays are part of the extended ChannelElement to be allocated by ff_aac_sbr_ctx_alloc_init(); it also sets the pointers. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
8b2261e573
commit
fc3c2ea8dc
@ -30,9 +30,6 @@
|
|||||||
#ifndef AVCODEC_AAC_H
|
#ifndef AVCODEC_AAC_H
|
||||||
#define AVCODEC_AAC_H
|
#define AVCODEC_AAC_H
|
||||||
|
|
||||||
|
|
||||||
#include "aac_defines.h"
|
|
||||||
|
|
||||||
#define MAX_CHANNELS 64
|
#define MAX_CHANNELS 64
|
||||||
#define MAX_ELEM_ID 16
|
#define MAX_ELEM_ID 16
|
||||||
|
|
||||||
@ -85,20 +82,6 @@ enum ChannelPosition {
|
|||||||
AAC_CHANNEL_CC = 5,
|
AAC_CHANNEL_CC = 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Predictor State
|
|
||||||
*/
|
|
||||||
typedef struct PredictorState {
|
|
||||||
AAC_FLOAT cor0;
|
|
||||||
AAC_FLOAT cor1;
|
|
||||||
AAC_FLOAT var0;
|
|
||||||
AAC_FLOAT var1;
|
|
||||||
AAC_FLOAT r0;
|
|
||||||
AAC_FLOAT r1;
|
|
||||||
AAC_FLOAT k1;
|
|
||||||
AAC_FLOAT x_est;
|
|
||||||
} PredictorState;
|
|
||||||
|
|
||||||
#define MAX_PREDICTORS 672
|
#define MAX_PREDICTORS 672
|
||||||
|
|
||||||
#define SCALE_DIV_512 36 ///< scalefactor difference that corresponds to scale difference in 512 times
|
#define SCALE_DIV_512 36 ///< scalefactor difference that corresponds to scale difference in 512 times
|
||||||
|
|||||||
@ -72,6 +72,20 @@ typedef int AAC_SIGNE;
|
|||||||
0x40000000) >> 31)
|
0x40000000) >> 31)
|
||||||
#define AAC_HALF_SUM(x, y) (((x) >> 1) + ((y) >> 1))
|
#define AAC_HALF_SUM(x, y) (((x) >> 1) + ((y) >> 1))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Predictor State
|
||||||
|
*/
|
||||||
|
typedef struct PredictorStateFixed {
|
||||||
|
SoftFloat cor0;
|
||||||
|
SoftFloat cor1;
|
||||||
|
SoftFloat var0;
|
||||||
|
SoftFloat var1;
|
||||||
|
SoftFloat r0;
|
||||||
|
SoftFloat r1;
|
||||||
|
SoftFloat k1;
|
||||||
|
SoftFloat x_est;
|
||||||
|
} PredictorState;
|
||||||
|
|
||||||
#ifdef LPC_USE_FIXED
|
#ifdef LPC_USE_FIXED
|
||||||
#error aac_defines.h must be included before lpc_functions.h for fixed point decoder
|
#error aac_defines.h must be included before lpc_functions.h for fixed point decoder
|
||||||
#endif
|
#endif
|
||||||
@ -112,6 +126,20 @@ typedef unsigned AAC_SIGNE;
|
|||||||
#define AAC_MSUB31_V3(x, y, z) ((x) - (y)) * (z)
|
#define AAC_MSUB31_V3(x, y, z) ((x) - (y)) * (z)
|
||||||
#define AAC_HALF_SUM(x, y) ((x) + (y)) * 0.5f
|
#define AAC_HALF_SUM(x, y) ((x) + (y)) * 0.5f
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Predictor State
|
||||||
|
*/
|
||||||
|
typedef struct PredictorState {
|
||||||
|
float cor0;
|
||||||
|
float cor1;
|
||||||
|
float var0;
|
||||||
|
float var1;
|
||||||
|
float r0;
|
||||||
|
float r1;
|
||||||
|
float k1;
|
||||||
|
float x_est;
|
||||||
|
} PredictorState;
|
||||||
|
|
||||||
#endif /* USE_FIXED */
|
#endif /* USE_FIXED */
|
||||||
|
|
||||||
#endif /* AVCODEC_AAC_DEFINES_H */
|
#endif /* AVCODEC_AAC_DEFINES_H */
|
||||||
|
|||||||
@ -140,7 +140,10 @@ typedef struct SingleChannelElement {
|
|||||||
DECLARE_ALIGNED(32, INTFLOAT, saved)[1536]; ///< overlap
|
DECLARE_ALIGNED(32, INTFLOAT, saved)[1536]; ///< overlap
|
||||||
DECLARE_ALIGNED(32, INTFLOAT, ret_buf)[2048]; ///< PCM output buffer
|
DECLARE_ALIGNED(32, INTFLOAT, ret_buf)[2048]; ///< PCM output buffer
|
||||||
DECLARE_ALIGNED(16, INTFLOAT, ltp_state)[3072]; ///< time signal for LTP
|
DECLARE_ALIGNED(16, INTFLOAT, ltp_state)[3072]; ///< time signal for LTP
|
||||||
PredictorState predictor_state[MAX_PREDICTORS];
|
union {
|
||||||
|
struct PredictorStateFixed *RENAME_FIXED(predictor_state);
|
||||||
|
struct PredictorState *predictor_state;
|
||||||
|
};
|
||||||
INTFLOAT *ret; ///< PCM output
|
INTFLOAT *ret; ///< PCM output
|
||||||
} SingleChannelElement;
|
} SingleChannelElement;
|
||||||
|
|
||||||
|
|||||||
@ -1942,7 +1942,7 @@ static void apply_prediction(AACDecContext *ac, SingleChannelElement *sce)
|
|||||||
int sfb, k;
|
int sfb, k;
|
||||||
|
|
||||||
if (!sce->ics.predictor_initialized) {
|
if (!sce->ics.predictor_initialized) {
|
||||||
reset_all_predictors(sce->predictor_state);
|
reset_all_predictors(sce->AAC_RENAME(predictor_state));
|
||||||
sce->ics.predictor_initialized = 1;
|
sce->ics.predictor_initialized = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1953,16 +1953,16 @@ static void apply_prediction(AACDecContext *ac, SingleChannelElement *sce)
|
|||||||
for (k = sce->ics.swb_offset[sfb];
|
for (k = sce->ics.swb_offset[sfb];
|
||||||
k < sce->ics.swb_offset[sfb + 1];
|
k < sce->ics.swb_offset[sfb + 1];
|
||||||
k++) {
|
k++) {
|
||||||
predict(&sce->predictor_state[k], &sce->coeffs[k],
|
predict(&sce->AAC_RENAME(predictor_state)[k], &sce->coeffs[k],
|
||||||
sce->ics.predictor_present &&
|
sce->ics.predictor_present &&
|
||||||
sce->ics.prediction_used[sfb]);
|
sce->ics.prediction_used[sfb]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sce->ics.predictor_reset_group)
|
if (sce->ics.predictor_reset_group)
|
||||||
reset_predictor_group(sce->predictor_state,
|
reset_predictor_group(sce->AAC_RENAME(predictor_state),
|
||||||
sce->ics.predictor_reset_group);
|
sce->ics.predictor_reset_group);
|
||||||
} else
|
} else
|
||||||
reset_all_predictors(sce->predictor_state);
|
reset_all_predictors(sce->AAC_RENAME(predictor_state));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void decode_gain_control(SingleChannelElement * sce, GetBitContext * gb)
|
static void decode_gain_control(SingleChannelElement * sce, GetBitContext * gb)
|
||||||
|
|||||||
@ -49,6 +49,20 @@ typedef enum AACCoder {
|
|||||||
AAC_CODER_NB,
|
AAC_CODER_NB,
|
||||||
}AACCoder;
|
}AACCoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Predictor State
|
||||||
|
*/
|
||||||
|
typedef struct PredictorState {
|
||||||
|
float cor0;
|
||||||
|
float cor1;
|
||||||
|
float var0;
|
||||||
|
float var1;
|
||||||
|
float r0;
|
||||||
|
float r1;
|
||||||
|
float k1;
|
||||||
|
float x_est;
|
||||||
|
} PredictorState;
|
||||||
|
|
||||||
typedef struct AACEncOptions {
|
typedef struct AACEncOptions {
|
||||||
int coder;
|
int coder;
|
||||||
int pns;
|
int pns;
|
||||||
|
|||||||
@ -40,6 +40,7 @@
|
|||||||
|
|
||||||
typedef struct ExtChannelElement {
|
typedef struct ExtChannelElement {
|
||||||
ChannelElement ch;
|
ChannelElement ch;
|
||||||
|
PredictorState predictor_state[2][MAX_PREDICTORS];
|
||||||
SpectralBandReplication sbr;
|
SpectralBandReplication sbr;
|
||||||
} ExtChannelElement;
|
} ExtChannelElement;
|
||||||
|
|
||||||
@ -87,6 +88,8 @@ av_cold int AAC_RENAME(ff_aac_sbr_ctx_alloc_init)(AACDecContext *ac,
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
*che = &ext->ch;
|
*che = &ext->ch;
|
||||||
sbr = &ext->sbr;
|
sbr = &ext->sbr;
|
||||||
|
ext->ch.ch[0].AAC_RENAME(predictor_state) = ext->predictor_state[0];
|
||||||
|
ext->ch.ch[1].AAC_RENAME(predictor_state) = ext->predictor_state[1];
|
||||||
|
|
||||||
sbr->kx[0] = sbr->kx[1];
|
sbr->kx[0] = sbr->kx[1];
|
||||||
sbr->id_aac = id_aac;
|
sbr->id_aac = id_aac;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user