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

zhentan feng spyfeng
Sat Apr 4 17:23:43 CEST 2009


Hi

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

> On Sat, Apr 04, 2009 at 05:14:06PM +0800, zhentan feng wrote:
> > 2009/4/4 Michael Niedermayer <michaelni at gmx.at>
> >
> > > [...]
> > >
> > > > 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);
> > >
> >
> > here is the new patch.
> > I'll submit the indent patch and extract some code lines later.
>
> patch ok if it works
>

I downloaded a 6 channels file form this link

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples/Microsoft/6_Channel_ID.wav

and run a test ./ffmpeg -i 6_Channel_ID.wav 6c_output.wav
FFmpeg output is:

  built on Mar 25 2009 20:26:42, gcc: 4.1.2 20070502 (Red Hat 4.1.2-12)
Input #0, wav, from '6_Channel_ID.wav':
  Duration: 00:00:05.83, bitrate: 4233 kb/s
    Stream #0.0: Audio: pcm_s16le, 44100 Hz, 6 channels
(FL|FR|FC|LFE|BL|BR), s1                                           6, 4233
kb/s
Output #0, wav, to '6c_output.wav':
    Stream #0.0: Audio: pcm_s16le, 44100 Hz, 6 channels
(FL|FR|FC|LFE|BL|BR), s1                                           6, 4233
kb/s
Stream mapping:
  Stream #0.0 -> #0.0
Press [q] to stop encoding
size=    3017kB time=5.84 bitrate=4233.7kbits/s
video:0kB audio:3017kB global headers:0kB muxing overhead 0.002201%


The file 6c_output.wav is palyable by windows mediaplayer.
thanks
zhentan

-- 
Best wishes~



More information about the ffmpeg-devel mailing list