[FFmpeg-devel] [PATCH] ALAC Encoder

Michael Niedermayer michaelni
Mon Aug 18 19:33:47 CEST 2008


On Mon, Aug 18, 2008 at 07:24:23PM +0200, Michael Niedermayer wrote:
> On Mon, Aug 18, 2008 at 09:55:10PM +0530, Jai Menon wrote:
> > Hi,
> > 
> > On Monday 18 Aug 2008 3:46:23 am Michael Niedermayer wrote:
> > > On Mon, Aug 18, 2008 at 02:38:24AM +0530, Jai Menon wrote:
> > > > Hi,
> > > >
> > > > On Sunday 17 Aug 2008 5:17:52 pm Michael Niedermayer wrote:
> > > > > On Sun, Aug 17, 2008 at 11:17:10AM +0530, Jai Menon wrote:
> [...]
> > > > +
> > > > +static void alac_stereo_decorrelation(AlacEncodeContext *s)
> > > > +{
> > > > +    int32_t *left = s->sample_buf[0], *right = s->sample_buf[1];
> > > > +    int i, mode, n = s->avctx->frame_size;
> > > > +
> > > > +    mode = estimate_stereo_mode(left, right, n);
> > > > +
> > > > +    if(mode == ALAC_CHMODE_LEFT_RIGHT) {
> > > > +        s->interlacing_leftweight = 0;
> > > > +        s->interlacing_shift = 0;
> > > > +        return;
> > > > +    }
> > > > +
> > > > +    if(mode == ALAC_CHMODE_LEFT_SIDE) {
> > > > +        for(i=0; i<n; i++) {
> > > > +            right[i] = left[i] - right[i];
> > > > +        }
> > > > +        s->interlacing_leftweight = 1;
> > > > +        s->interlacing_shift = 0;
> > > > +
> > > > +    } else {
> > > > +        int32_t tmp;
> > > > +        for(i=0; i<n; i++) {
> > > > +            tmp = left[i];
> > > > +            left[i] = (tmp + right[i]) >> 1;
> > > > +            right[i] = tmp - right[i];
> > > > +        }
> > > > +        s->interlacing_leftweight = 1;
> > > > +        s->interlacing_shift = 1;
> > > > +    }
> > >
> > > i think 1 mode is missing
> > 
> > I left out the right-side mode because I really don't see how the decoder 
> > could support it without accidentally swapping channels. Or am I missing 
> > something?
> 
> The decoder does:
>             cl -= (cr * W) >> S;
>             cr += cl;
> 
>             l = cr;
>             r = cl;
> the encoder does:
>             l -= r;
>             r += (l * W) >> S;
> 
>             cr = l;
>             cl = r;
> 
> These hold true for all values of W and S
> 
> with W=0,S=1  you get l-r, r
> with W=1,S=1  you get l-r, (r+l)>>1
> with W=2,S=1  you get l-r, l

i just realized my suggestion has a little bug, the silly thing only
applies decorrelation when W!=0 ...

so replace "W=0,S=1" by "W=1,S=31" 

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

No snowflake in an avalanche ever feels responsible. -- Voltaire
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080818/3b2d5547/attachment.pgp>



More information about the ffmpeg-devel mailing list