[Flac-dev] Is there any way to tell what level the flac was encoded at?
Brian Willoughby
brianw at sounds.wa.com
Wed Mar 23 14:33:05 PDT 2011
Hjalmar,
I recall that many hardware decoders have a limit on the level that
they can handle. At the very least, hardware encoders may only
support a subset of the compression levels. As for the decoders, I
cannot remember specifically whether they are all capable of decoding
all compression levels (it certainly would be more convenient).
My memory from discussions on this mailing list is that the file
format does not have anywhere to store the compression level. The
reason is that compression levels are just human conveniences, and
the actual compression is much more complex than a single digit number.
Look at the command-line options for flac and you'll see that each
compression level is synonymous with a group of up to five separate
parameters. Maximum LPC Order, blocksize, (adaptive) mid-side
coding, Rice partition order, and an exhaustive model search. I
would assume that the factor affecting your decoder mips is the
model, more than anything else which may be contributing. But you
might have some luck varying those individual parameters instead of
the basic compression level to see if any of them have a direct
effect on your decoding complexity. If one of them does have a
direct effect, then it might be easier to correlate something in the
file headers with your clock speed.
Perhaps you could just monitor your CPU usage and adapt the clock
speed. Starting at the highest clock speed (in order to guarantee
real-time decoding) you could measure percent CPU usage and drop the
clock speed any time you're using less than half the available time.
Another possibility is that your clock speed may depend almost
entirely upon the sample rate, not the compression level. It's
difficult for me to tell for certain from your cited examples, but
while it seems clear that the sample rate has a effect on the clock
speed needed, I'm not nearly so sure that different compression
levels for the same sample rate would vary so widely. Perhaps you
can just look in the FLAC headers for the sample rate, and then set
your clock speed based on that, unless you're saying that a 44.1 kHz
level 8 file takes more processing than a 96 kHz level 1 file, or
that a 96 kHz level 8 file takes more processing than a 192 kHz level
1 file. You did imply that 192 kHz takes almost twice the CPU at
level 8 versus level 1, but I would point out that sometimes you can
only adjust your clock speed in large increments, so it may not
actually be possible to drop your clock speed by less than half,
especially not at the highest clock speed (with the way clock
dividers work).
Brian Willoughby
Sound Consulting
P.S. What is your embedded platform environment?
On Mar 23, 2011, at 10:10, hjalmar nilsson wrote:
> I'm developing a flac decoder in an embedded environment. I have it
> fully up and running but I am trying to optimise the performance
> vs. the power it takes to decode the stream.
>
> Using the reference decoder code with a few optimisations for the
> hw I'm on I experience quite a difference in mips depending on the
> level.
> For instance, on a 192kHz/24 bit file the difference is almost that
> it takes twice as many mips on level 8 vs. level 1.
>
> Unfortunately I can't tell our customer that they need to decode at
> a certain level, BUT I want to minimize the frequency the processor
> is running on.
> Since I have no problem reading a 441/16 from a memory stick and
> decode it on 40 MHz, but I require almost 240 MHz on a 192/24 file,
> I would like to dynamically change the frequency depending on the
> file I'm about to decode.
>
> Now, since you managed to plough through all this, I would really
> appreciate if you could answer one simple question:
> Is there any way I can read out the compression level from the
> encoding process from the file?
More information about the Flac-dev
mailing list