[FFmpeg-devel] Add waveformat extensible support in wav muxer (SoC qualification task)

Michael Niedermayer michaelni
Sat Apr 4 00:29:45 CEST 2009


On Fri, Apr 03, 2009 at 10:18:24PM +0800, zhentan feng wrote:
> Hi
> 
> 2009/4/3 Michael Niedermayer <michaelni at gmx.at>
> 
> > On Fri, Apr 03, 2009 at 01:25:37AM +0800, zhentan feng wrote:
> > [...]
> > > new patch attached below.
> > >
> > > zhentan
> > > --
> > > Best wishes~
> >
> > > Index: libavformat/riff.c
> > > ===================================================================
> > > --- libavformat/riff.c        (revision 18184)
> > > +++ libavformat/riff.c        (working copy)
> > > @@ -282,18 +282,34 @@
> > >  int put_wav_header(ByteIOContext *pb, AVCodecContext *enc)
> > >  {
> > >      int bps, blkalign, bytespersec;
> > > +    int waveformatextensible;
> > >      int hdrsize = 18;
> > > +    int pre_size = 0;
> > >
> > >      if(!enc->codec_tag || enc->codec_tag > 0xffff)
> > >          return -1;
> > >
> > > -    put_le16(pb, enc->codec_tag);
> > > +    waveformatextensible = enc->channels > 2 && enc->channel_layout;
> > > +    if (waveformatextensible) {
> > > +        put_le16(pb, 0xfffe);
> > > +        pre_size = 22; /* 22 is the size of
> > WAVEFORMATEXTENSIBLE-WAVEFORMATEX */
> > > +    } else
> > > +        put_le16(pb, enc->codec_tag);
> > > +
> > >      put_le16(pb, enc->channels);
> > >      put_le32(pb, enc->sample_rate);
> > >      if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3
> > || enc->codec_id == CODEC_ID_GSM_MS) {
> > >          bps = 0;
> > > +        if (enc->codec_id == CODEC_ID_MP2) {
> > > +            pre_size += 22; /* wav_extra_size */
> > > +        } else if(enc->codec_id == CODEC_ID_MP3) {
> > > +            pre_size += 12; /* wav_extra_size */
> > > +        } else
> > > +            pre_size += 2; /* wav_extra_size */
> > >      } else if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV || enc->codec_id
> > == CODEC_ID_ADPCM_MS || enc->codec_id == CODEC_ID_ADPCM_G726 ||
> > enc->codec_id == CODEC_ID_ADPCM_YAMAHA) { //
> > >          bps = 4;
> > > +        if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV)
> > > +            pre_size += 2; /* wav_extra_size */
> > >      } else {
> > >          if (!(bps = av_get_bits_per_sample(enc->codec_id)))
> > >              bps = 16; // default to 16
> > > @@ -324,8 +340,30 @@
> > >      put_le32(pb, bytespersec); /* bytes per second */
> > >      put_le16(pb, blkalign); /* block align */
> > >      put_le16(pb, bps); /* bits per sample */
> > > +
> > > +    if (pre_size) {
> > > +        if (waveformatextensible && pre_size == 22) {
> > > +            put_le16(pb, pre_size + enc->extradata_size);
> > > +        } else
> > > +            put_le16(pb, pre_size);
> > > +    } else {
> > > +        if (enc->extradata_size) {
> > > +            put_le16(pb, enc->extradata_size);
> > > +        } else
> > > +            return hdrsize - 2;
> > > +    }
> > > +
> >
> > this is still a mess
> > [...]
> 
> 
> According to the suggestion from Ronald.
> I'll submmit the patch step by step.
> 
> this patch calculate the size of the extradata_size before write extradata.
> then I'll submitt the patch for adding waveformatextensible.
> this would be more readable and keep my head cool :)
> 
> thanks
> zhentan
> -- 
> Best wishes~

