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 <atomnu...@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@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel