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

Michael Niedermayer michaelni
Tue Mar 31 04:31:18 CEST 2009


On Tue, Mar 31, 2009 at 09:46:29AM +0800, zhentan feng wrote:
> Hi
> 
> 2009/3/31 Michael Niedermayer <michaelni at gmx.at>
> 
> > [...]
> > > here is the new patch for version 0.5.
> > > according to get_wav_header() fucntion, write the WAVEFORMATEXTENSIBLE
> > > struct first and update the extrasize if necessary.
> > >
> > [...]
> > > @@ -343,16 +365,14 @@
> > >          put_le16(pb, 16); /* fwHeadFlags */
> > >          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 */
> > > +    } else if (enc->codec_id == CODEC_ID_GSM_MS || enc->codec_id ==
> > CODEC_ID_ADPCM_IMA_WAV) {
> > > +        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 */
> > > -        hdrsize += 2;
> > > -        put_le16(pb, enc->frame_size); /* wSamplesPerBlock */
> > > -    } else if(enc->extradata_size){
> > > -        put_le16(pb, enc->extradata_size);
> > > +    } else if (enc->extradata_size){
> > > +        if (!waveformatextensible)
> > > +            put_le16(pb, enc->extradata_size);
> > >          put_buffer(pb, enc->extradata, enc->extradata_size);
> > >          hdrsize += enc->extradata_size;
> > >          if(hdrsize&1){
> >
> > factorizing code should be in a seperate patch
> >
> >
> > > @@ -363,6 +383,10 @@
> > >          hdrsize -= 2;
> > >      }
> > >
> > > +    if (hdrsize > 40 && waveformatextensible) { /*  40 means 22
> > WAVEFORMATEXTENSBLE size + 18 */
> > > +        put_le16(update_pb, hdrsize - 18);
> > > +    }
> > > +
> > >      return hdrsize;
> > >  }
> > >
> >
> > this is not correct
> >
> 
> thanks for reviewing the patch.
> 
> do you mean the if condition is not correct or the way of updating size is
> wrong?

the problem is that behind pb there can be a file, pipe, http or anything
else, duplicating it like you do will lead to random results


> 
> if it is the update size problem, is it correct to use url_feek() for
> updating the size?

url_fseek() may be an option
pb does have its own internal buffer and as long as the seek can be done
within this buffer it works, otherwise it depends on the ability of the
underlaying protocol to be seekable.
For example a pipe cant be seeked ...

one issue with url_fseek() might be if extradata_size is bigger than the
buffer, i dont remember if this case could lead to the rewriting in
your code.


[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

He who knows, does not speak. He who speaks, does not know. -- Lao Tsu
-------------- 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/20090331/a91df58a/attachment.pgp>



More information about the ffmpeg-devel mailing list