> Index: libavformat/riff.c
> ===================================================================
> --- libavformat/riff.c	(revision 18184)
> +++ libavformat/riff.c	(working copy)
> @@ -283,6 +283,7 @@
>  {
>      int bps, blkalign, bytespersec;
>      int hdrsize = 18;
> +    int pre_size = 0;
>  
>      if(!enc->codec_tag || enc->codec_tag > 0xffff)
>          return -1;
> @@ -292,8 +293,16 @@
>      put_le32(pb, enc->sample_rate);
>      if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3 || enc->codec_id == CODEC_ID_GSM_MS) {
>          bps = 0;
> +        if (enc->codec_id == CODEC_ID_MP2) {
> +            pre_size = 22; /* wav_extra_size */
> +        } else if(enc->codec_id == CODEC_ID_MP3) {
> +            pre_size = 12; /* wav_extra_size */
> +        } else
> +            pre_size = 2; /* wav_extra_size */
>      } else if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV || enc->codec_id == CODEC_ID_ADPCM_MS || enc->codec_id == CODEC_ID_ADPCM_G726 || enc->codec_id == CODEC_ID_ADPCM_YAMAHA) { //
>          bps = 4;
> +        if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV)
> +            pre_size = 2; /* wav_extra_size */
>      } else {
>          if (!(bps = av_get_bits_per_sample(enc->codec_id)))
>              bps = 16; // default to 16
> @@ -324,8 +333,15 @@
>      put_le32(pb, bytespersec); /* bytes per second */
>      put_le16(pb, blkalign); /* block align */
>      put_le16(pb, bps); /* bits per sample */
> +
> +    if (!pre_size && enc->extradata_size)
> +        pre_size = enc->extradata_size;
> +    if (pre_size)
> +        put_le16(pb, pre_size);
> +    else
> +        return hdrsize - 2;
> +
>      if (enc->codec_id == CODEC_ID_MP3) {
> -        put_le16(pb, 12); /* wav_extra_size */
>          hdrsize += 12;
>          put_le16(pb, 1); /* wID */
>          put_le32(pb, 2); /* fdwFlags */
> @@ -333,7 +349,6 @@
>          put_le16(pb, 1); /* nFramesPerBlock */
>          put_le16(pb, 1393); /* nCodecDelay */
>      } else if (enc->codec_id == CODEC_ID_MP2) {
> -        put_le16(pb, 22); /* wav_extra_size */
>          hdrsize += 22;
>          put_le16(pb, 2);  /* fwHeadLayer */
>          put_le32(pb, enc->bit_rate); /* dwHeadBitrate */
> @@ -344,15 +359,12 @@
>          put_le32(pb, 0);  /* dwPTSLow */
>          put_le32(pb, 0);  /* dwPTSHigh */
>      } else if (enc->codec_id == CODEC_ID_GSM_MS) {
> -        put_le16(pb, 2); /* wav_extra_size */
>          hdrsize += 2;
>          put_le16(pb, enc->frame_size); /* wSamplesPerBlock */
>      } else if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) {
> -        put_le16(pb, 2); /* wav_extra_size */
>          hdrsize += 2;
>          put_le16(pb, enc->frame_size); /* wSamplesPerBlock */
>      } else if(enc->extradata_size){
> -        put_le16(pb, enc->extradata_size);
>          put_buffer(pb, enc->extradata, enc->extradata_size);
>          hdrsize += enc->extradata_size;
>          if(hdrsize&1){

uint8_t temp[256];
uint8_t *riff_extradata= temp;
uint8_t *riff_extradata_start= temp;

if(codec_id == abc){
    bytestream_put_le16()
    ...
}else if ...
...
} else if(enc->extradata_size){
    riff_extradata_start= enc->extradata;
    riff_extradata= enc->extradata + enc->extradata_size;
}

if(waveformatext){
    ...
}else{
    ...
}
put_buffer(pb, riff_extradata, riff_extradata - riff_extradata_start);

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

I do not agree with what you have to say, but I'll defend to the death your
right to say it. -- 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/20090404/8d1b6f5e/attachment.pgp>



More information about the ffmpeg-devel mailing list