On Fri, Jun 7, 2013 at 12:40 PM, 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. > > 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. > > Since I got the answers to all my questions - I figured, I might as well post > them. Hope it's useful to someone else. >
much appreciated. Thank you! _______________________________________________ Libav-user mailing list [email protected] http://ffmpeg.org/mailman/listinfo/libav-user
