[FFmpeg-devel] Add waveformat extensible support in wav muxer (SoC qualification task)
Michael Niedermayer
michaelni
Sat Mar 28 15:10:45 CET 2009
On Sat, Mar 28, 2009 at 06:47:25PM +0800, zhentan feng wrote:
> Hi
>
> 2009/3/28 Benjamin Larsson <banan at ludd.ltu.se>
>
> > zhentan feng wrote:
> >
> >> Hi
> >>
> >> 2009/3/27 Benjamin Larsson <banan at ludd.ltu.se>
> >>
> >>
> >>
> >>> zhentan feng wrote:
> >>>
> >>>
> >>>> Hi
> >>>>
> >>>> 2009/3/26 Benjamin Larsson <banan at ludd.ltu.se>
> >>>>
> >>>>
> >>>>
> >>>>> zhentan feng wrote:
> >>>>>
> >>>>>
> >>>>>
> >>>>>> Hi
> >>>>>>
> >>>>>> 2009/3/26 Michael Niedermayer <michaelni at gmx.at>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>> On Thu, Mar 26, 2009 at 01:19:00AM +0800, zhentan feng wrote:
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>> Hi,
> >>>>>>>>
> >>>>>>>> Here is patch for the small task of qualification tasks NO.30.
> >>>>>>>> Based on the work of Benjamin Larsson, I generated the pathc as
> >>>>>>>>
> >>>>>>>>
> >>>>>>> below.
> >>>
> >>>
> >>>> I think it must need further modifies.
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>>>
> >>>>>>> yes, iam not sure if this or benjamins patch was better
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>> I downloaded the 6-channel wav file from:
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>> http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples/Microsoft/6_Channel_ID.wav
> >>>
> >>>
> >>>> ( and other typr wav files can acess here :
> >>>>>> http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html
> >>>>>> )
> >>>>>>
> >>>>>> 1) then I run ./ffmpeg_g -i 6_Channel_ID.wav channel4.wav
> >>>>>>
> >>>>>> I get the error:
> >>>>>> Resampling with input channels greater than 2 unsupported.
> >>>>>>
> >>>>>> so I run another command:
> >>>>>> 2) ./output_example test.wav
> >>>>>> ./ffmpeg_g -i test.wav -ac 4 ch4.wav
> >>>>>>
> >>>>>> and enc->channels is 4, however enc->channel_layout is 0.
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> Finally, I have 2 questions:
> >>>>>>
> >>>>>> 1) how to test the muxer works correctly?
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>> When the muxer works correctly it should be possible to transcode a wav
> >>>>> file that contains the wavformatextensible header.
> >>>>>
> >>>>> 2) where to specify the enc->channel_layout?
> >>>>> It should be filled in by ffmpeg.c.
> >>>>>
> >>>>>
> >>>>>
> >>>> I debug the commandline:
> >>>> ./ffmpeg_g -i test.wav -ac 4 4ch.wav
> >>>>
> >>>> and found that the enc->channel_layout value is assigned from the input
> >>>>
> >>>>
> >>> file
> >>>
> >>>
> >>>> channel_layout. In this case, it is 0.
> >>>> and it seems that "-channel_layout" option doesn't work.
> >>>>
> >>>> 1) is it need to refresh the channel_layout value according to the
> >>>>
> >>>>
> >>> channels
> >>>
> >>>
> >>>> in ffmpeg.c or in put_wav_header()?
> >>>> 2) any tools to examine the output file is correct?
> >>>>
> >>>> zhentan feng
> >>>>
> >>>>
> >>> Hi, this is the latest version of my patch. This adds the maybe correct
> >>> GUID values. To really test this you need to find a wav file with a
> >>> corrrect dwChannelMask. And then make sure that the muxer puts the same
> >>> mask to the transcoded file. The output file should also be playable in
> >>> windows.
> >>>
> >>> [...]
> >>>
> >>>
> >>
> >>
> >> 1) I download the 6 channels sample wav file form the follow link:
> >>
> >> http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples/Microsoft/6_Channel_ID.wav
> >>
> >> then acoording to the new patch, I run the command:
> >> ./ffmpeg -i 6_Channel_ID.wav output_ch6.wav
> >>
> >> the program run normaly, here is the output result.
> >>
> >> 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), s16, 4233 kb/s
> >> Output #0, wav, to 'output_ch6.wav':
> >> Stream #0.0: Audio: pcm_s16le, 44100 Hz, 6 channels
> >> (FL|FR|FC|LFE|BL|BR), s16, 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%
> >>
> >> 2) The file 6_Channel_ID.wav can be palyed by windows mediaplayer, but the
> >> output_ch6.wav can't.
> >>
> >> I compared the two wav files and found that 6_Channel_ID.wav has 60 more
> >> bytes than output_ch6.wav
> >> the 60 bytes are after WAVEFORMATEXTENSIBLE sturct,followed by the data.
> >> Except for the 60 bytes, the two files are all the same.
> >>
> >> However, I noticed that the sample website says about 6_Channel_ID.wav
> >> that
> >> :"This file has a "cue " chunk with a count of zero cue points, followed
> >> by
> >> two empty cue point structures."
> >>
> >> my question is:
> >> are the 60 bytes cue chunk? and how to handle this?
> >>
> >> zhentan feng
> >> thanks
> >>
> >>
> >
> > Locate and look at the GUID in the original and the ffmpeg muxed file. They
> > most likely differ.
> >
> > [..]
> >
>
> yes. it's the GUID problem.
> thanks.
> here is the new patch.
[...]
> @@ -351,10 +357,21 @@
> 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 || waveformatextensible){
> + if (waveformatextensible) { /* write WAVEFORMATEXTENSIBLE extensions */
> + 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 += enc->extradata_size+22;
> + } else {
> + put_le16(pb, enc->extradata_size);
> + hdrsize += enc->extradata_size;
> + }
what happens when waveformatextensible is 1 but one of the previous
(else) if is true?
does that fail or can that not happen at all?
> put_buffer(pb, enc->extradata, enc->extradata_size);
> - hdrsize += enc->extradata_size;
> if(hdrsize&1){
id leave that and just add 22 in the if()
[...]
--
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-devel/attachments/20090328/0db94850/attachment.pgp>
More information about the ffmpeg-devel
mailing list