[FFmpeg-devel] [PATCH] WAV file length (writing to stdout)

Axel Holzinger aholzinger
Fri Oct 19 15:15:17 CEST 2007


Justin Ruggles writes:
> Axel Holzinger wrote:
> > Rich Felker writes:
> >> On Tue, Oct 16, 2007 at 05:02:39PM +0200, Cyril B. wrote:
> >>> Hi,
> >>>
> >>> As reported recently on this mailing list [1], ffmpeg sets 
> >> 0 as file length
> >>> in the WAV header if output is streamed (for instance, when 
> >> outputting to
> >>> stdout). Nero AAC encoder does not accept such streams 
> >> ('could not parse
> >>> WAV file' error).
> >>>
> >>> The WAV file specs [2] say the file length (ChunkSize) must 
> >> be 36 + data
> >>> length. The included patch writes 36 instead of 0, which 
> >> satisfies Nero
> >>> encoder.
> >> IMO both are wrong. The most compatible way to make a wav 
> header for
> >> unknown length is to put 0xffffffff in the header.
> > 
> > 0 as the RIFF length and 0 as the data chunk length is a 
> common agreement in serious recording applications while 
> still recording the file. So a playback application can 
> determine that the given file is still being recorded. As 
> soon as the recording application finishes the ongoing 
> recording, it writes the correct values for RIFF lenth and 
> data chunk length to the file.
> > 
> > I think Nero AAC encoder is an application that is not 
> considering that a given file might still be recorded at the 
> moment it is passed to Nero AAC encoder.
> > 
> > Setting theboth length to 0xffffffff (-1) makes the file 
> invalid as 0xffffffff (-1) is an invalid value for the lenth 
> fields. So I consider this to not be a good way.
> 
> The length is treated as unsigned, so 4294967295 is a valid 
> length.  But 
> there are many programs which use this convention because it has the 
> effect of saying "keep reading data until the end-of-file".  
> There are 
> only a couple downsides.  One is that a program may report 
> the playing 
> time as something like 6 hours instead of the actual playing time. 
> Another is that no other chunks can follow the DATA chunk.

0xFFFFFFFF being invalif as a RIFF length has nothing to do
with signed/unsigend (clearly it is unsigned), but with the
fact that The RIFF length is a even number by the spec.

Also the length of the data chunk is even (that's what the RIFF/WAVE
spec defines). If you have 8 bit mono you have to add a padding byte.

Axel





More information about the ffmpeg-devel mailing list