[FFmpeg-soc] [Patch] Maxis EA XA decoder - GSoC Task

Michael Niedermayer michaelni at gmx.at
Fri Apr 11 16:49:25 CEST 2008


On Fri, Apr 11, 2008 at 03:41:48PM +0200, Robert Marston wrote:
[...]
> >  > >  > @@ -1235,6 +1243,29 @@
> >  > >
> >  > > >              }
> >  > >  >          }
> >  > >  >          break;
> >  > >  > +    case CODEC_ID_ADPCM_EA_MAXIS_XA:
> >  > >  > +        for(channel = 0; channel < avctx->channels; channel++) {
> >  > >  > +            for (i=0; i<2; i++)
> >  > >  > +                coeff[channel][i] = ea_adpcm_table[(*src >> 4) +(4*i)];
> >  > >
> >  > > > +            shift[channel] = (*src & 0x0F) + 8;
> >  > >  > +            src++;
> >  > >  > +        }
> >  > >
> >  > > > +        for (count1 = 0; count1 < ((buf_size - avctx->channels) / avctx->channels) ; count1++) {
> >  > >  > +            for(i = 4; i >= 0; i-=4) { /* Pairwise samples LL RR (st) or LL LL (mono) */
> >  > >  > +                int32_t sample;
> >  > >
> >  > >
> >  > > > +                for(channel = 0; channel < avctx->channels; channel++) {
> >  > >
> >  > > > +                    sample = ((((*(src+channel) >> i) & 0x0F) << 0x1C) >> shift[channel]);
> >  > >
> >  > >  This looks buggy.
> >  > >
> >  >
> >  > Where do you think the error would occur?
> >
> >  on some non x86 hardware
> >
> >
> 
> What exactly you referring to here? The shift operators? A problem
> with the Endianess maybe?

Its related to the shifts.


> 
> >
> >  >
> >  > >
> >  > >  [...]
> >  > >  > +static int xa_read_packet(AVFormatContext *s,
> >  > >  > +                          AVPacket *pkt)
> >  > >  > +{
> >  > >  > +    MaxisXADemuxContext *xa = s->priv_data;
> >  > >  > +    AVStream *st = s->streams[0];
> >  > >  > +    ByteIOContext *pb = s->pb;
> >  > >  > +    unsigned int packet_size;
> >  > >  > +    int ret = 0;
> >  > >  > +
> >  > >  > +    if(xa->sent_bytes > xa->out_size)
> >  > >  > +        return AVERROR(EIO);
> >  > >  > +    /* 1 byte header and 14 bytes worth of samples * number channels per block */
> >  > >  > +    packet_size = 15*st->codec->channels;
> >  > >  > +
> >  > >  > +    ret = av_get_packet(pb, pkt, packet_size);
> >  > >  > +    pkt->stream_index = st->index;
> >  > >  > +
> >  > >  > +    xa->sent_bytes += packet_size;
> >  > >
> >  > >
> >  > >  > +    pkt->pts = 90000;
> >  > >  > +    pkt->pts *= xa->audio_frame_counter;
> >  > >  > +    pkt->pts /= st->codec->sample_rate;
> >  > >  > +    /* 14 Samples per channel  */
> >  > >  > +    xa->audio_frame_counter += 14;
> >  > >
> >  > >  Still wrong
> >  > >
> >  > > [...]
> >  >
> >  > Corrected?
> >
> >  no
> >
> 
> Am I right in saying the pts should be incremented by 28 *
> 90K/(1/sample_rate) * 90K ... assuming we use a 90 KHz clock? and 28
> being the number of samples per channel.

no


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

The educated differ from the uneducated as much as the living from the
dead. -- Aristotle 
-------------- 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-soc/attachments/20080411/35861fce/attachment.pgp>


More information about the FFmpeg-soc mailing list