[FFmpeg-devel] [PATCH 07/11] aacenc: add support for coding of IS spectral coefficients

Claudio Freire klaussfreire at gmail.com
Tue Jun 30 15:55:45 CEST 2015


LGTM, but it cannot be committed without the others, or a memset to
zero of is_mask somewhere at the beginning of each frame (or encoder
init).

On Fri, Jun 26, 2015 at 5:16 PM, Rostislav Pehlivanov
<atomnuker at gmail.com> wrote:
> This commit adds support for the coding of intensity stereo spectral coefficients. It also fixes the Mid/Side coding of band_types higher than RESERVED_BT (M/S must not be applied to their spectral coefficients, but marking M/S as present in encode_ms_info() is okay). Much of the changes here were taken from the decoder and inverted. This commit does not change the functionality of the decoder.
> ---
>  libavcodec/aacenc.c | 39 +++++++++++++++++++++++++++++----------
>  1 file changed, 29 insertions(+), 10 deletions(-)
>
> diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
> index 3a512ff..a2ff04f 100644
> --- a/libavcodec/aacenc.c
> +++ b/libavcodec/aacenc.c
> @@ -312,19 +312,28 @@ static void encode_ms_info(PutBitContext *pb, ChannelElement *cpe)
>  static void adjust_frame_information(ChannelElement *cpe, int chans)
>  {
>      int i, w, w2, g, ch;
> -    int start, maxsfb, cmaxsfb;
> +    int maxsfb, cmaxsfb;
> +    IndividualChannelStream *ics;
>
> -    for (ch = 0; ch < chans; ch++) {
> -        IndividualChannelStream *ics = &cpe->ch[ch].ics;
> -        start = 0;
> -        maxsfb = 0;
> -        cpe->ch[ch].pulse.num_pulse = 0;
> +    if (cpe->common_window) {
> +        ics = &cpe->ch[0].ics;
>          for (w = 0; w < ics->num_windows; w += ics->group_len[w]) {
> -            for (w2 = 0; w2 < ics->group_len[w]; w2++) {
> -                start = (w+w2) * 128;
> +            for (w2 =  0; w2 < ics->group_len[w]; w2++) {
> +                int start = (w+w2) * 128;
>                  for (g = 0; g < ics->num_swb; g++) {
> -                    //apply M/S
> -                    if (cpe->common_window && !ch && cpe->ms_mask[w*16 + g]) {
> +                    //apply Intensity stereo coeffs transformation
> +                    if (cpe->is_mask[w*16 + g]) {
> +                        int p = -1 + 2 * (cpe->ch[1].band_type[w*16+g] - 14);
> +                        float scale = sqrtf(cpe->ch[0].is_ener[w*16+g]*cpe->ch[1].is_ener[w*16+g]);
> +                        if (cpe->ms_mask[w*16 + g])
> +                            p *= 1 - 2 * cpe->ms_mask[w*16 + g];
> +                        for (i = 0; i < ics->swb_sizes[g]; i++) {
> +                            cpe->ch[0].coeffs[start+i] = (cpe->ch[0].pcoeffs[start+i] + p*cpe->ch[1].pcoeffs[start+i]) * scale;
> +                            cpe->ch[1].coeffs[start+i] = 0.0f;
> +                        }
> +                    } else if (cpe->ms_mask[w*16 + g] &&
> +                               cpe->ch[0].band_type[w*16 + g] < NOISE_BT &&
> +                               cpe->ch[1].band_type[w*16 + g] < NOISE_BT) {
>                          for (i = 0; i < ics->swb_sizes[g]; i++) {
>                              cpe->ch[0].coeffs[start+i] = (cpe->ch[0].pcoeffs[start+i] + cpe->ch[1].pcoeffs[start+i]) * 0.5f;
>                              cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].pcoeffs[start+i];
> @@ -332,6 +341,16 @@ static void adjust_frame_information(ChannelElement *cpe, int chans)
>                      }
>                      start += ics->swb_sizes[g];
>                  }
> +            }
> +        }
> +    }
> +
> +    for (ch = 0; ch < chans; ch++) {
> +        IndividualChannelStream *ics = &cpe->ch[ch].ics;
> +        maxsfb = 0;
> +        cpe->ch[ch].pulse.num_pulse = 0;
> +        for (w = 0; w < ics->num_windows; w += ics->group_len[w]) {
> +            for (w2 =  0; w2 < ics->group_len[w]; w2++) {
>                  for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w*16+cmaxsfb-1]; cmaxsfb--)
>                      ;
>                  maxsfb = FFMAX(maxsfb, cmaxsfb);
> --
> 2.1.4
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


More information about the ffmpeg-devel mailing list