Monday, October 23, 2006

dynamic range compression

I finally bit the bullet today and finished implementing DRC. There are 6 profiles, as defined by Dolby: Film Standard, Film Light, Music Standard, Music Light, Speech, and None.

example using Film Standard:
aften -dnorm 27 -dynrng 0 test.wav test.ac3

example using Music Light:
aften -dnorm 17 -dynrng 3 test.wav test.ac3

The results have not been extensively tested yet, so until then, consider this option experimental. It seems to work ok for the most part, but I have had a couple strange results.

Sunday, October 22, 2006

build system and other stuff

It's been a while since I've posted. Most of the recent changes have not been made by me, but by Prakash Punnoor, who has nearly completely converted the build system to CMake. The configure shell script is still usable, but once all the features are converted it will likely be removed all together or stripped down to a simpler form and just kept for compatibility's sake.

Also, Prakash has imported an SSE-optimized version of the libvorbis MDCT. The new build system, along with asm run-time detection, have made this possible. The effect is a 5 to 10% increase in encoding speed.

Thursday, September 14, 2006

wavrms changes

I have done some modification to the wavrms utility program which can be used to give a dialnorm setting recommendation.
  1. enabled piped input for Windows
  2. added an option to specify a time range to analyze
  3. simplified the calculation
Now dialnorm is estimated by taking the average RMS, ignoring those blocks which have RMS outside a specific range. For now the range is -40dB to -15dB, but this may change after more testing is done.

Monday, September 11, 2006

Thank you Xiphorous

I have substituted the FFmpeg MDCT implementation with the one from libvorbis, which is faster. The only side-effect is that there are 2 files now (mdct.c, mdct.h) which fall under the Xiph BSD-style license rather than the LGPL like the rest of Aften.

The AC-3 short-block MDCT is not a standard MDCT, so I had to modify it a bit to get it to work properly. The result is a small slow-down (but still faster than the previous MDCT) which I hope to fix before too long.

Friday, September 08, 2006

new optional speed-up

I've added a new encoding option which will sacrifice some accuracy in the bit allocation by skipping the binary search. This gives about a 4% to 5% speed-up. The commandline option for Aften is "-fba 1" (stands for fast bit allocation).

update & small speed increase

It's been several days since my last update. I've mostly been trying to iron-out the dynamic range compression. In the meantime, I've applied a couple minor changes to dsp.c which together give about a 3%-4% speed-up on my system.

Saturday, September 02, 2006

new cbr search method

I implemented a new search method for CBR bit allocation which gives about 6% 10% faster encoding than with the old method.

old method:
  1. estimate snr based on last frame
  2. decrement snr in large steps until data fits in frame
  3. increment snr in medium steps while data still fits in frame
  4. increment snr in small steps while data still fits in frame
new method:
  1. estimate snr based on last frame
  2. narrow the search range by doing a weighted increment or decrement of snr based on how close it is to optimal sliding a 16-wide window up or down until it overlaps the optimal value.
  3. do a binary search for the optimal snr value

Monday, August 21, 2006

version 0.05

Version 0.05 has been released. The speed increase since version 0.04 really warranted another release. There have also been a few bug fixes.

http://sourceforge.net/projects/aften/

Saturday, August 19, 2006

doubles or floats

I decided to switch the default configuration for the floating-point type. Now using floats is default, and "--enable-double" enables use of doubles.

Friday, August 18, 2006

floats or doubles

There is now a configure switch to enable use of floats internally instead of doubles. This is less accurate, but faster. To use floats, just add "--enable-float" when running configure. Otherwise, Aften will use doubles.

Saturday, August 12, 2006

Sample Format choices

I have modified by libaften and the Aften wav reader to be able to use various sample formats. Aften still uses doubles internally, but the input can be any one of the most common pcm sample format types.

It wasn't absolutely necessary for me to add this functionality to the wav reader, but I did it so that wav.c can be easily reused for other purposes.

Friday, August 11, 2006

more functional separation

I moved all of the exponent processing functions from a52enc.c to exponent.c. This was in preparation for a new exponent strategy decision algorithm, which I am working on now.

Monday, August 07, 2006

bit allocation speedup

Thanks to the help of Prakash Punnoor (prakash@punnoor.de), the bit allocation in Aften is much faster. On my system, there was a 22% speedup for CBR and 36% speedup for VBR!!

Sunday, August 06, 2006

Daily builds

