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

zhentan feng spyfeng
Wed Apr 1 13:37:11 CEST 2009


Hi

2009/4/1 Michael Niedermayer <michaelni at gmx.at>

> On Wed, Apr 01, 2009 at 01:45:17AM +0800, zhentan feng wrote:
> > Hi
> >
> > 2009/3/31 Michael Niedermayer <michaelni at gmx.at>
> >
> > > On Tue, Mar 31, 2009 at 07:47:59PM +0800, zhentan feng wrote:
> > > [...]
> > > > here is new patch attached below.
> > > >
> > > > --
> > > > Best wishes~
> > >
> > > > Index: libavformat/riff.c
> > > > ===================================================================
> > > > --- libavformat/riff.c        (revision 18184)
> > > > +++ libavformat/riff.c        (working copy)
> > > > @@ -282,12 +282,19 @@
> > > >  int put_wav_header(ByteIOContext *pb, AVCodecContext *enc)
> > > >  {
> > > >      int bps, blkalign, bytespersec;
> > > > +    int waveformatextensible = 0;
> > >
> > > redundant init
> > >
> > >
> > > >      int hdrsize = 18;
> > > > +    int64_t pos, update_size_pos;
> > > >
> > > >      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);
> > > > +    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) {
> > > > @@ -324,8 +331,22 @@
> > > >      put_le32(pb, bytespersec); /* bytes per second */
> > > >      put_le16(pb, blkalign); /* block align */
> > > >      put_le16(pb, bps); /* bits per sample */
> > > > +
> > > > +    if (waveformatextensible) {                     /* write
> > > WAVEFORMATEXTENSIBLE extensions */
> > > > +        update_size_pos = url_ftell(pb);
> > > > +        put_le16(pb, enc->extradata_size+22);       /* 22 is the
> size of
> > > WAVEFORMATEXTENSIBLE-WAVEFORMATEX */
> > > > +        put_le16(pb, enc->bits_per_coded_sample);   /*
> > > ValidBitsPerSample || SamplesPerBlock || Reserved */
> > > > +        put_le32(pb, enc->channel_layout);          /* dwChannelMask
> */
> > > > +        put_le32(pb, enc->codec_tag);               /* GUID + next 3
> */
> > > > +        put_le32(pb, 0x00100000);
> > > > +        put_le32(pb, 0xAA000080);
> > > > +        put_le32(pb, 0x719B3800);
> > > > +        hdrsize += 22;
> > > > +    }
> > > > +
> > > >      if (enc->codec_id == CODEC_ID_MP3) {
> > > > -        put_le16(pb, 12); /* wav_extra_size */
> > > > +        if (!waveformatextensible)
> > > > +            put_le16(pb, 12); /* wav_extra_size */
> > > >          hdrsize += 12;
> > > >          put_le16(pb, 1); /* wID */
> > > >          put_le32(pb, 2); /* fdwFlags */
> > > > @@ -333,7 +354,8 @@
> > > >          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 */
> > > > +        if (!waveformatextensible)
> > > > +            put_le16(pb, 22); /* wav_extra_size */
> > > >          hdrsize += 22;
> > > >          put_le16(pb, 2);  /* fwHeadLayer */
> > > >          put_le32(pb, enc->bit_rate); /* dwHeadBitrate */
> > > > @@ -344,15 +366,18 @@
> > > >          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 */
> > > > +        if (!waveformatextensible)
> > > > +            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 */
> > > > +        if (!waveformatextensible)
> > > > +            put_le16(pb, 2); /* wav_extra_size */
> > > >          hdrsize += 2;
> > >
> > > >          put_le16(pb, enc->frame_size); /* wSamplesPerBlock */
> > > > -    } else if(enc->extradata_size){
> > > > +    } else if (enc->extradata_size){
> > > > -        put_le16(pb, enc->extradata_size);
> > > > +        if (!waveformatextensible)
> > > > +            put_le16(pb, enc->extradata_size);
> > > >          put_buffer(pb, enc->extradata, enc->extradata_size);
> > >
> > > cosmetic
> > >
> > >
> > > >          hdrsize += enc->extradata_size;
> > > >          if(hdrsize&1){
> > > > @@ -363,6 +388,14 @@
> > > >          hdrsize -= 2;
> > > >      }
> > > >
> > > > +    if (!url_is_streamed(pb)){
> > > > +        if (hdrsize > 40 && waveformatextensible) { /*  40 means 22
> > > WAVEFORMATEXTENSBLE size + 18 */
> > > > +            pos = url_ftell(pb);
> > > > +            url_fseek(pb, update_size_pos, SEEK_SET);
> > > > +            put_le16(pb, hdrsize - 18);
> > > > +            url_fseek(pb, pos, SEEK_SET);
> > > > +        }
> > > > +    }
> > >
> > > fails if url_is_streamed
> > >
> > >
> > > [...]
> >
> >
> > reference to avienc.c Line 180, write the default MAX value when
> > url_is_streamed  is true.
> > here is the new patch.
>
> we need the correct value written there, the header size is not optional
>
> [...]


here is the new patch attached below.

zhentan
-- 
Best wishes~
-------------- next part --------------
A non-text attachment was scrubbed...
Name: waveformatextensible_08.patch
Type: application/octet-stream
Size: 4010 bytes
Desc: not available
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090401/296083ff/attachment.obj>



More information about the ffmpeg-devel mailing list