FFmpeg
aacenc_is.c
Go to the documentation of this file.
1 /*
2  * AAC encoder intensity stereo
3  * Copyright (C) 2015 Rostislav Pehlivanov
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * AAC encoder Intensity Stereo
25  * @author Rostislav Pehlivanov ( atomnuker gmail com )
26  */
27 
28 #include "aacenc.h"
29 #include "aacenc_utils.h"
30 #include "aacenc_is.h"
31 #include "aacenc_quantization.h"
32 
33 /** Frequency in Hz for lower limit of intensity stereo **/
34 #define INT_STEREO_LOW_LIMIT 6100
35 
36 struct AACISError {
37  int pass; /* 1 if dist2 <= dist1 */
38  int phase; /* -1 or +1 */
39  float error; /* fabs(dist1 - dist2) */
40  float dist1; /* From original coeffs */
41  float dist2; /* From IS'd coeffs */
42  float ener01;
43 };
44 
46  int start, int w, int g, float ener0,
47  float ener1, float ener01, int phase)
48 {
49  int i, w2;
50  SingleChannelElement *sce0 = &cpe->ch[0];
51  SingleChannelElement *sce1 = &cpe->ch[1];
52  float *L = sce0->coeffs;
53  float *R = sce1->coeffs;
54  float *L34 = &s->scoefs[256*0], *R34 = &s->scoefs[256*1];
55  float *IS = &s->scoefs[256*2], *I34 = &s->scoefs[256*3];
56  float dist1 = 0.0f, dist2 = 0.0f;
57  struct AACISError is_error = {0};
58 
59  if (ener01 <= 0 || ener0 <= 0) {
60  is_error.pass = 0;
61  return is_error;
62  }
63 
64  for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
65  FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g];
66  FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g];
67  int is_band_type, is_sf_idx = FFMAX(1, sce0->sf_idx[w*16+g]-4);
68  float e01_34 = phase*pos_pow34(ener1/ener0);
69  float maxval, dist_spec_err = 0.0f;
70  float minthr = FFMIN(band0->threshold, band1->threshold);
71  for (i = 0; i < sce0->ics.swb_sizes[g]; i++)
72  IS[i] = (L[start+(w+w2)*128+i] + phase*R[start+(w+w2)*128+i])*sqrt(ener0/ener01);
73  s->aacdsp.abs_pow34(L34, &L[start+(w+w2)*128], sce0->ics.swb_sizes[g]);
74  s->aacdsp.abs_pow34(R34, &R[start+(w+w2)*128], sce0->ics.swb_sizes[g]);
75  s->aacdsp.abs_pow34(I34, IS, sce0->ics.swb_sizes[g]);
76  maxval = find_max_val(1, sce0->ics.swb_sizes[g], I34);
77  is_band_type = find_min_book(maxval, is_sf_idx);
78  dist1 += quantize_band_cost(s, &L[start + (w+w2)*128], L34,
79  sce0->ics.swb_sizes[g],
80  sce0->sf_idx[w*16+g],
81  sce0->band_type[w*16+g],
82  s->lambda / band0->threshold, INFINITY, NULL, NULL);
83  dist1 += quantize_band_cost(s, &R[start + (w+w2)*128], R34,
84  sce1->ics.swb_sizes[g],
85  sce1->sf_idx[w*16+g],
86  sce1->band_type[w*16+g],
87  s->lambda / band1->threshold, INFINITY, NULL, NULL);
88  dist2 += quantize_band_cost(s, IS, I34, sce0->ics.swb_sizes[g],
89  is_sf_idx, is_band_type,
90  s->lambda / minthr, INFINITY, NULL, NULL);
91  for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
92  dist_spec_err += (L34[i] - I34[i])*(L34[i] - I34[i]);
93  dist_spec_err += (R34[i] - I34[i]*e01_34)*(R34[i] - I34[i]*e01_34);
94  }
95  dist_spec_err *= s->lambda / minthr;
96  dist2 += dist_spec_err;
97  }
98 
99  is_error.pass = dist2 <= dist1;
100  is_error.phase = phase;
101  is_error.error = dist2 - dist1;
102  is_error.dist1 = dist1;
103  is_error.dist2 = dist2;
104  is_error.ener01 = ener01;
105 
106  return is_error;
107 }
108 
110 {
111  SingleChannelElement *sce0 = &cpe->ch[0];
112  SingleChannelElement *sce1 = &cpe->ch[1];
113  int start = 0, count = 0, w, w2, g, i, prev_sf1 = -1, prev_bt = -1, prev_is = 0;
114  const float freq_mult = avctx->sample_rate/(1024.0f/sce0->ics.num_windows)/2.0f;
115  uint8_t nextband1[128];
116 
117  if (!cpe->common_window)
118  return;
119 
120  /** Scout out next nonzero bands */
121  ff_init_nextband_map(sce1, nextband1);
122 
123  for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) {
124  start = 0;
125  for (g = 0; g < sce0->ics.num_swb; g++) {
126  if (start*freq_mult > INT_STEREO_LOW_LIMIT*(s->lambda/170.0f) &&
127  cpe->ch[0].band_type[w*16+g] != NOISE_BT && !cpe->ch[0].zeroes[w*16+g] &&
128  cpe->ch[1].band_type[w*16+g] != NOISE_BT && !cpe->ch[1].zeroes[w*16+g] &&
129  ff_sfdelta_can_remove_band(sce1, nextband1, prev_sf1, w*16+g)) {
130  float ener0 = 0.0f, ener1 = 0.0f, ener01 = 0.0f, ener01p = 0.0f;
131  struct AACISError ph_err1, ph_err2, *best;
132  for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
133  for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
134  float coef0 = sce0->coeffs[start+(w+w2)*128+i];
135  float coef1 = sce1->coeffs[start+(w+w2)*128+i];
136  ener0 += coef0*coef0;
137  ener1 += coef1*coef1;
138  ener01 += (coef0 + coef1)*(coef0 + coef1);
139  ener01p += (coef0 - coef1)*(coef0 - coef1);
140  }
141  }
142  ph_err1 = aac_is_encoding_err(s, cpe, start, w, g,
143  ener0, ener1, ener01p, -1);
144  ph_err2 = aac_is_encoding_err(s, cpe, start, w, g,
145  ener0, ener1, ener01, +1);
146  best = (ph_err1.pass && ph_err1.error < ph_err2.error) ? &ph_err1 : &ph_err2;
147  if (best->pass) {
148  cpe->is_mask[w*16+g] = 1;
149  cpe->ms_mask[w*16+g] = 0;
150  cpe->ch[0].is_ener[w*16+g] = sqrt(ener0 / best->ener01);
151  cpe->ch[1].is_ener[w*16+g] = ener0/ener1;
152  cpe->ch[1].band_type[w*16+g] = (best->phase > 0) ? INTENSITY_BT : INTENSITY_BT2;
153  if (prev_is && prev_bt != cpe->ch[1].band_type[w*16+g]) {
154  /** Flip M/S mask and pick the other CB, since it encodes more efficiently */
155  cpe->ms_mask[w*16+g] = 1;
156  cpe->ch[1].band_type[w*16+g] = (best->phase > 0) ? INTENSITY_BT2 : INTENSITY_BT;
157  }
158  prev_bt = cpe->ch[1].band_type[w*16+g];
159  count++;
160  }
161  }
162  if (!sce1->zeroes[w*16+g] && sce1->band_type[w*16+g] < RESERVED_BT)
163  prev_sf1 = sce1->sf_idx[w*16+g];
164  prev_is = cpe->is_mask[w*16+g];
165  start += sce0->ics.swb_sizes[g];
166  }
167  }
168  cpe->is_mode = !!count;
169 }
INFINITY
#define INFINITY
Definition: mathematics.h:118
AACISError::dist2
float dist2
Definition: aacenc_is.c:41
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:1024
SingleChannelElement::zeroes
uint8_t zeroes[128]
band is not coded
Definition: aacenc.h:114
w
uint8_t w
Definition: llviddspenc.c:38
AACISError::pass
int pass
Definition: aacenc_is.c:37
R
#define R
Definition: huffyuv.h:44
ff_sfdelta_can_remove_band
static int ff_sfdelta_can_remove_band(const SingleChannelElement *sce, const uint8_t *nextband, int prev_sf, int band)
Definition: aacenc_utils.h:208
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
ChannelElement::ch
SingleChannelElement ch[2]
Definition: aacdec.h:266
IndividualChannelStream::num_swb
int num_swb
number of scalefactor window bands
Definition: aacdec.h:171
AACISError::dist1
float dist1
Definition: aacenc_is.c:40
SingleChannelElement::coeffs
float coeffs[1024]
coefficients for IMDCT, maybe processed
Definition: aacenc.h:119
SingleChannelElement::ics
IndividualChannelStream ics
Definition: aacdec.h:211
NOISE_BT
@ NOISE_BT
Spectral data are scaled white noise not coded in the bitstream.
Definition: aac.h:71
AACISError::error
float error
Definition: aacenc_is.c:39
s
#define s(width, name)
Definition: cbs_vp9.c:198
IndividualChannelStream::swb_sizes
const uint8_t * swb_sizes
table of scalefactor band sizes for a particular window
Definition: aacenc.h:83
g
const char * g
Definition: vf_curves.c:128
INTENSITY_BT2
@ INTENSITY_BT2
Scalefactor data are intensity stereo positions (out of phase).
Definition: aac.h:72
AACISError::ener01
float ener01
Definition: aacenc_is.c:42
INTENSITY_BT
@ INTENSITY_BT
Scalefactor data are intensity stereo positions (in phase).
Definition: aac.h:73
ChannelElement::is_mask
uint8_t is_mask[128]
Set if intensity stereo is used.
Definition: aacenc.h:133
NULL
#define NULL
Definition: coverity.c:32
SingleChannelElement::is_ener
float is_ener[128]
Intensity stereo pos.
Definition: aacenc.h:116
aacenc_quantization.h
ChannelElement::ms_mask
uint8_t ms_mask[128]
Set if mid/side stereo is used for each scalefactor window band.
Definition: aacdec.h:264
FFPsyBand
single band psychoacoustic information
Definition: psymodel.h:50
ff_init_nextband_map
static void ff_init_nextband_map(const SingleChannelElement *sce, uint8_t *nextband)
Definition: aacenc_utils.h:175
SingleChannelElement::sf_idx
int sf_idx[128]
scalefactor indices
Definition: aacenc.h:113
f
f
Definition: af_crystalizer.c:122
ChannelElement::common_window
int common_window
Set if channels share a common 'IndividualChannelStream' in bitstream.
Definition: aacenc.h:129
SingleChannelElement::band_type
enum BandType band_type[128]
band types
Definition: aacdec.h:214
pos_pow34
static float pos_pow34(float a)
Definition: aacenc_utils.h:40
aac_is_encoding_err
static struct AACISError aac_is_encoding_err(AACEncContext *s, ChannelElement *cpe, int start, int w, int g, float ener0, float ener1, float ener01, int phase)
Definition: aacenc_is.c:45
aacenc_is.h
SingleChannelElement
Single Channel Element - used for both SCE and LFE elements.
Definition: aacdec.h:210
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
IndividualChannelStream::num_windows
int num_windows
Definition: aacdec.h:172
find_min_book
static int find_min_book(float maxval, int sf)
Definition: aacenc_utils.h:68
FFPsyBand::threshold
float threshold
Definition: psymodel.h:53
ChannelElement
channel element - generic struct for SCE/CPE/CCE/LFE
Definition: aacdec.h:260
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
ff_aac_search_for_is
void ff_aac_search_for_is(AACEncContext *s, AVCodecContext *avctx, ChannelElement *cpe)
Definition: aacenc_is.c:109
AACISError::phase
int phase
Definition: aacenc_is.c:38
RESERVED_BT
@ RESERVED_BT
Band types following are encoded differently from others.
Definition: aac.h:70
AACEncContext
AAC encoder context.
Definition: aacenc.h:180
AVCodecContext
main external API structure.
Definition: avcodec.h:431
L
#define L(x)
Definition: vpx_arith.h:36
ChannelElement::is_mode
uint8_t is_mode
Set if any bands have been encoded using intensity stereo.
Definition: aacenc.h:131
quantize_band_cost
static float quantize_band_cost(struct AACEncContext *s, const float *in, const float *scaled, int size, int scale_idx, int cb, const float lambda, const float uplim, int *bits, float *energy)
Definition: aacenc_quantization.h:43
find_max_val
static float find_max_val(int group_len, int swb_size, const float *scaled)
Definition: aacenc_utils.h:56
INT_STEREO_LOW_LIMIT
#define INT_STEREO_LOW_LIMIT
Frequency in Hz for lower limit of intensity stereo.
Definition: aacenc_is.c:34
aacenc_utils.h
IndividualChannelStream::group_len
uint8_t group_len[8]
Definition: aacdec.h:168
AACISError
Definition: aacenc_is.c:36
aacenc.h