I have setup daily builds from SVN. Every day at 4:50am EST my computer will get the latest SVN version of Aften and build a source package and a Windows binary package. They will be located at:
http://jbr.homelinux.org/aften/daily/

Saturday, August 05, 2006

Aften 0.04 released

I have setup a Sourceforge project for Aften, where I have released version 0.04.
Benefits of putting Aften on Sourceforge:
  • SVN access to the latest development changes.
  • Organized file releases
  • Mailing lists (currently, there is only an svnlog mailing list)
  • More publicity
  • Opportunity for other developers to join the project
  • Web hosting (the new Aften webpage is http://aften.sourceforge.net)

Friday, August 04, 2006

Default Bitrate

I made a few minor changes regarding bitrate. First, CBR mode is now the default instead of VBR. The default CBR bitrate is chosen based on the number of full-bandwidth channels.
1: 96 kbps
2: 192 kbps
3: 256 kbps
4: 384 kbps
5: 448 kbps

I modified the Aften commandline to accept bitrate in kbps instead of bps (i.e. '-b 192' instead of '-b 192000').

Now you can use the '-b' option along with the '-q' option. This will use VBR mode and use the given bitrate as a maximum bitrate.

Wednesday, August 02, 2006

libaften

I finally created a libaften! If there are no problems with the new configure/build system, I will release version 0.04 soon.

I decided not to make the filter library separate. It just made things too complicated. So now there is the base directory, aften, libaften, and util. Currently only a static library is built, but I will eventually add support for compiling a dynamic library/dll.

Tuesday, August 01, 2006

Bandwidth stuff

I have done some reworking of the bandwidth calculation. Now there are 2 adaptive modes. The default is now a fixed adaptive bandwidth, which is chosen at the start of encoding based on either the quality or bitrate setting. The other is the same variable bandwidth as before, but with a different formula. I did this mainly to make the bandwidth filter work better. There is a distinct quality difference in the high frequencies when using the fixed adaptive bandwidth coupled with the bandwidth pre-encoding filter.

commandline option changes:
'-bwfilter 1' = enable bandwidth filter
'-w -1' = fixed adaptive bandwidth (default)
'-w -2' = variable adaptive bandwidth (cannot use bandwidth filter w/ this mode)

Monday, July 31, 2006

filters

Added commandline options for the DC high-pass filter and the LFE low-pass filter.
The commandline switches are '-dcfilter <0|1>' and '-lfefilter <0|1>'.

CRC split

Moved the CRC code to its own file.
1 down, 5 to go.

short-term plans

Here is a small list of short-term development plans. I hope to get all this done in the next week or so. Once these are done, I will release a new version 0.04.
  1. separate the CRC code to its own file
  2. add optional DC high-pass and LFE low-pass filters
  3. completely redo the variable bandwidth system
  4. add an optional bandwidth low-pass filter
  5. overhaul the configuration system
  6. separate aften frontend, libaften, libfilter, and utils

Filter Library

I created a separate filter library, which will be used for all input audio filters. Currently it is only used for the transient-detection high-pass filter. Also, I changed Aften to use doubles instead of floats for pretty much everything.

The configuration system might be a little unstable on non-Linux systems right now. I am planning on doing some updates soon.

Friday, July 28, 2006

Small xbsi change

Added 2 commandline options, '-xbsi1' and '-xbsi2'. These must be used if the user wants the extended bit stream info to be written to the AC-3 file. Even if options in the extended bit stream info are specified on the commandline, they will not be encoded without explicitly adding the corresponding xbsi option. This was done to make simplifying the option parsing easier.

Header Reorganization

As one step forward in creating a libaften, I have reorganized the stucts to provide more complete separation of aften.h as a public header from the other private headers.

Alternate Bit Stream Syntax

I have added 8 new commandline options to Aften which correspond to the parameters in the Alternate Bit Stream Syntax, which is defined by Annex C of the A/52A spec. These are metadata parameters which affect interpretation by the decoder and/or receiver. Run "aften -h" to view the new options.

Sunday, July 23, 2006

channel map changes

In order to support broken/incorrect/non-standard wav files, I have made a couple changes. The first was to detect use of either back-left/back-right or side-left/side-right as the stereo surround channels. The second was to allow the user to specify the audio coding mode and presence of the LFE channel on the commandline (e.g. "-acmod 7 -lfe 1"). Only the number of channels must match the specified settings.

Saturday, July 22, 2006

First post

Aftenblog is open. This is a development blog for Aften, an AC3 encoder. I created it so I can have a space to post program updates and general thoughts regarding Aften and the AC3 format.