[FFmpeg-devel] [PATCH] Implement AAC Long Term Prediction (LTP) decoding module
Young Han Lee
cpumaker
Sun Jan 30 00:53:54 CET 2011
On Sun, Jan 30, 2011 at 3:53 AM, Diego Biurrun <diego at biurrun.de> wrote:
> On Sun, Jan 30, 2011 at 12:33:37AM +0900, Young Han Lee wrote:
> >
> > Based on SoC repo., the ltp module is implemented at the AAC decoder.
> > This is my first patch.
> > Any comments are welcome.
>
> You will soon here from the local AAC experts, just some small comments,
> mostly style nits, from me. You should follow the (K&R) style of the file,
> 4 spaces indentation, no tabs.
>
> > --- a/libavcodec/aacdec.c
> > +++ b/libavcodec/aacdec.c
> > @@ -629,6 +631,25 @@ static int decode_prediction(AACContext *ac,
> IndividualChannelStream *ics,
> >
> > /**
> > + * Decode Long Term Prediction data; reference: table 4.xx.
> > + *
> > + * @return void
> > + */
>
> void functions return nothing, drop the @return.
>
> > +static void decode_ltp(AACContext * ac, LongTermPrediction * ltp,
> GetBitContext * gb, uint8_t max_sfb) {
>
> Leave out the space between pointer * and variable name, break this long
> line and place the { on the next line for function declarations, i.e.
>
> static void decode_ltp(AACContext *ac, LongTermPrediction *ltp,
> GetBitContext *gb, uint8_t max_sfb)
> {
>
> The pointer * should be
> > + int sfb;
> > + if (ac->m4ac.object_type == AOT_ER_AAC_LD) {
> > + av_log(ac->avctx, AV_LOG_ERROR, "LTP is not supported in ER
> AAC LD .\n");
> > + } else {
> > + ltp->lag = get_bits(gb, 11);
> > + ltp->coef = ltp_coef[get_bits(gb, 3)] * ac->sf_scale;
> > + for (sfb = 0; sfb < FFMIN(max_sfb, MAX_LTP_LONG_SFB);
> sfb++) {
> > + ltp->used[sfb] = get_bits1(gb);
> > + }
> > + }
> > +}
>
> Indent with 4 spaces, not with tabs, extra good karma for aligning the
> '=' in the struct member assignments.
>
> > @@ -1682,14 +1707,89 @@ static void apply_tns(float coef[1024],
> TemporalNoiseShaping *tns,
> >
> > + if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE) {
> > + float x_est[2048], X_est[1024];
> > + int16_t num_samples = 2048;
> > + if ( ltp->lag < 1024)
>
> Drop the space after the '('.
>
> > + if(sce->tns.present)
>
> if (
>
> > @@ -1855,6 +1967,14 @@ static void spectral_to_sample(AACContext *ac)
> > if (che) {
> > if (type <= TYPE_CPE)
> > apply_channel_coupling(ac, che, type, i, BEFORE_TNS,
> apply_dependent_coupling);
> > + if (che->ch[0].ics.predictor_present) {
> > + if (ac->m4ac.object_type == AOT_AAC_LTP) {
> > + if(che->ch[0].ics.ltp.present)
> > + apply_ltp(ac, &che->ch[0]);
> > + if(type == TYPE_CPE &&
> che->ch[1].ics.ltp.present)
> > + apply_ltp(ac, &che->ch[1]);
>
> if (
>
> > --- a/libavcodec/aacdectab.h
> > +++ b/libavcodec/aacdectab.h
> > @@ -35,6 +35,15 @@
> >
> > +/* @name ltp_coef
> > + * Table of the LTP coefficient (multiplied by 2)
> > + * @{
> > + */
> > +static const float ltp_coef[8] = {
> > + 1.141658, 1.393232, 1.626008, 1.822608,
> > + 1.969800, 2.135788, 2.2389202, 2.739066,
> > +};
>
> The @{ looks wrong without a closing @}. It would also be interesting
> to know why you multiply by 2, not just that you have done it.
>
The reason about multiplying by 2 is for scaling of local MDCT coefficients.
I didn't check inside MDCT in the code but the MDCT result was scaled
comparing with the reference software.
So I up-scale the ltp coefficients and the decoding outputs look good.
It can be applied at the decoding module (decode_ltp) if it should be
> Diego
>
Thank you for comments.
I update the patch following the style.
If you find any mistakes again, please let me know to fix them
Young Han
-------------- next part --------------
A non-text attachment was scrubbed...
Name: AAC_DEC_LTP-002.patch
Type: text/x-patch
Size: 13978 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20110130/eeabe8ae/attachment.bin>
More information about the ffmpeg-devel
mailing list