On 6/7/13, Hendrik Schreiber <[email protected]> wrote: > On Jun 4, 2013, at 1:34 PM, Paul B Mahol wrote: > >> On 6/4/13, Hendrik Schreiber <[email protected]> wrote: >>> >>> 1. (SHIFTING) When decoding, 24bit audio is apparently shifted, i.e. >>> 24bit >>> become 32bit, as there is no 24bit AVSampleFormat. Am I right to assume >>> that >>> the data is shifted toward the most significant byte? I.e. the most >>> significant 3 bytes are the same as the original 24bit? >>> Or is the most significant byte simply "sign-extended" and the three >>> least >>> significant bytes are the original 24bit? > > The first statement is true. > > I did some tests and all libav does it shift the data toward the most > significant byte. I.e. the least significant byte is 0. This means, that one > has to apply dithering, *if* one wants to use this 4 bytes representation > for anything other than extracting the most significant three bytes. > > If one just wants to dump 3-byte for each 24bit sample, one has to simply > cut off that extra byte added before (encoding with, AV_CODEC_ID_PCM_S24LE > see below). No dithering necessary. > >>> >>> 2. (SWRESAMPLE) I'm using libswresample to, well, resample data, get rid >>> of >>> planar formats etc. It's working great. libswresample also accepts >>> AVSampleFormat parameters for input and output format. This implies that >>> it >>> does not support any conversion to true 24bit, represented by 3 bytes. >>> Correct? > > Yes. I fiddled with it some more. swresample does not support any true 24bit > (i.e. 3byte per sample) output. It works strictly on the intermediate > dataformats defined in AVSampleFormat. > >>> >>> 3. (CODEC) What is the recommend way to produce 24bit audio? After >>> decoding >>> (and potentially resampling), should I use the corresponding codec (e.g. >>> AV_CODEC_ID_PCM_S24LE) to produce the data in the format I'm interested >>> in? >>> Or is there another, better way? >> >> There should be dithering applied, see output_sample_bits option. > > I guess there is no other way (expect for perhaps filtering). It turns out > that to produce 24bit audio in true a 24bit format, one has to use an > appropriate encoder, e.g. AV_CODEC_ID_PCM_S24LE for signed 24bit little > endian.
Note that dithering should be done when doing 32bit to 24bit case and source audio have >24bits used. > > Dithering is only necessary, when converting the data somewhere in between > (e.g. changing the sample rate while it's in 32bit format), as the code in > pcm.c (macro ENCODE) simply shifts the 32bit representation by 8bit, > essentially just dropping the last 8bits. Because last 8bits are always zero for that particular case. > > Since I got the answers to all my questions - I figured, I might as well > post them. Hope it's useful to someone else. > > Cheers, > > -hendrik > _______________________________________________ > Libav-user mailing list > [email protected] > http://ffmpeg.org/mailman/listinfo/libav-user > _______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
