[FFmpeg-devel] [FFmpeg-cvslog] aacenc: add support for coding of intensity stereo scalefactor indices
James Almer
jamrial at gmail.com
Wed Jul 1 19:02:59 CEST 2015
> ffmpeg | branch: master | Rostislav Pehlivanov <atomnuker at gmail.com> | Fri Jun 26 21:16:34 2015 +0100| [7c10b87b5744179f16411f5981e96738021ec7ca] | committer: Michael Niedermayer
>
> aacenc: add support for coding of intensity stereo scalefactor indices
>
> This commit adds support for the coding of intensity stereo scalefactor indices.
> It does not do any marking of such bands and as such does no functional changes
> to the encoder. It removes any old twoloop specific code for PNS and moves it
> into a seperate function which handles setting of scalefactor indices for
> PNS and IS bands.
>
> Reviewed-by: Claudio Freire <klaussfreire at gmail.com>
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
>
> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=7c10b87b5744179f16411f5981e96738021ec7ca
> ---
>
> libavcodec/aaccoder.c | 37 +++++++++++++++++++++++++++++++++++++
> libavcodec/aacenc.c | 6 +++++-
> 2 files changed, 42 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c
> index 2f99924..cd996b2 100644
> --- a/libavcodec/aaccoder.c
> +++ b/libavcodec/aaccoder.c
> @@ -595,6 +595,43 @@ typedef struct TrellisPath {
> #define TRELLIS_STAGES 121
> #define TRELLIS_STATES (SCALE_MAX_DIFF+1)
>
> +static void set_special_band_scalefactors(AACEncContext *s, SingleChannelElement *sce)
This function is unused and being optimized out with a warning during compilation.
> +{
> + int w, g, start = 0;
> + int minscaler_n = sce->sf_idx[0], minscaler_i = sce->sf_idx[0];
> + int bands = 0;
> +
> + for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
> + start = 0;
> + for (g = 0; g < sce->ics.num_swb; g++) {
> + if (sce->band_type[w*16+g] == INTENSITY_BT || sce->band_type[w*16+g] == INTENSITY_BT2) {
> + sce->sf_idx[w*16+g] = av_clip(ceilf(log2f(sce->is_ener[w*16+g])*2), -155, 100);
> + minscaler_i = FFMIN(minscaler_i, sce->sf_idx[w*16+g]);
> + bands++;
> + } else if (sce->band_type[w*16+g] == NOISE_BT) {
> + sce->sf_idx[w*16+g] = av_clip(4+log2f(sce->pns_ener[w*16+g])*2, -100, 155);
> + minscaler_n = FFMIN(minscaler_n, sce->sf_idx[w*16+g]);
> + bands++;
> + }
> + start += sce->ics.swb_sizes[g];
> + }
> + }
> +
> + if (!bands)
> + return;
> +
> + /* Clip the scalefactor indices */
> + for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
> + for (g = 0; g < sce->ics.num_swb; g++) {
> + if (sce->band_type[w*16+g] == INTENSITY_BT || sce->band_type[w*16+g] == INTENSITY_BT2) {
> + sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler_i, minscaler_i + SCALE_MAX_DIFF);
> + } else if (sce->band_type[w*16+g] == NOISE_BT) {
> + sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler_n, minscaler_n + SCALE_MAX_DIFF);
> + }
> + }
> + }
> +}
> +
> static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s,
> SingleChannelElement *sce,
> const float lambda)
> diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
> index 897c3a1..3a512ff 100644
> --- a/libavcodec/aacenc.c
> +++ b/libavcodec/aacenc.c
> @@ -389,7 +389,7 @@ static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s,
> SingleChannelElement *sce)
> {
> int diff, off_sf = sce->sf_idx[0], off_pns = sce->sf_idx[0] - NOISE_OFFSET;
> - int noise_flag = 1;
> + int off_is = 0, noise_flag = 1;
> int i, w;
>
> for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
> @@ -402,6 +402,10 @@ static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s,
> put_bits(&s->pb, NOISE_PRE_BITS, diff + NOISE_PRE);
> continue;
> }
> + } else if (sce->band_type[w*16 + i] == INTENSITY_BT ||
> + sce->band_type[w*16 + i] == INTENSITY_BT2) {
> + diff = sce->sf_idx[w*16 + i] - off_is;
> + off_is = sce->sf_idx[w*16 + i];
> } else {
> diff = sce->sf_idx[w*16 + i] - off_sf;
> off_sf = sce->sf_idx[w*16 + i];
More information about the ffmpeg-devel
mailing list