diff --git a/Makefile b/Makefile index c01de06..cd2af64 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION = 1.0.26.1 TOP = . -SUBDIRS = ac3dec as10k1 envy24control hdsploader hdspconf hdspmixer \ +SUBDIRS = as10k1 envy24control hdsploader hdspconf hdspmixer \ mixartloader pcxhrloader rmedigicontrol sb16_csp seq sscape_ctl \ us428control usx2yloader vxloader echomixer ld10k1 qlo10k1 \ hwmixvolume hdajackretask hda-verb diff --git a/ac3dec/COPYING b/ac3dec/COPYING deleted file mode 100644 index 5b6e7c6..0000000 --- a/ac3dec/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/ac3dec/Changelog b/ac3dec/Changelog deleted file mode 100644 index fba3daf..0000000 --- a/ac3dec/Changelog +++ /dev/null @@ -1,58 +0,0 @@ -ac3dec-0.6.1 Mon Mar 27 20:27:06 EST 2000 --Fix another 2.0 problem (rematrix was wrong). --Fix the never resync on a bad crc bug. - -ac3dec-0.6.0 Sat Mar 18 19:43:25 EST 2000 --New library interface --Fix bug wrt coupling channels that was causing sound quality problems. --Fix 2.0 mode problems (aka the I forgot to implement the phase flags bug). --All around speed improvements (almost twice as fast) --Improved robustness when fed bad data. The entire frame is checksummed before playback. - -ac3dec-0.5.6 Tue Nov 16 00:37:34 EST 1999 --Irix support --Alpha fixes --Minor performance enhancements to downmix and imdct --OpenBSD fixes --extract_ac3 can now read from stdin --Change output_linux to block on write instead of using the - ring buffer. Let me know if this causes/fixes any problems - -ac3dec-0.5.5 Wed Aug 25 15:36:44 EDT 1999 --Fixed a cut and paste bug (argh!) in parse.c which potentially - screwed up delta bit allocation info. --Martin Mueller informed me that I was missing - some corrections from the AC-3 errata document. It turns out that - I used an earlier version of the errata when I initially wrote ac3dec. - Fortunately the errata fix the outstanding bugs that I was pulling - my hair out on for a long time. Woohoo! Thanks Martin. Kudos to Dolby - Labs for keeping their documentation up to date as well. --stereo downmixing (downmix.c) is now in. Matrix encoded surround - (Dolby Prologic Surround) should work too. --clipping due to high level signals has been fixed. We normalize a - block of samples by its maximum absolute value if the max exceeds - the %100 digital level. This shouldn't be a problem, but for some - reason some channels have a dynamic range that exceeds [-1.0,1.0]. - I blame the encoder :) --Multiple track support in extract_ac3. Simply just give it the track - number you want [1,8] after the filename. - -ac3dec-0.5.4 Thu Jul 29 16:55:10 PDT 1999 --Fixed a stupid bug with the coupling channel that was causing - high frequencies to be attenuated. --Re-wrote the extract_ac3 tool. --Added to a tool to verify the checksums on a given AC3 stream. - (tools/verify_ac3) - -ac3dec-0.5.3 Mon Jul 12 10:45:56 PDT 1999 --Fixed problems related to streams with coupling channel enabled. --Minor performance enhancements - -ac3dec-0.5.2 Sun Jul 4 12:00:25 PDT 1999 --output_linux.c patch provided by Michael Holzt - -ac3dec-0.5.1 Wed Jun 30 17:48:52 PDT 1999 --Compiles and dies gracefully under Linux now. - -ac3dec-0.5.0 Wed Jun 23 11:06:06 EDT 1999 --First public release of ac3dec. diff --git a/ac3dec/Makefile.am b/ac3dec/Makefile.am deleted file mode 100644 index bc1b2a5..0000000 --- a/ac3dec/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -# # Process this file with automake to produce Makefile.in. -AUTOMAKE_OPTIONS = 1.3 foreign - -bin_PROGRAMS = ac3dec - -ac3dec_LDADD= -L./libac3 -lac3 -lm - -noinst_HEADERS = output.h -ac3dec_SOURCES = ac3dec.c output.c ac3spdif.c -ac3dec_DEPENDENCIES = libac3/libac3.a - - -EXTRA_DIST = gitcompile README Changelog TODO plot_spectrum.m autogen.sh \ - depcomp - -SUBDIRS = libac3 tools test . - -alsa-dist: distdir - @rm -rf ../distdir/ac3dec - @mkdir -p ../distdir/ac3dec - @cp -RLpv $(distdir)/* ../distdir/ac3dec - @rm -rf $(distdir) diff --git a/ac3dec/README b/ac3dec/README deleted file mode 100644 index 19e3a49..0000000 --- a/ac3dec/README +++ /dev/null @@ -1,52 +0,0 @@ -ac3dec - a free AC-3 stream decoder - -Written by Aaron Holtzman (aholtzma@engr.uvic.ca) - -Contributors: - Michael Holzt - OSS output.c and misc errata - Jim Miller - IRIX output.c - Angelos Keromytis - OpenBSD fixes - Don Mahurin - stdin support for extract_ac3 - Takefumi SAYO - FreeBSD tweak - Charles M. Hannum - fixes - - -See the file COPYING for license details. - -The currently supported platforms are Linux, Solaris, IRIX, OpenBSD, and -FreeBSD. If you want support for other platforms, take a look at -output_*.c for an idea of what you need to do. - -This software is completely useless to 99.99 percent of users -out there. It is mostly of use to those interested in audio -coding research and evaluating codecs. It could theoretically -be used as a portion of a DVD playback system for unix systems. - -HOW TO COMPILE - -Building ac3dec should be easy. Here's how: - -./configure && make all - -USAGE - -To find AC-3 streams on the internet, use www.google.com and -search for "vob trailer". A vob is a "Video Object" which is -just an MPEG-2 stream. The site www.hollywood.com has a -few good MPEG-2s with AC-3 audio. The program tools/extract_ac3 -will take an MPEG-2 stream and spit out AC-3 audio to stdout if -it exists. You can easily pipe this data to the ac3 player like -this: - - ./tools/extract_ac3 foo.vob | ./ac3dec/ - -You can also get AC-3 streams on a DVD. Check out -http://www.linuxvideo.org for details. - -DEBUG OUTPUT - -You can get a whole pile of debug info by setting the environment -variable AC3_DEBUG=1. Be sure to pipe stderr to a file or you probably -won't get realtime playback. You can pipe stderr to a file like so: - - ./ac3dec foo.ac3 2> debug.out diff --git a/ac3dec/TODO b/ac3dec/TODO deleted file mode 100644 index 02e0894..0000000 --- a/ac3dec/TODO +++ /dev/null @@ -1,22 +0,0 @@ -- Detect hrtime on solaris and enable it via config.h -- Add multilevel debug output -- change the divides/moduluos in coeff_get_mantissa to table - lookups. Need to look at stats first though. -- rewrite imdct to use split 2/4 radix fft -- investigate strangeness in 256 point imdct (weird transients?) - - -DONE -- fix the bitstream interface to allow on aligned buffers - Feb 2000 -AH -- change dither.c, crc.c to use a lookup table - March 2000 -AH -- the output signal from the IMDCT sometimes is outside the rand - of [-1.0,1.0]. This is why there is the normalization pass in - output.c. Need to investigate and hopefully we can move the - normalization. - Feb 2000 -AH -- Mute frame on error. Feb 2000 -AH -- Revisit convert_to_float and use int->float with scaling - Feb 2000 -AH -- Use proper frame sizes in auxdata parsing - July 1999 - AH -- fix clipping in output (normalize to max digital output) - Aug 99 -AH -- Fix coupling channel support - July 1999 - AH -- Add delta bit allocation support - July 1999 - AH -- Add downmixing support - Sept 1999 - AH, Yeqing Deng diff --git a/ac3dec/ac3dec.c b/ac3dec/ac3dec.c deleted file mode 100644 index 89d7ce8..0000000 --- a/ac3dec/ac3dec.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * ac3dec.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - - -#include -#include -#include -#include -#include -#include -#include -#include "config.h" - -#include "libac3/ac3.h" -#include "output.h" - -void init_spdif(void); -int output_spdif_zero(int frames); -int output_spdif_leadin(void); -int output_spdif(uint_8 *data_start, uint_8 *data_end, int quiet); - -static int end_flag = 0; -static int quiet = 0; - -static void help(void) -{ - printf("Usage: ac3dec [file] [[file]] ...\n"); - printf("\nAvailable options:\n"); - printf(" -h,--help this help\n"); - printf(" -v,--version print version of this program\n"); - printf(" -D,--device=NAME select PCM by NAME\n"); - printf(" -c,--card=ID select card for bellow modes\n"); - printf(" -4,--4ch four channels mode\n"); - printf(" -6,--6ch six channels mode\n"); - printf(" -C,--iec958c raw IEC958 (S/PDIF) consumer mode\n"); - printf(" -P,--iec958p raw IEC958 (S/PDIF) professional mode\n"); - printf(" -R,--iec958r raw IEC958 (S/PDIF) PCM\n"); - printf(" -H,--hdmi output to HDMI device\n"); - printf(" -Z,--zero=# add # zero-AC3-frames before stream\n"); - printf(" -q,--quiet quiet mode\n"); -} - -#define CHUNK_SIZE 2047 -uint_8 buf[CHUNK_SIZE]; -FILE *in_file; - -ssize_t fill_buffer(uint_8 **start,uint_8 **end) -{ - uint_32 bytes_read; - - *start = buf; - - bytes_read = fread(*start,1,CHUNK_SIZE,in_file); - - if (feof(in_file) || ferror(in_file) || bytes_read < CHUNK_SIZE) { - end_flag = 1; - return EOF; - } - - *end = *start + bytes_read; - return bytes_read; -} - -static void ac3dec_signal_handler(int signal) -{ - if (!quiet) - fprintf(stderr, "Aborted...\n"); - // it's important to close the PCM handle(s), because - // some driver settings have to be recovered - output_close(); - fclose(in_file); - exit(EXIT_FAILURE); -} - -int main(int argc,char *argv[]) -{ - struct option long_option[] = - { - {"help", 0, NULL, 'h'}, - {"version", 0, NULL, 'v'}, - {"device", 1, NULL, 'D'}, - {"4ch", 0, NULL, '4'}, - {"6ch", 0, NULL, '6'}, - {"card", 1, NULL, 'c'}, - {"iec958c", 0, NULL, 'C'}, - {"spdif", 0, NULL, 'C'}, - {"iec958p", 0, NULL, 'P'}, - {"iec958r", 0, NULL, 'R'}, - {"hdmi", 0, NULL, 'H'}, - {"zero", 1, NULL, 'Z'}, - {"quiet", 0, NULL, 'q'}, - {NULL, 0, NULL, 0}, - }; - ac3_config_t ac3_config; - output_t out_config; - int morehelp, loop = 0; - int zero = 0; - - bzero(&ac3_config, sizeof(ac3_config)); - ac3_config.fill_buffer_callback = fill_buffer; - ac3_config.num_output_ch = 2; - ac3_config.flags = 0; - bzero(&out_config, sizeof(out_config)); - out_config.pcm_name = NULL; - out_config.card = NULL; - out_config.bits = 16; - out_config.rate = 48000; - out_config.channels = 2; - out_config.spdif = SPDIF_NONE; - out_config.hdmi = 0; - - if (isatty(fileno(stdin)) && (argc == 1)) { - help(); - return 1; - } - - morehelp = 0; - while (1) { - int c; - - if ((c = getopt_long(argc, argv, "hvc:D:46HCPRZ:q", long_option, NULL)) < 0) - break; - switch (c) { - case 'h': - morehelp++; - break; - case 'v': - printf("ac3dec version " VERSION "\n"); - return 1; - case 'c': - out_config.card = strdup(optarg); - break; - case 'D': - out_config.pcm_name = optarg; - break; - case '4': - if (out_config.spdif == SPDIF_NONE) - ac3_config.num_output_ch = 4; - break; - case '6': - if (out_config.spdif == SPDIF_NONE) - ac3_config.num_output_ch = 6; - break; - case 'C': - ac3_config.num_output_ch = 2; - out_config.spdif = SPDIF_CON; - break; - case 'P': - ac3_config.num_output_ch = 2; - out_config.spdif = SPDIF_PRO; - break; - case 'R': - ac3_config.num_output_ch = 2; - out_config.spdif = SPDIF_PCM; - break; - case 'H': - out_config.hdmi = 1; - break; - case 'Z': - zero = atoi(optarg); - break; - case 'q': - ac3_config.flags |= AC3_QUIET; - out_config.quiet = 1; - quiet = 1; - break; - default: - fprintf(stderr, "\07Invalid switch or option needs an argument.\n"); - morehelp++; - } - } - out_config.channels = ac3_config.num_output_ch; - if (morehelp) { - help(); - return 1; - } - - while (1) { - if (argc - optind <= 0) { - if (loop || end_flag) - break; - in_file = stdin; - } else { - in_file = fopen(argv[optind],"r"); - if(!in_file) { - fprintf(stderr,"%s - Couldn't open file %s\n",strerror(errno),argv[optind]); - exit(EXIT_FAILURE); - } - optind++; - loop++; - } - if ((out_config.spdif == SPDIF_NONE) || (out_config.spdif == SPDIF_PCM)) { - ac3_frame_t *ac3_frame; - ac3_init(&ac3_config); - ac3_frame = ac3_decode_frame(); - out_config.rate = ac3_frame->sampling_rate; - if (output_open(&out_config) < 0) { - fprintf(stderr, "Output open failed\n"); - exit(EXIT_FAILURE); - } - signal(SIGINT, ac3dec_signal_handler); - signal(SIGTERM, ac3dec_signal_handler); - signal(SIGABRT, ac3dec_signal_handler); - do { - //Send the samples to the output device - output_play(ac3_frame->audio_data, 256 * 6); - } while((ac3_frame = ac3_decode_frame())); - } else { - uint_8 *start, *end; - init_spdif(); - if (output_open(&out_config) < 0) { - fprintf(stderr, "Output open failed\n"); - exit(EXIT_FAILURE); - } - signal(SIGINT, ac3dec_signal_handler); - signal(SIGTERM, ac3dec_signal_handler); - signal(SIGABRT, ac3dec_signal_handler); - if (zero > 0) - output_spdif_zero(zero); - else - output_spdif_leadin(); - while (fill_buffer(&start, &end) > 0) - if (output_spdif(start, end, quiet) < 0) - break; - } - output_close(); - fclose(in_file); - } - return EXIT_SUCCESS; -} diff --git a/ac3dec/ac3spdif.c b/ac3dec/ac3spdif.c deleted file mode 100644 index 3a568a4..0000000 --- a/ac3dec/ac3spdif.c +++ /dev/null @@ -1,166 +0,0 @@ -/***************************************************************************/ -/* This code has been fully inspired from various place */ -/* I will give their name later. May they be bless .... It works */ -/* */ -/* For the moment test it. */ -/* */ -/* 27-08-00 -- Ze'ev Maor -- fixed recovery from flase syncword detection */ -/* */ -/* 24-08-00 -- Ze'ev Maor -- Modified for integrtion with DXR3-OMS-plugin */ -/***************************************************************************/ - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "output.h" - -void swab(const void*, void*, size_t); - -#define BLOCK_SIZE 6144 - -static unsigned char buf[BLOCK_SIZE]; -static uint32_t sbuffer_size; -static syncinfo_t syncinfo; -static char *sbuffer; -static int done_banner; - -static uint32_t -buffer_syncframe(syncinfo_t *syncinfo, uint8_t **start, uint8_t *end) -{ - uint8_t *cur = *start; - uint16_t syncword = syncinfo->syncword; - uint32_t ret = 0; - - // - // Find an ac3 sync frame. - // - while(syncword != 0x0b77) - { - if(cur >= end) - goto done; - syncword = (syncword << 8) + *cur++; - } - - //need the next 3 bytes to decide how big the frame is - while(sbuffer_size < 3) - { - if(cur >= end) - goto done; - - sbuffer[sbuffer_size++] = *cur++; - } - - parse_syncinfo_data(syncinfo,sbuffer); - - while(sbuffer_size < (uint32_t)syncinfo->frame_size * 2 - 2) - { - if(cur >= end) - goto done; - - sbuffer[sbuffer_size++] = *cur++; - } - - crc_init(); - crc_process_frame(sbuffer,syncinfo->frame_size * 2 - 2); - - if(!crc_validate()) - { - //error_flag = 1; - fprintf(stderr,"** CRC failed - skipping frame **\n"); - syncword = 0xffff; - sbuffer_size = 0; - bzero(buf,BLOCK_SIZE); - - goto done; - } - // - //if we got to this point, we found a valid ac3 frame to decode - // - - //reset the syncword for next time - syncword = 0xffff; - sbuffer_size = 0; - ret = 1; - - done: - syncinfo->syncword = syncword; - *start = cur; - return ret; -} - -void -init_spdif(void) -{ - sbuffer_size = 0; - sbuffer = &buf[10]; - done_banner = 0; -} - -int -output_spdif_zero(int frames) -{ - int res; - - buf[0] = 0x72; buf[1] = 0xf8; // spdif syncword - buf[2] = 0x1f; buf[3] = 0x4e; // .............. - buf[4] = 0x00; // null frame (no data) - buf[5] = 7 << 5; // stream = 7 - buf[6] = 0x00; buf[7] = 0x00; // frame size - memset(&buf[8], 0, BLOCK_SIZE - 8); - while (frames-- > 0) { - res = output_play((short *)buf, BLOCK_SIZE / 2 / 2); /* 2 channels, 16-bit samples */ - if (res < 0) - return res; - } - return 0; -} - -int -output_spdif_leadin(void) -{ - memset(buf, 0, 8); - return output_play((short *)buf, 8); -} - -int -output_spdif(uint8_t *data_start, uint8_t *data_end, int quiet) -{ - int ret = 0, res; - - while(buffer_syncframe(&syncinfo, &data_start, data_end)) - { - buf[0] = 0x72; buf[1] = 0xf8; // spdif syncword - buf[2] = 0x1f; buf[3] = 0x4e; // .............. - buf[4] = 0x01; // AC3 data - buf[5] = buf[13] & 7; // bsmod, stream = 0 - buf[6] = (syncinfo.frame_size * 16) & 0xff; - buf[7] = ((syncinfo.frame_size * 16) >> 8) & 0xff; - buf[8] = 0x77; buf[9] = 0x0b; // AC3 syncwork - - if (!done_banner && !quiet) { - fprintf(stdout,"AC3 Stream "); - fprintf(stdout,"%2.1f KHz",syncinfo.sampling_rate * 1e-3); - fprintf(stdout,"%4d kbps",syncinfo.bit_rate); - fprintf(stdout,"\n"); - done_banner = 1; - } - -#ifndef _a_b_c_d_e_f /* WORDS_BIGENDIAN */ - // extract_ac3 seems to write swabbed data - swab(&buf[10], &buf[10], syncinfo.frame_size * 2 - 2); -#endif - res = output_play((short *)buf, BLOCK_SIZE / 2 / 2); /* 2 channels, 16-bit samples */ - ret = ret < 0 ? ret : res; - bzero(buf,BLOCK_SIZE); - } - return ret; -} diff --git a/ac3dec/autogen.sh b/ac3dec/autogen.sh deleted file mode 100644 index e538fa7..0000000 --- a/ac3dec/autogen.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/sh -# Run this to generate all the initial makefiles, etc. -# This was lifted from the Gimp, and adapted slightly by -# Raph Levien . - -DIE=0 - -PROG=ac3dec - -(autoconf --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $PROG." - echo "Download the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -# Do we really need libtool? -#(libtool --version) < /dev/null > /dev/null 2>&1 || { -# echo -# echo "You must have libtool installed to compile $PROG." -# echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2.tar.gz" -# echo "(or a newer version if it is available)" -# DIE=1 -#} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have automake installed to compile $PROG." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake-1.3.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 -} - -if test "$DIE" -eq 1; then - exit 1 -fi - -if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." -fi - -for dir in . -do - echo processing $dir - (cd $dir; \ - aclocalinclude="$ACLOCAL_FLAGS"; \ - aclocal $aclocalinclude; \ - autoheader; automake --foreign -a; autoconf) -done -./configure "$@" - -echo -echo "Now type 'make' to compile $PROG." diff --git a/ac3dec/configure.in b/ac3dec/configure.in deleted file mode 100644 index 8d5d41b..0000000 --- a/ac3dec/configure.in +++ /dev/null @@ -1,30 +0,0 @@ -dnl Autoconf configuration script ac3dec -dnl -dnl Aaron Holtzman - May 1999 -dnl -AC_INIT(ac3dec.c) -AM_CONFIG_HEADER(config.h) -AC_CANONICAL_HOST -AC_PREREQ(2.13) -AM_INIT_AUTOMAKE(ac3dec, 0.6.1) - -AM_MAINTAINER_MODE -AC_PROG_CC -AC_PROG_GCC_TRADITIONAL -AC_PROG_RANLIB - -AC_C_BIGENDIAN - -AM_PATH_ALSA(1.0.0) - -dnl Set the appropriate architecture define -dnl case "$host" in -dnl i?86-*) AC_DEFINE(__i386__, 1, [Using i386 architecture]);; -dnl alpha*-*) AC_DEFINE(__alpha__, 1, [Using Alpha architecture]);; -dnl sparc-*) AC_DEFINE(__sparc__, 1, [Using SPARC architecture]);; -dnl ppc-*|powerpc-*) AC_DEFINE(__ppc__, 1, [Using PowerPC architecture]);; -dnl ia64-*) AC_DEFINE(__ia64__, 1, [Using IA-64 architecture]);; -dnl *) echo "$host is not currently supported by ac3dec"; exit 1;; -dnl esac - -AC_OUTPUT(libac3/Makefile tools/Makefile test/Makefile Makefile ) diff --git a/ac3dec/gitcompile b/ac3dec/gitcompile deleted file mode 100755 index 694d5c2..0000000 --- a/ac3dec/gitcompile +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -aclocal $ACLOCAL_FLAGS || exit 1 -autoheader || exit 1 -automake --add-missing --copy --foreign || exit 1 -touch depcomp || exit 1 -autoconf || exit 1 -./configure $* || exit 1 -if [ -z "$GITCOMPILE_NO_MAKE" ]; then - make || exit 1 -fi diff --git a/ac3dec/libac3/Makefile.am b/ac3dec/libac3/Makefile.am deleted file mode 100644 index 5d60a66..0000000 --- a/ac3dec/libac3/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -# # Process this file with automake to produce Makefile.in. -AUTOMAKE_OPTIONS = 1.3 foreign - -CFLAGS = -Wall -O1 -g - -noinst_LIBRARIES = libac3.a - -libac3_a_SOURCES = bitstream.c decode.c imdct.c coeff.c exponent.c stats.c\ - bit_allocate.c parse.c crc.c debug.c rematrix.c downmix.c dither.c \ - sanity_check.c - -noinst_HEADERS = ac3_internal.h bitstream.h decode.h imdct.h ac3.h stats.h coeff.h\ - exponent.h bit_allocate.h parse.h crc.h debug.h rematrix.h downmix.h dither.h \ - sanity_check.h - diff --git a/ac3dec/libac3/ac3.h b/ac3dec/libac3/ac3.h deleted file mode 100644 index d0ba1b7..0000000 --- a/ac3dec/libac3/ac3.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * ac3.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - -#ifndef AARONS_TYPES -#define AARONS_TYPES -typedef unsigned long long uint_64; -typedef unsigned int uint_32; -typedef unsigned short uint_16; -typedef unsigned char uint_8; - -typedef signed long long sint_64; -typedef signed int sint_32; -typedef signed short sint_16; -typedef signed char sint_8; -#endif - -#define AC3_DOLBY_SURR_ENABLE 0x1 -#define AC3_3DNOW_ENABLE 0x2 -#define AC3_MMX_ENABLE 0x4 -#define AC3_ALTIVEC_ENABLE 0x8 -#define AC3_QUIET 0x10 - -typedef struct ac3_config_s -{ - //Bit flags that enable various things - uint_32 flags; - //Callback that points the decoder to new stream data - ssize_t (*fill_buffer_callback)(uint_8 **, uint_8 **); - //Number of discrete channels in final output (for downmixing) - uint_16 num_output_ch; - //Which channel of a dual mono stream to select - uint_16 dual_mono_ch_sel; -} ac3_config_t; - -typedef struct ac3_frame_s -{ - uint_32 sampling_rate; - sint_16 *audio_data; -} ac3_frame_t; - -void ac3_init(ac3_config_t *config); -ac3_frame_t* ac3_decode_frame(void); diff --git a/ac3dec/libac3/ac3_internal.h b/ac3dec/libac3/ac3_internal.h deleted file mode 100644 index 7a20c5b..0000000 --- a/ac3dec/libac3/ac3_internal.h +++ /dev/null @@ -1,344 +0,0 @@ -/* - * ac3_internal.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#ifndef __GNUC__ -#define inline -#endif - -/* Exponent strategy constants */ -#define EXP_REUSE (0) -#define EXP_D15 (1) -#define EXP_D25 (2) -#define EXP_D45 (3) - -/* Delta bit allocation constants */ -#define DELTA_BIT_REUSE (0) -#define DELTA_BIT_NEW (1) -#define DELTA_BIT_NONE (2) -#define DELTA_BIT_RESERVED (3) - -/* samples work structure */ -typedef float stream_samples_t[6][256]; - -/* global config structure */ -extern ac3_config_t ac3_config; -/* global error flag */ -extern uint_32 error_flag; - -/* Everything you wanted to know about band structure */ -/* - * The entire frequency domain is represented by 256 real - * floating point fourier coefficients. Only the lower 253 - * coefficients are actually utilized however. We use arrays - * of 256 to be efficient in some cases. - * - * The 5 full bandwidth channels (fbw) can have their higher - * frequencies coupled together. These coupled channels then - * share their high frequency components. - * - * This coupling band is broken up into 18 sub-bands starting - * at mantissa number 37. Each sub-band is 12 bins wide. - * - * There are 50 bit allocation sub-bands which cover the entire - * frequency range. The sub-bands are of non-uniform width, and - * approximate a 1/6 octave scale. - */ - -/* The following structures are filled in by their corresponding parse_* - * functions. See http://www.atsc.org/Standards/A52/a_52.pdf for - * full details on each field. Indented fields are used to denote - * conditional fields. - */ - -typedef struct syncinfo_s -{ - uint_32 magic; - /* Sync word == 0x0B77 */ - uint_16 syncword; - /* crc for the first 5/8 of the sync block */ - /* uint_16 crc1; */ - /* Stream Sampling Rate (kHz) 0 = 48, 1 = 44.1, 2 = 32, 3 = reserved */ - uint_16 fscod; - /* Frame size code */ - uint_16 frmsizecod; - - /* Information not in the AC-3 bitstream, but derived */ - /* Frame size in 16 bit words */ - uint_16 frame_size; - /* Bit rate in kilobits */ - uint_16 bit_rate; - /* sampling rate in hertz */ - uint_32 sampling_rate; - -} syncinfo_t; - -typedef struct bsi_s -{ - uint_32 magic; - /* Bit stream identification == 0x8 */ - uint_16 bsid; - /* Bit stream mode */ - uint_16 bsmod; - /* Audio coding mode */ - uint_16 acmod; - /* If we're using the centre channel then */ - /* centre mix level */ - uint_16 cmixlev; - /* If we're using the surround channel then */ - /* surround mix level */ - uint_16 surmixlev; - /* If we're in 2/0 mode then */ - /* Dolby surround mix level - NOT USED - */ - uint_16 dsurmod; - /* Low frequency effects on */ - uint_16 lfeon; - /* Dialogue Normalization level */ - uint_16 dialnorm; - /* Compression exists */ - uint_16 compre; - /* Compression level */ - uint_16 compr; - /* Language code exists */ - uint_16 langcode; - /* Language code */ - uint_16 langcod; - /* Audio production info exists*/ - uint_16 audprodie; - uint_16 mixlevel; - uint_16 roomtyp; - /* If we're in dual mono mode (acmod == 0) then extra stuff */ - uint_16 dialnorm2; - uint_16 compr2e; - uint_16 compr2; - uint_16 langcod2e; - uint_16 langcod2; - uint_16 audprodi2e; - uint_16 mixlevel2; - uint_16 roomtyp2; - /* Copyright bit */ - uint_16 copyrightb; - /* Original bit */ - uint_16 origbs; - /* Timecode 1 exists */ - uint_16 timecod1e; - /* Timecode 1 */ - uint_16 timecod1; - /* Timecode 2 exists */ - uint_16 timecod2e; - /* Timecode 2 */ - uint_16 timecod2; - /* Additional bit stream info exists */ - uint_16 addbsie; - /* Additional bit stream length - 1 (in bytes) */ - uint_16 addbsil; - /* Additional bit stream information (max 64 bytes) */ - uint_8 addbsi[64]; - - /* Information not in the AC-3 bitstream, but derived */ - /* Number of channels (excluding LFE) - * Derived from acmod */ - uint_16 nfchans; -} bsi_t; - - -/* more pain */ -typedef struct audblk_s -{ - uint_32 magic1; - /* block switch bit indexed by channel num */ - uint_16 blksw[5]; - /* dither enable bit indexed by channel num */ - uint_16 dithflag[5]; - /* dynamic range gain exists */ - uint_16 dynrnge; - /* dynamic range gain */ - uint_16 dynrng; - /* if acmod==0 then */ - /* dynamic range 2 gain exists */ - uint_16 dynrng2e; - /* dynamic range 2 gain */ - uint_16 dynrng2; - /* coupling strategy exists */ - uint_16 cplstre; - /* coupling in use */ - uint_16 cplinu; - /* channel coupled */ - uint_16 chincpl[5]; - /* if acmod==2 then */ - /* Phase flags in use */ - uint_16 phsflginu; - /* coupling begin frequency code */ - uint_16 cplbegf; - /* coupling end frequency code */ - uint_16 cplendf; - /* coupling band structure bits */ - uint_16 cplbndstrc[18]; - /* Do coupling co-ords exist for this channel? */ - uint_16 cplcoe[5]; - /* Master coupling co-ordinate */ - uint_16 mstrcplco[5]; - /* Per coupling band coupling co-ordinates */ - uint_16 cplcoexp[5][18]; - uint_16 cplcomant[5][18]; - /* Phase flags for dual mono */ - uint_16 phsflg[18]; - /* Is there a rematrixing strategy */ - uint_16 rematstr; - /* Rematrixing bits */ - uint_16 rematflg[4]; - /* Coupling exponent strategy */ - uint_16 cplexpstr; - /* Exponent strategy for full bandwidth channels */ - uint_16 chexpstr[5]; - /* Exponent strategy for lfe channel */ - uint_16 lfeexpstr; - /* Channel bandwidth for independent channels */ - uint_16 chbwcod[5]; - /* The absolute coupling exponent */ - uint_16 cplabsexp; - /* Coupling channel exponents (D15 mode gives 18 * 12 /3 encoded exponents */ - uint_16 cplexps[18 * 12 / 3]; - /* Sanity checking constant */ - uint_32 magic2; - /* fbw channel exponents */ - uint_16 exps[5][252 / 3]; - /* channel gain range */ - uint_16 gainrng[5]; - /* low frequency exponents */ - uint_16 lfeexps[3]; - - /* Bit allocation info */ - uint_16 baie; - /* Slow decay code */ - uint_16 sdcycod; - /* Fast decay code */ - uint_16 fdcycod; - /* Slow gain code */ - uint_16 sgaincod; - /* dB per bit code */ - uint_16 dbpbcod; - /* masking floor code */ - uint_16 floorcod; - - /* SNR offset info */ - uint_16 snroffste; - /* coarse SNR offset */ - uint_16 csnroffst; - /* coupling fine SNR offset */ - uint_16 cplfsnroffst; - /* coupling fast gain code */ - uint_16 cplfgaincod; - /* fbw fine SNR offset */ - uint_16 fsnroffst[5]; - /* fbw fast gain code */ - uint_16 fgaincod[5]; - /* lfe fine SNR offset */ - uint_16 lfefsnroffst; - /* lfe fast gain code */ - uint_16 lfefgaincod; - - /* Coupling leak info */ - uint_16 cplleake; - /* coupling fast leak initialization */ - uint_16 cplfleak; - /* coupling slow leak initialization */ - uint_16 cplsleak; - - /* delta bit allocation info */ - uint_16 deltbaie; - /* coupling delta bit allocation exists */ - uint_16 cpldeltbae; - /* fbw delta bit allocation exists */ - uint_16 deltbae[5]; - /* number of cpl delta bit segments */ - uint_16 cpldeltnseg; - /* coupling delta bit allocation offset */ - uint_16 cpldeltoffst[8]; - /* coupling delta bit allocation length */ - uint_16 cpldeltlen[8]; - /* coupling delta bit allocation length */ - uint_16 cpldeltba[8]; - /* number of delta bit segments */ - uint_16 deltnseg[5]; - /* fbw delta bit allocation offset */ - uint_16 deltoffst[5][8]; - /* fbw delta bit allocation length */ - uint_16 deltlen[5][8]; - /* fbw delta bit allocation length */ - uint_16 deltba[5][8]; - - /* skip length exists */ - uint_16 skiple; - /* skip length */ - uint_16 skipl; - - //Removed Feb 2000 -ah - /* channel mantissas */ - //uint_16 chmant[5][256]; - - /* coupling mantissas */ - uint_16 cplmant[256]; - - //Removed Feb 2000 -ah - /* coupling mantissas */ - //uint_16 lfemant[7]; - - - /* -- Information not in the bitstream, but derived thereof -- */ - - /* Number of coupling sub-bands */ - uint_16 ncplsubnd; - - /* Number of combined coupling sub-bands - * Derived from ncplsubnd and cplbndstrc */ - uint_16 ncplbnd; - - /* Number of exponent groups by channel - * Derived from strmant, endmant */ - uint_16 nchgrps[5]; - - /* Number of coupling exponent groups - * Derived from cplbegf, cplendf, cplexpstr */ - uint_16 ncplgrps; - - /* End mantissa numbers of fbw channels */ - uint_16 endmant[5]; - - /* Start and end mantissa numbers for the coupling channel */ - uint_16 cplstrtmant; - uint_16 cplendmant; - - /* Decoded exponent info */ - uint_16 fbw_exp[5][256]; - uint_16 cpl_exp[256]; - uint_16 lfe_exp[7]; - - /* Bit allocation pointer results */ - uint_16 fbw_bap[5][256]; - uint_16 cpl_bap[256]; - uint_16 lfe_bap[7]; - - uint_32 magic3; -} audblk_t; - - diff --git a/ac3dec/libac3/bit_allocate.c b/ac3dec/libac3/bit_allocate.c deleted file mode 100644 index 053e09c..0000000 --- a/ac3dec/libac3/bit_allocate.c +++ /dev/null @@ -1,494 +0,0 @@ -/* - * bit_allocate.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include -#include -#include "ac3.h" -#include "ac3_internal.h" - - - -static inline sint_16 logadd(sint_16 a,sint_16 b); -static sint_16 calc_lowcomp(sint_16 a,sint_16 b0,sint_16 b1,sint_16 bin); -static inline uint_16 min(sint_16 a,sint_16 b); -static inline uint_16 max(sint_16 a,sint_16 b); -static void ba_compute_psd(sint_16 start, sint_16 end, sint_16 exps[], - sint_16 psd[], sint_16 bndpsd[]); - -static void ba_compute_excitation(sint_16 start, sint_16 end,sint_16 fgain, - sint_16 fastleak, sint_16 slowleak, sint_16 is_lfe, sint_16 bndpsd[], - sint_16 excite[]); -static void ba_compute_mask(sint_16 start, sint_16 end, uint_16 fscod, - uint_16 deltbae, uint_16 deltnseg, uint_16 deltoffst[], uint_16 deltba[], - uint_16 deltlen[], sint_16 excite[], sint_16 mask[]); -static void ba_compute_bap(sint_16 start, sint_16 end, sint_16 snroffset, - sint_16 psd[], sint_16 mask[], sint_16 bap[]); - -/* Misc LUTs for bit allocation process */ - -static sint_16 slowdec[] = { 0x0f, 0x11, 0x13, 0x15 }; -static sint_16 fastdec[] = { 0x3f, 0x53, 0x67, 0x7b }; -static sint_16 slowgain[] = { 0x540, 0x4d8, 0x478, 0x410 }; -static sint_16 dbpbtab[] = { 0x000, 0x700, 0x900, 0xb00 }; - -static uint_16 floortab[] = { 0x2f0, 0x2b0, 0x270, 0x230, 0x1f0, 0x170, 0x0f0, 0xf800 }; -static sint_16 fastgain[] = { 0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380, 0x400 }; - - -static sint_16 bndtab[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, - 34, 37, 40, 43, 46, 49, 55, 61, 67, 73, - 79, 85, 97, 109, 121, 133, 157, 181, 205, 229 }; - -static sint_16 bndsz[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, - 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, - 6, 12, 12, 12, 12, 24, 24, 24, 24, 24 }; - -static sint_16 masktab[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 28, 28, 29, - 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, - 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37, - 37, 37, 37, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 40, - 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 0, 0, 0 }; - - -static sint_16 latab[] = { 0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003b, 0x003a, 0x0039, - 0x0038, 0x0037, 0x0036, 0x0035, 0x0034, 0x0034, 0x0033, 0x0032, - 0x0031, 0x0030, 0x002f, 0x002f, 0x002e, 0x002d, 0x002c, 0x002c, - 0x002b, 0x002a, 0x0029, 0x0029, 0x0028, 0x0027, 0x0026, 0x0026, - 0x0025, 0x0024, 0x0024, 0x0023, 0x0023, 0x0022, 0x0021, 0x0021, - 0x0020, 0x0020, 0x001f, 0x001e, 0x001e, 0x001d, 0x001d, 0x001c, - 0x001c, 0x001b, 0x001b, 0x001a, 0x001a, 0x0019, 0x0019, 0x0018, - 0x0018, 0x0017, 0x0017, 0x0016, 0x0016, 0x0015, 0x0015, 0x0015, - 0x0014, 0x0014, 0x0013, 0x0013, 0x0013, 0x0012, 0x0012, 0x0012, - 0x0011, 0x0011, 0x0011, 0x0010, 0x0010, 0x0010, 0x000f, 0x000f, - 0x000f, 0x000e, 0x000e, 0x000e, 0x000d, 0x000d, 0x000d, 0x000d, - 0x000c, 0x000c, 0x000c, 0x000c, 0x000b, 0x000b, 0x000b, 0x000b, - 0x000a, 0x000a, 0x000a, 0x000a, 0x000a, 0x0009, 0x0009, 0x0009, - 0x0009, 0x0009, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, - 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0006, 0x0006, - 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x0005, 0x0005, - 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0004, 0x0004, - 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, - 0x0004, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, - 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0002, - 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, - 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, 0x0002, - 0x0002, 0x0002, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, - 0x0001, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000}; - -static sint_16 hth[][50] = {{ 0x04d0, 0x04d0, 0x0440, 0x0400, 0x03e0, 0x03c0, 0x03b0, 0x03b0, - 0x03a0, 0x03a0, 0x03a0, 0x03a0, 0x03a0, 0x0390, 0x0390, 0x0390, - 0x0380, 0x0380, 0x0370, 0x0370, 0x0360, 0x0360, 0x0350, 0x0350, - 0x0340, 0x0340, 0x0330, 0x0320, 0x0310, 0x0300, 0x02f0, 0x02f0, - 0x02f0, 0x02f0, 0x0300, 0x0310, 0x0340, 0x0390, 0x03e0, 0x0420, - 0x0460, 0x0490, 0x04a0, 0x0460, 0x0440, 0x0440, 0x0520, 0x0800, - 0x0840, 0x0840 }, - - { 0x04f0, 0x04f0, 0x0460, 0x0410, 0x03e0, 0x03d0, 0x03c0, 0x03b0, - 0x03b0, 0x03a0, 0x03a0, 0x03a0, 0x03a0, 0x03a0, 0x0390, 0x0390, - 0x0390, 0x0380, 0x0380, 0x0380, 0x0370, 0x0370, 0x0360, 0x0360, - 0x0350, 0x0350, 0x0340, 0x0340, 0x0320, 0x0310, 0x0300, 0x02f0, - 0x02f0, 0x02f0, 0x02f0, 0x0300, 0x0320, 0x0350, 0x0390, 0x03e0, - 0x0420, 0x0450, 0x04a0, 0x0490, 0x0460, 0x0440, 0x0480, 0x0630, - 0x0840, 0x0840 }, - - { 0x0580, 0x0580, 0x04b0, 0x0450, 0x0420, 0x03f0, 0x03e0, 0x03d0, - 0x03c0, 0x03b0, 0x03b0, 0x03b0, 0x03a0, 0x03a0, 0x03a0, 0x03a0, - 0x03a0, 0x03a0, 0x03a0, 0x03a0, 0x0390, 0x0390, 0x0390, 0x0390, - 0x0380, 0x0380, 0x0380, 0x0370, 0x0360, 0x0350, 0x0340, 0x0330, - 0x0320, 0x0310, 0x0300, 0x02f0, 0x02f0, 0x02f0, 0x0300, 0x0310, - 0x0330, 0x0350, 0x03c0, 0x0410, 0x0470, 0x04a0, 0x0460, 0x0440, - 0x0450, 0x04e0 }}; - - -static sint_16 baptab[] = { 0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, - 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, - 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, - 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15 }; - -static sint_16 sdecay; -static sint_16 fdecay; -static sint_16 sgain; -static sint_16 dbknee; -static sint_16 floor; -static sint_16 psd[256]; -static sint_16 bndpsd[256]; -static sint_16 excite[256]; -static sint_16 mask[256]; - -static inline uint_16 -max(sint_16 a,sint_16 b) -{ - return (a > b ? a : b); -} - -static inline uint_16 -min(sint_16 a,sint_16 b) -{ - return (a < b ? a : b); -} - -static inline sint_16 -logadd(sint_16 a,sint_16 b) -{ - sint_16 c; - sint_16 address; - - c = a - b; - address = min((abs(c) >> 1), 255); - - if (c >= 0) - return(a + latab[address]); - else - return(b + latab[address]); -} - - -void bit_allocate(uint_16 fscod, bsi_t *bsi, audblk_t *audblk) -{ - uint_16 i; - sint_16 fgain; - sint_16 snroffset; - sint_16 start; - sint_16 end; - sint_16 fastleak; - sint_16 slowleak; - - /* Only perform bit_allocation if the exponents have changed or we - * have new sideband information */ - if (audblk->chexpstr[0] == 0 && audblk->chexpstr[1] == 0 && - audblk->chexpstr[2] == 0 && audblk->chexpstr[3] == 0 && - audblk->chexpstr[4] == 0 && audblk->cplexpstr == 0 && - audblk->lfeexpstr == 0 && audblk->baie == 0 && - audblk->snroffste == 0 && audblk->deltbaie == 0) - return; - - /* Do some setup before we do the bit alloc */ - sdecay = slowdec[audblk->sdcycod]; - fdecay = fastdec[audblk->fdcycod]; - sgain = slowgain[audblk->sgaincod]; - dbknee = dbpbtab[audblk->dbpbcod]; - floor = floortab[audblk->floorcod]; - - /* if all the SNR offset constants are zero then the whole block is zero */ - if(!audblk->csnroffst && !audblk->fsnroffst[0] && - !audblk->fsnroffst[1] && !audblk->fsnroffst[2] && - !audblk->fsnroffst[3] && !audblk->fsnroffst[4] && - !audblk->cplfsnroffst && !audblk->lfefsnroffst) - { - memset(audblk->fbw_bap,0,sizeof(uint_16) * 256 * 5); - memset(audblk->cpl_bap,0,sizeof(uint_16) * 256); - memset(audblk->lfe_bap,0,sizeof(uint_16) * 7); - return; - } - - - for(i = 0; i < bsi->nfchans; i++) - { - start = 0; - end = audblk->endmant[i] ; - fgain = fastgain[audblk->fgaincod[i]]; - snroffset = (((audblk->csnroffst - 15) << 4) + audblk->fsnroffst[i]) << 2 ; - fastleak = 0; - slowleak = 0; - - ba_compute_psd(start, end, audblk->fbw_exp[i], psd, bndpsd); - - ba_compute_excitation(start, end , fgain, fastleak, slowleak, 0, bndpsd, excite); - - ba_compute_mask(start, end, fscod, audblk->deltbae[i], audblk->deltnseg[i], - audblk->deltoffst[i], audblk->deltba[i], audblk->deltlen[i], excite, mask); - - ba_compute_bap(start, end, snroffset, psd, mask, audblk->fbw_bap[i]); - } - - if(audblk->cplinu) - { - start = audblk->cplstrtmant; - end = audblk->cplendmant; - fgain = fastgain[audblk->cplfgaincod]; - snroffset = (((audblk->csnroffst - 15) << 4) + audblk->cplfsnroffst) << 2 ; - fastleak = (audblk->cplfleak << 8) + 768; - slowleak = (audblk->cplsleak << 8) + 768; - - ba_compute_psd(start, end, audblk->cpl_exp, psd, bndpsd); - - ba_compute_excitation(start, end , fgain, fastleak, slowleak, 0, bndpsd, excite); - - ba_compute_mask(start, end, fscod, audblk->cpldeltbae, audblk->cpldeltnseg, - audblk->cpldeltoffst, audblk->cpldeltba, audblk->cpldeltlen, excite, mask); - - ba_compute_bap(start, end, snroffset, psd, mask, audblk->cpl_bap); - } - - if(bsi->lfeon) - { - start = 0; - end = 7; - fgain = fastgain[audblk->lfefgaincod]; - snroffset = (((audblk->csnroffst - 15) << 4) + audblk->lfefsnroffst) << 2 ; - fastleak = 0; - slowleak = 0; - - ba_compute_psd(start, end, audblk->lfe_exp, psd, bndpsd); - - ba_compute_excitation(start, end , fgain, fastleak, slowleak, 1, bndpsd, excite); - - /* Perform no delta bit allocation for lfe */ - ba_compute_mask(start, end, fscod, 2, 0, 0, 0, 0, excite, mask); - - ba_compute_bap(start, end, snroffset, psd, mask, audblk->lfe_bap); - } -} - - -static void ba_compute_psd(sint_16 start, sint_16 end, sint_16 exps[], - sint_16 psd[], sint_16 bndpsd[]) -{ - int bin,i,j,k; - sint_16 lastbin = 0; - - /* Map the exponents into dBs */ - for (bin=start; bin lastbin); -} - -static void ba_compute_excitation(sint_16 start, sint_16 end,sint_16 fgain, - sint_16 fastleak, sint_16 slowleak, sint_16 is_lfe, sint_16 bndpsd[], - sint_16 excite[]) -{ - int bin; - sint_16 bndstrt; - sint_16 bndend; - sint_16 lowcomp = 0; - sint_16 begin = 0; - - /* Compute excitation function */ - bndstrt = masktab[start]; - bndend = masktab[end - 1] + 1; - - if (bndstrt == 0) /* For fbw and lfe channels */ - { - lowcomp = calc_lowcomp(lowcomp, bndpsd[0], bndpsd[1], 0); - excite[0] = bndpsd[0] - fgain - lowcomp; - lowcomp = calc_lowcomp(lowcomp, bndpsd[1], bndpsd[2], 1); - excite[1] = bndpsd[1] - fgain - lowcomp; - begin = 7 ; - - /* Note: Do not call calc_lowcomp() for the last band of the lfe channel, (bin = 6) */ - for (bin = 2; bin < 7; bin++) - { - if (!(is_lfe && (bin == 6))) - lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin+1], bin); - fastleak = bndpsd[bin] - fgain; - slowleak = bndpsd[bin] - sgain; - excite[bin] = fastleak - lowcomp; - - if (!(is_lfe && (bin == 6))) - { - if (bndpsd[bin] <= bndpsd[bin+1]) - { - begin = bin + 1 ; - break; - } - } - } - - for (bin = begin; bin < min(bndend, 22); bin++) - { - if (!(is_lfe && (bin == 6))) - lowcomp = calc_lowcomp(lowcomp, bndpsd[bin], bndpsd[bin+1], bin); - fastleak -= fdecay ; - fastleak = max(fastleak, bndpsd[bin] - fgain); - slowleak -= sdecay ; - slowleak = max(slowleak, bndpsd[bin] - sgain); - excite[bin] = max(fastleak - lowcomp, slowleak); - } - begin = 22; - } - else /* For coupling channel */ - { - begin = bndstrt; - } - - for (bin = begin; bin < bndend; bin++) - { - fastleak -= fdecay; - fastleak = max(fastleak, bndpsd[bin] - fgain); - slowleak -= sdecay; - slowleak = max(slowleak, bndpsd[bin] - sgain); - excite[bin] = max(fastleak, slowleak) ; - } -} - -static void ba_compute_mask(sint_16 start, sint_16 end, uint_16 fscod, - uint_16 deltbae, uint_16 deltnseg, uint_16 deltoffst[], uint_16 deltba[], - uint_16 deltlen[], sint_16 excite[], sint_16 mask[]) -{ - int bin,k; - sint_16 bndstrt; - sint_16 bndend; - sint_16 delta; - - bndstrt = masktab[start]; - bndend = masktab[end - 1] + 1; - - /* Compute the masking curve */ - - for (bin = bndstrt; bin < bndend; bin++) - { - if (bndpsd[bin] < dbknee) - { - excite[bin] += ((dbknee - bndpsd[bin]) >> 2); - } - mask[bin] = max(excite[bin], hth[fscod][bin]); - } - - /* Perform delta bit modulation if necessary */ - if ((deltbae == DELTA_BIT_REUSE) || (deltbae == DELTA_BIT_NEW)) - { - sint_16 band = 0; - sint_16 seg = 0; - - for (seg = 0; seg < deltnseg+1; seg++) - { - band += deltoffst[seg]; - if (deltba[seg] >= 4) - { - delta = (deltba[seg] - 3) << 7; - } - else - { - delta = (deltba[seg] - 4) << 7; - } - - for (k = 0; k < deltlen[seg]; k++) - { - mask[band] += delta; - band++; - } - } - } -} - -static void ba_compute_bap(sint_16 start, sint_16 end, sint_16 snroffset, - sint_16 psd[], sint_16 mask[], sint_16 bap[]) -{ - int i,j,k; - sint_16 lastbin = 0; - sint_16 address = 0; - - /* Compute the bit allocation pointer for each bin */ - i = start; - j = masktab[start]; - - do - { - lastbin = min(bndtab[j] + bndsz[j], end); - mask[j] -= snroffset; - mask[j] -= floor; - - if (mask[j] < 0) - mask[j] = 0; - - mask[j] &= 0x1fe0; - mask[j] += floor; - for (k = i; k < lastbin; k++) - { - address = (psd[i] - mask[j]) >> 5; - address = min(63, max(0, address)); - bap[i] = baptab[address]; - i++; - } - j++; - } while (end > lastbin); -} - -static sint_16 -calc_lowcomp(sint_16 a,sint_16 b0,sint_16 b1,sint_16 bin) -{ - - if (bin < 7) - { - if ((b0 + 256) == b1) - a = 384; - else if (b0 > b1) - a = max(0, a - 64); - } - else if (bin < 20) - { - if ((b0 + 256) == b1) - a = 320; - else if (b0 > b1) - a = max(0, a - 64) ; - } - else - a = max(0, a - 128); - - return(a); -} - diff --git a/ac3dec/libac3/bit_allocate.h b/ac3dec/libac3/bit_allocate.h deleted file mode 100644 index e48b0b2..0000000 --- a/ac3dec/libac3/bit_allocate.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * bit_allocate.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -void bit_allocate(uint_16 fscod, bsi_t *bsi, audblk_t *audblk); diff --git a/ac3dec/libac3/bitstream.c b/ac3dec/libac3/bitstream.c deleted file mode 100644 index 0e1dbc4..0000000 --- a/ac3dec/libac3/bitstream.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * bitstream.c - * - * Copyright (C) Aaron Holtzman - Dec 1999 - * - * This file is part of ac3dec, a free AC-3 audio decoder - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include -#include -#include - -#include "ac3.h" -#include "ac3_internal.h" -#include "bitstream.h" - -#define BUFFER_SIZE 4096 - -static uint_8 buffer[BUFFER_SIZE]; - -static uint_32 *buffer_start, *buffer_end; -static uint_8 *chunk_start, *chunk_end; - -uint_32 bits_left; -uint_32 current_word; - -ssize_t (*bitstream_fill_buffer)(uint_8**,uint_8**); - -int bitstream_get_byte(void) -{ - if(chunk_start == chunk_end) - if (bitstream_fill_buffer(&chunk_start,&chunk_end) <= 0) - return EOF; - - return (*chunk_start++); -} - -uint_8 *bitstream_get_buffer_start(void) -{ - return (uint_8 *) buffer_start; -} - -int -bitstream_buffer_frame(uint_32 frame_size) -{ - uint_32 bytes_read; - uint_32 num_bytes; - - bytes_read = 0; - - do - { - if(chunk_start > chunk_end) - printf("argh!\n"); - if(chunk_start == chunk_end) - if (bitstream_fill_buffer(&chunk_start,&chunk_end) <= 0) - return EOF; - - num_bytes = chunk_end - chunk_start; - - if(bytes_read + num_bytes > frame_size) - num_bytes = frame_size - bytes_read; - - memcpy(&buffer[bytes_read], chunk_start, num_bytes); - - bytes_read += num_bytes; - chunk_start += num_bytes; - } - while (bytes_read != frame_size); - - buffer_start = (uint_32 *) buffer; - buffer_end = (uint_32 *) (buffer + frame_size); - - bits_left = 0; - return 0; -} - - -static inline void -bitstream_fill_current() -{ - current_word = *buffer_start++; - current_word = swab32(current_word); -} - -// -// The fast paths for _get is in the -// bitstream.h header file so it can be inlined. -// -// The "bottom half" of this routine is suffixed _bh -// -// -ah -// - -uint_32 -bitstream_get_bh(uint_32 num_bits) -{ - uint_32 result; - - num_bits -= bits_left; - result = (current_word << (32 - bits_left)) >> (32 - bits_left); - - bitstream_fill_current(); - - if(num_bits != 0) - result = (result << num_bits) | (current_word >> (32 - num_bits)); - - bits_left = 32 - num_bits; - - return result; -} - -void -bitstream_init(ssize_t(*fill_function)(uint_8**,uint_8**)) -{ - // Setup the buffer fill callback - bitstream_fill_buffer = fill_function; -} diff --git a/ac3dec/libac3/bitstream.h b/ac3dec/libac3/bitstream.h deleted file mode 100644 index 5e0d8f0..0000000 --- a/ac3dec/libac3/bitstream.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * bitstream.h - * - * Copyright (C) Aaron Holtzman - Dec 1999 - * - * This file is part of ac3dec, a free AC-3 audio decoder - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -//My new and improved vego-matic endian swapping routine -//(stolen from the kernel) -#ifdef WORDS_BIGENDIAN - -# define swab32(x) (x) - -#else - -# if defined (__i386__) - -# define swab32(x) __i386_swab32(x) - static inline uint_32 __i386_swab32(uint_32 x) - { - __asm__("bswap %0" : "=r" (x) : "0" (x)); - return x; - } - -# else - -# define swab32(x)\ -((((uint_8*)&x)[0] << 24) | (((uint_8*)&x)[1] << 16) | \ - (((uint_8*)&x)[2] << 8) | (((uint_8*)&x)[3])) - -# endif -#endif - -extern uint_32 bits_left; -extern uint_32 current_word; - -void bitstream_init(ssize_t(*fill_function)(uint_8**,uint_8**)); - -int bitstream_get_byte(void); - -uint_8 *bitstream_get_buffer_start(void); -int bitstream_buffer_frame(uint_32 frame_size); - -uint_32 bitstream_get_bh(uint_32 num_bits); - -static inline uint_32 -bitstream_get(uint_32 num_bits) -{ - uint_32 result; - - if(num_bits < bits_left) - { - result = (current_word << (32 - bits_left)) >> (32 - num_bits); - bits_left -= num_bits; - return result; - } - - return bitstream_get_bh(num_bits); -} - diff --git a/ac3dec/libac3/coeff.c b/ac3dec/libac3/coeff.c deleted file mode 100644 index b9f03ff..0000000 --- a/ac3dec/libac3/coeff.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * coeff.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - - -#include -#include -#include "ac3.h" -#include "ac3_internal.h" - - -#include "decode.h" -#include "bitstream.h" -#include "dither.h" -#include "coeff.h" - -// -//Lookup tables of 0.15 two's complement quantization values -// -static const uint_16 q_1[3] = -{ - ( -2 << 15)/3, 0,( 2 << 15)/3 -}; - -static const uint_16 q_2[5] = -{ - ( -4 << 15)/5,( -2 << 15)/5, 0, - ( 2 << 15)/5,( 4 << 15)/5 -}; - -static const uint_16 q_3[7] = -{ - ( -6 << 15)/7,( -4 << 15)/7,( -2 << 15)/7, 0, - ( 2 << 15)/7,( 4 << 15)/7,( 6 << 15)/7 -}; - -static const uint_16 q_4[11] = -{ - (-10 << 15)/11,(-8 << 15)/11,(-6 << 15)/11, ( -4 << 15)/11,(-2 << 15)/11, 0, - ( 2 << 15)/11,( 4 << 15)/11,( 6 << 15)/11, ( 8 << 15)/11,(10 << 15)/11 -}; - -static const uint_16 q_5[15] = -{ - (-14 << 15)/15,(-12 << 15)/15,(-10 << 15)/15, - ( -8 << 15)/15,( -6 << 15)/15,( -4 << 15)/15, - ( -2 << 15)/15, 0 ,( 2 << 15)/15, - ( 4 << 15)/15,( 6 << 15)/15,( 8 << 15)/15, - ( 10 << 15)/15,( 12 << 15)/15,( 14 << 15)/15 -}; - -// -// Scale factors for convert_to_float -// - -static const uint_32 u32_scale_factors[25] = -{ - 0x38000000, //2 ^ -(0 + 15) - 0x37800000, //2 ^ -(1 + 15) - 0x37000000, //2 ^ -(2 + 15) - 0x36800000, //2 ^ -(3 + 15) - 0x36000000, //2 ^ -(4 + 15) - 0x35800000, //2 ^ -(5 + 15) - 0x35000000, //2 ^ -(6 + 15) - 0x34800000, //2 ^ -(7 + 15) - 0x34000000, //2 ^ -(8 + 15) - 0x33800000, //2 ^ -(9 + 15) - 0x33000000, //2 ^ -(10 + 15) - 0x32800000, //2 ^ -(11 + 15) - 0x32000000, //2 ^ -(12 + 15) - 0x31800000, //2 ^ -(13 + 15) - 0x31000000, //2 ^ -(14 + 15) - 0x30800000, //2 ^ -(15 + 15) - 0x30000000, //2 ^ -(16 + 15) - 0x2f800000, //2 ^ -(17 + 15) - 0x2f000000, //2 ^ -(18 + 15) - 0x2e800000, //2 ^ -(19 + 15) - 0x2e000000, //2 ^ -(20 + 15) - 0x2d800000, //2 ^ -(21 + 15) - 0x2d000000, //2 ^ -(22 + 15) - 0x2c800000, //2 ^ -(23 + 15) - 0x2c000000 //2 ^ -(24 + 15) -}; - -static float *scale_factor = (float*)u32_scale_factors; - -//These store the persistent state of the packed mantissas -static uint_16 m_1[3]; -static uint_16 m_2[3]; -static uint_16 m_4[2]; -static uint_16 m_1_pointer; -static uint_16 m_2_pointer; -static uint_16 m_4_pointer; - -//Conversion from bap to number of bits in the mantissas -//zeros account for cases 0,1,2,4 which are special cased -static uint_16 qnttztab[16] = { 0, 0, 0, 3, 0 , 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16}; - -static void coeff_reset(void); -static sint_16 coeff_get_mantissa(uint_16 bap, uint_16 dithflag); -static void coeff_uncouple_ch(float samples[],bsi_t *bsi,audblk_t *audblk,uint_32 ch); - -// -// Convert a 0.15 fixed point number into IEEE single -// precision floating point and scale by 2^-exp -// -static inline float -convert_to_float(uint_16 exp, sint_16 mantissa) -{ - float x; - - //the scale by 2^-15 is built into the scale factor table - x = mantissa * scale_factor[exp]; - - return x; -} - -void -coeff_unpack(bsi_t *bsi, audblk_t *audblk, stream_samples_t samples) -{ - uint_16 i,j; - uint_32 done_cpl = 0; - sint_16 mantissa; - - coeff_reset(); - - for(i=0; i< bsi->nfchans; i++) - { - for(j=0; j < audblk->endmant[i]; j++) - { - mantissa = coeff_get_mantissa(audblk->fbw_bap[i][j],audblk->dithflag[i]); - samples[i][j] = convert_to_float(audblk->fbw_exp[i][j],mantissa); - } - - if(audblk->cplinu && audblk->chincpl[i] && !(done_cpl)) - { - // ncplmant is equal to 12 * ncplsubnd - // Don't dither coupling channel until channel separation so that - // interchannel noise is uncorrelated - for(j=audblk->cplstrtmant; j < audblk->cplendmant; j++) - audblk->cplmant[j] = coeff_get_mantissa(audblk->cpl_bap[j],0); - done_cpl = 1; - } - } - - //uncouple the channel if necessary - if(audblk->cplinu) - { - for(i=0; i< bsi->nfchans; i++) - { - if(audblk->chincpl[i]) - coeff_uncouple_ch(samples[i],bsi,audblk,i); - } - - } - - if(bsi->lfeon) - { - // There are always 7 mantissas for lfe, no dither for lfe - for(j=0; j < 7 ; j++) - { - mantissa = coeff_get_mantissa(audblk->lfe_bap[j],0); - samples[5][j] = convert_to_float(audblk->lfe_exp[j],mantissa); - } - } -} - -// -//Fetch a mantissa from the bitstream -// -//The mantissa returned is a signed 0.15 fixed point number -// -static sint_16 -coeff_get_mantissa(uint_16 bap, uint_16 dithflag) -{ - uint_16 mantissa; - uint_16 group_code; - - //If the bap is 0-5 then we have special cases to take care of - switch(bap) - { - case 0: - if(dithflag) - mantissa = dither_gen(); - else - mantissa = 0; - break; - - case 1: - if(m_1_pointer > 2) - { - group_code = bitstream_get(5); - - if(group_code > 26) - goto error; - - m_1[0] = group_code / 9; - m_1[1] = (group_code % 9) / 3; - m_1[2] = (group_code % 9) % 3; - m_1_pointer = 0; - } - mantissa = m_1[m_1_pointer++]; - mantissa = q_1[mantissa]; - break; - case 2: - - if(m_2_pointer > 2) - { - group_code = bitstream_get(7); - - if(group_code > 124) - goto error; - - m_2[0] = group_code / 25; - m_2[1] = (group_code % 25) / 5 ; - m_2[2] = (group_code % 25) % 5 ; - m_2_pointer = 0; - } - mantissa = m_2[m_2_pointer++]; - mantissa = q_2[mantissa]; - break; - - case 3: - mantissa = bitstream_get(3); - - if(mantissa > 6) - goto error; - - mantissa = q_3[mantissa]; - break; - - case 4: - if(m_4_pointer > 1) - { - group_code = bitstream_get(7); - - if(group_code > 120) - goto error; - - m_4[0] = group_code / 11; - m_4[1] = group_code % 11; - m_4_pointer = 0; - } - mantissa = m_4[m_4_pointer++]; - mantissa = q_4[mantissa]; - break; - - case 5: - mantissa = bitstream_get(4); - - if(mantissa > 14) - goto error; - - mantissa = q_5[mantissa]; - break; - - default: - mantissa = bitstream_get(qnttztab[bap]); - mantissa <<= 16 - qnttztab[bap]; - } - - return mantissa; - - - -error: - if(!error_flag) - fprintf(stderr,"** Invalid mantissa - skipping frame **\n"); - error_flag = 1; - - return 0; -} - -// -// Reset the mantissa state -// -static void -coeff_reset(void) -{ - m_1[2] = m_1[1] = m_1[0] = 0; - m_2[2] = m_2[1] = m_2[0] = 0; - m_4[1] = m_4[0] = 0; - m_1_pointer = m_2_pointer = m_4_pointer = 3; -} - -// -// Uncouple the coupling channel into a fbw channel -// -static void -coeff_uncouple_ch(float samples[],bsi_t *bsi,audblk_t *audblk,uint_32 ch) -{ - uint_32 bnd = 0; - uint_32 sub_bnd = 0; - uint_32 i,j; - float cpl_coord = 1.0; - uint_32 cpl_exp_tmp; - uint_32 cpl_mant_tmp; - sint_16 mantissa; - - - for(i=audblk->cplstrtmant;icplendmant;) - { - if(!audblk->cplbndstrc[sub_bnd++]) - { - cpl_exp_tmp = audblk->cplcoexp[ch][bnd] + 3 * audblk->mstrcplco[ch]; - if(audblk->cplcoexp[ch][bnd] == 15) - cpl_mant_tmp = (audblk->cplcomant[ch][bnd]) << 11; - else - cpl_mant_tmp = ((0x10) | audblk->cplcomant[ch][bnd]) << 10; - - cpl_coord = convert_to_float(cpl_exp_tmp,cpl_mant_tmp) * 8.0f; - - //Invert the phase for the right channel if necessary - if(bsi->acmod == 0x2 && audblk->phsflginu && ch == 1 && audblk->phsflg[bnd]) - cpl_coord *= -1; - - bnd++; - } - - for(j=0;j < 12; j++) - { - //Get new dither values for each channel if necessary, so - //the channels are uncorrelated - if(audblk->dithflag[ch] && audblk->cpl_bap[i] == 0) - mantissa = dither_gen(); - else - mantissa = audblk->cplmant[i]; - - samples[i] = cpl_coord * convert_to_float(audblk->cpl_exp[i],mantissa); - - i++; - } - } -} diff --git a/ac3dec/libac3/coeff.h b/ac3dec/libac3/coeff.h deleted file mode 100644 index dc822a9..0000000 --- a/ac3dec/libac3/coeff.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * coeff.h - * - * Copyright (C) Aaron Holtzman - Feb 2000 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -void coeff_unpack(bsi_t *bsi, audblk_t *audblk,stream_samples_t samples); diff --git a/ac3dec/libac3/crc.c b/ac3dec/libac3/crc.c deleted file mode 100644 index 3210ce7..0000000 --- a/ac3dec/libac3/crc.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * crc.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include -#include -#include "ac3.h" -#include "ac3_internal.h" - -#include - -#include "crc.h" - -static const uint_16 crc_lut[256] = -{ - 0x0000,0x8005,0x800f,0x000a,0x801b,0x001e,0x0014,0x8011, - 0x8033,0x0036,0x003c,0x8039,0x0028,0x802d,0x8027,0x0022, - 0x8063,0x0066,0x006c,0x8069,0x0078,0x807d,0x8077,0x0072, - 0x0050,0x8055,0x805f,0x005a,0x804b,0x004e,0x0044,0x8041, - 0x80c3,0x00c6,0x00cc,0x80c9,0x00d8,0x80dd,0x80d7,0x00d2, - 0x00f0,0x80f5,0x80ff,0x00fa,0x80eb,0x00ee,0x00e4,0x80e1, - 0x00a0,0x80a5,0x80af,0x00aa,0x80bb,0x00be,0x00b4,0x80b1, - 0x8093,0x0096,0x009c,0x8099,0x0088,0x808d,0x8087,0x0082, - 0x8183,0x0186,0x018c,0x8189,0x0198,0x819d,0x8197,0x0192, - 0x01b0,0x81b5,0x81bf,0x01ba,0x81ab,0x01ae,0x01a4,0x81a1, - 0x01e0,0x81e5,0x81ef,0x01ea,0x81fb,0x01fe,0x01f4,0x81f1, - 0x81d3,0x01d6,0x01dc,0x81d9,0x01c8,0x81cd,0x81c7,0x01c2, - 0x0140,0x8145,0x814f,0x014a,0x815b,0x015e,0x0154,0x8151, - 0x8173,0x0176,0x017c,0x8179,0x0168,0x816d,0x8167,0x0162, - 0x8123,0x0126,0x012c,0x8129,0x0138,0x813d,0x8137,0x0132, - 0x0110,0x8115,0x811f,0x011a,0x810b,0x010e,0x0104,0x8101, - 0x8303,0x0306,0x030c,0x8309,0x0318,0x831d,0x8317,0x0312, - 0x0330,0x8335,0x833f,0x033a,0x832b,0x032e,0x0324,0x8321, - 0x0360,0x8365,0x836f,0x036a,0x837b,0x037e,0x0374,0x8371, - 0x8353,0x0356,0x035c,0x8359,0x0348,0x834d,0x8347,0x0342, - 0x03c0,0x83c5,0x83cf,0x03ca,0x83db,0x03de,0x03d4,0x83d1, - 0x83f3,0x03f6,0x03fc,0x83f9,0x03e8,0x83ed,0x83e7,0x03e2, - 0x83a3,0x03a6,0x03ac,0x83a9,0x03b8,0x83bd,0x83b7,0x03b2, - 0x0390,0x8395,0x839f,0x039a,0x838b,0x038e,0x0384,0x8381, - 0x0280,0x8285,0x828f,0x028a,0x829b,0x029e,0x0294,0x8291, - 0x82b3,0x02b6,0x02bc,0x82b9,0x02a8,0x82ad,0x82a7,0x02a2, - 0x82e3,0x02e6,0x02ec,0x82e9,0x02f8,0x82fd,0x82f7,0x02f2, - 0x02d0,0x82d5,0x82df,0x02da,0x82cb,0x02ce,0x02c4,0x82c1, - 0x8243,0x0246,0x024c,0x8249,0x0258,0x825d,0x8257,0x0252, - 0x0270,0x8275,0x827f,0x027a,0x826b,0x026e,0x0264,0x8261, - 0x0220,0x8225,0x822f,0x022a,0x823b,0x023e,0x0234,0x8231, - 0x8213,0x0216,0x021c,0x8219,0x0208,0x820d,0x8207,0x0202 -}; - -static uint_16 state; - -void -crc_init(void) -{ - state = 0; -} - - -inline void crc_process_byte(uint_8 data) -{ - state = crc_lut[data ^ (state>>8)] ^ (state<<8); -} - -void -crc_process_frame(uint_8 *data,uint_32 num_bytes) -{ - uint_32 i; - - for(i=0;i -#include "debug.h" - -static int debug_level = -1; - -// Determine is debug output is required. -// We could potentially have multiple levels of debug info -int debug_is_on(void) -{ - char *env_var; - - if(debug_level < 0) - { - env_var = getenv("AC3_DEBUG"); - - if (env_var) - { - debug_level = 1; - } - else - debug_level = 0; - } - - return debug_level; -} - -//If you don't have gcc, then ya don't get debug output -#ifndef __GNUC__ -void dprintf(char fmt[],...) -{ - int foo = 0; -} -#endif - diff --git a/ac3dec/libac3/debug.h b/ac3dec/libac3/debug.h deleted file mode 100644 index f45cb5b..0000000 --- a/ac3dec/libac3/debug.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * debug.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -int debug_is_on(void); - -#ifdef __GNUC__ -#define dprintf(format,args...)\ -{\ - if (debug_is_on())\ - {\ - fprintf(stderr,format,## args);\ - }\ -} -#else -void dprintf(char fmt[],...); -#endif diff --git a/ac3dec/libac3/decode.c b/ac3dec/libac3/decode.c deleted file mode 100644 index 9875919..0000000 --- a/ac3dec/libac3/decode.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * decode.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include -#include -#include "ac3.h" -#include "ac3_internal.h" -#include "bitstream.h" -#include "imdct.h" -#include "exponent.h" -#include "coeff.h" -#include "bit_allocate.h" -#include "parse.h" -#include "crc.h" -#include "stats.h" -#include "rematrix.h" -#include "sanity_check.h" -#include "downmix.h" -#include "debug.h" - -//our global config structure -ac3_config_t ac3_config; -uint_32 error_flag = 0; - -static audblk_t audblk; -static bsi_t bsi; -static syncinfo_t syncinfo; -static uint_32 frame_count = 0; -static uint_32 done_banner; -static ac3_frame_t frame; - -//the floating point samples for one audblk -static stream_samples_t samples; - -//the integer samples for the entire frame (with enough space for 2 ch out) -//if this size change, be sure to change the size when muting -static sint_16 s16_samples[6 * 6 * 256]; - -void -ac3_init(ac3_config_t *config) -{ - memcpy(&ac3_config,config,sizeof(ac3_config_t)); - - bitstream_init(config->fill_buffer_callback); - imdct_init(); - sanity_check_init(&syncinfo,&bsi,&audblk); - - frame.audio_data = s16_samples; -} - -ac3_frame_t* -ac3_decode_frame(void) -{ - uint_32 i; - - //find a syncframe and parse - if (parse_syncinfo(&syncinfo) < 0) - return NULL; - if(error_flag) - goto error; - - dprintf("(decode) begin frame %d\n",frame_count++); - frame.sampling_rate = syncinfo.sampling_rate; - - parse_bsi(&bsi); - - if(!done_banner && !(ac3_config.flags & AC3_QUIET)) - { - stats_print_banner(&syncinfo,&bsi); - done_banner = 1; - } - - for(i=0; i < 6; i++) - { - //Initialize freq/time sample storage - memset(samples,0,sizeof(float) * 256 * (bsi.nfchans + bsi.lfeon)); - - // Extract most of the audblk info from the bitstream - // (minus the mantissas - parse_audblk(&bsi,&audblk); - - // Take the differential exponent data and turn it into - // absolute exponents - exponent_unpack(&bsi,&audblk); - if(error_flag) - goto error; - - // Figure out how many bits per mantissa - bit_allocate(syncinfo.fscod,&bsi,&audblk); - - // Extract the mantissas from the stream and - // generate floating point frequency coefficients - coeff_unpack(&bsi,&audblk,samples); - if(error_flag) - goto error; - - if(bsi.acmod == 0x2) - rematrix(&audblk,samples); - - // Convert the frequency samples into time samples - imdct(&bsi,&audblk,samples); - - // Downmix into the requested number of channels - // and convert floating point to sint_16 - downmix(&bsi,samples,&s16_samples[i * ac3_config.num_output_ch * 256]); - - sanity_check(&syncinfo,&bsi,&audblk); - if(error_flag) - goto error; - } - parse_auxdata(&syncinfo); - - return &frame; - -error: - //mute the frame - memset(s16_samples,0,sizeof(sint_16) * 256 * 2 * 6); - - error_flag = 0; - return &frame; - -} diff --git a/ac3dec/libac3/decode.h b/ac3dec/libac3/decode.h deleted file mode 100644 index bb84a11..0000000 --- a/ac3dec/libac3/decode.h +++ /dev/null @@ -1,22 +0,0 @@ -/* - * decode.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ diff --git a/ac3dec/libac3/dither.c b/ac3dec/libac3/dither.c deleted file mode 100644 index 31e74f6..0000000 --- a/ac3dec/libac3/dither.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * dither.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - - -#include -#include -#include "ac3.h" -#include "ac3_internal.h" - - -#include "dither.h" - - -const uint_16 dither_lut[256] = -{ - 0x0000, 0xa011, 0xe033, 0x4022, 0x6077, 0xc066, 0x8044, 0x2055, - 0xc0ee, 0x60ff, 0x20dd, 0x80cc, 0xa099, 0x0088, 0x40aa, 0xe0bb, - 0x21cd, 0x81dc, 0xc1fe, 0x61ef, 0x41ba, 0xe1ab, 0xa189, 0x0198, - 0xe123, 0x4132, 0x0110, 0xa101, 0x8154, 0x2145, 0x6167, 0xc176, - 0x439a, 0xe38b, 0xa3a9, 0x03b8, 0x23ed, 0x83fc, 0xc3de, 0x63cf, - 0x8374, 0x2365, 0x6347, 0xc356, 0xe303, 0x4312, 0x0330, 0xa321, - 0x6257, 0xc246, 0x8264, 0x2275, 0x0220, 0xa231, 0xe213, 0x4202, - 0xa2b9, 0x02a8, 0x428a, 0xe29b, 0xc2ce, 0x62df, 0x22fd, 0x82ec, - 0x8734, 0x2725, 0x6707, 0xc716, 0xe743, 0x4752, 0x0770, 0xa761, - 0x47da, 0xe7cb, 0xa7e9, 0x07f8, 0x27ad, 0x87bc, 0xc79e, 0x678f, - 0xa6f9, 0x06e8, 0x46ca, 0xe6db, 0xc68e, 0x669f, 0x26bd, 0x86ac, - 0x6617, 0xc606, 0x8624, 0x2635, 0x0660, 0xa671, 0xe653, 0x4642, - 0xc4ae, 0x64bf, 0x249d, 0x848c, 0xa4d9, 0x04c8, 0x44ea, 0xe4fb, - 0x0440, 0xa451, 0xe473, 0x4462, 0x6437, 0xc426, 0x8404, 0x2415, - 0xe563, 0x4572, 0x0550, 0xa541, 0x8514, 0x2505, 0x6527, 0xc536, - 0x258d, 0x859c, 0xc5be, 0x65af, 0x45fa, 0xe5eb, 0xa5c9, 0x05d8, - 0xae79, 0x0e68, 0x4e4a, 0xee5b, 0xce0e, 0x6e1f, 0x2e3d, 0x8e2c, - 0x6e97, 0xce86, 0x8ea4, 0x2eb5, 0x0ee0, 0xaef1, 0xeed3, 0x4ec2, - 0x8fb4, 0x2fa5, 0x6f87, 0xcf96, 0xefc3, 0x4fd2, 0x0ff0, 0xafe1, - 0x4f5a, 0xef4b, 0xaf69, 0x0f78, 0x2f2d, 0x8f3c, 0xcf1e, 0x6f0f, - 0xede3, 0x4df2, 0x0dd0, 0xadc1, 0x8d94, 0x2d85, 0x6da7, 0xcdb6, - 0x2d0d, 0x8d1c, 0xcd3e, 0x6d2f, 0x4d7a, 0xed6b, 0xad49, 0x0d58, - 0xcc2e, 0x6c3f, 0x2c1d, 0x8c0c, 0xac59, 0x0c48, 0x4c6a, 0xec7b, - 0x0cc0, 0xacd1, 0xecf3, 0x4ce2, 0x6cb7, 0xcca6, 0x8c84, 0x2c95, - 0x294d, 0x895c, 0xc97e, 0x696f, 0x493a, 0xe92b, 0xa909, 0x0918, - 0xe9a3, 0x49b2, 0x0990, 0xa981, 0x89d4, 0x29c5, 0x69e7, 0xc9f6, - 0x0880, 0xa891, 0xe8b3, 0x48a2, 0x68f7, 0xc8e6, 0x88c4, 0x28d5, - 0xc86e, 0x687f, 0x285d, 0x884c, 0xa819, 0x0808, 0x482a, 0xe83b, - 0x6ad7, 0xcac6, 0x8ae4, 0x2af5, 0x0aa0, 0xaab1, 0xea93, 0x4a82, - 0xaa39, 0x0a28, 0x4a0a, 0xea1b, 0xca4e, 0x6a5f, 0x2a7d, 0x8a6c, - 0x4b1a, 0xeb0b, 0xab29, 0x0b38, 0x2b6d, 0x8b7c, 0xcb5e, 0x6b4f, - 0x8bf4, 0x2be5, 0x6bc7, 0xcbd6, 0xeb83, 0x4b92, 0x0bb0, 0xaba1 -}; - -uint_16 lfsr_state = 1; - -// -// see dither_gen (inline-able) in dither.h -// - -#if 0 - -// -// this is the old dither_gen with is much slower than the new inlined -// lut version and is still here because it's easier to understand. -// - -/* - * Generate eight bits of pseudo-entropy using a 16 bit linear - * feedback shift register (LFSR). The primitive polynomial used - * is 1 + x^4 + x^14 + x^16. - * - * The distribution is uniform, over the range [-0.707,0.707] - * - */ - -uint_16 dither_gen(void) -{ - int i; - uint_32 state; - - //explicitly bring the state into a local var as gcc > 3.0? - //doesn't know how to optimize out the stores - state = lfsr_state; - - //Generate eight pseudo random bits - for(i=0;i<8;i++) - { - state <<= 1; - - if(state & 0x10000) - state ^= 0xa011; - } - - lfsr_state = state; - - return (((((sint_32)state<<8)>>8) * (sint_32) (0.707106 * 256.0))>>16); -} - -#endif diff --git a/ac3dec/libac3/dither.h b/ac3dec/libac3/dither.h deleted file mode 100644 index 6d68e1b..0000000 --- a/ac3dec/libac3/dither.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * dither.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - - -extern uint_16 lfsr_state; -extern const uint_16 dither_lut[256]; - -static inline uint_16 dither_gen(void) -{ - sint_16 state; - - state = dither_lut[lfsr_state >> 8] ^ (lfsr_state << 8); - - lfsr_state = (uint_16) state; - - return ((state * (sint_32) (0.707106 * 256.0))>>8); -} diff --git a/ac3dec/libac3/downmix.c b/ac3dec/libac3/downmix.c deleted file mode 100644 index 18271f1..0000000 --- a/ac3dec/libac3/downmix.c +++ /dev/null @@ -1,557 +0,0 @@ -/* - * - * downmix.c - * - * Copyright (C) Aaron Holtzman - Sept 1999 - * - * Originally based on code by Yuqing Deng. - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - -#include -#include -#include -#include "ac3.h" -#include "ac3_internal.h" - - -#include "decode.h" -#include "downmix.h" -#include "debug.h" - - -//Pre-scaled downmix coefficients -static float cmixlev_lut[4] = { 0.2928, 0.2468, 0.2071, 0.2468 }; -static float smixlev_lut[4] = { 0.2928, 0.2071, 0.0 , 0.2071 }; - -static void -downmix_3f_2r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples) -{ - uint_32 j; - float right_tmp; - float left_tmp; - float clev,slev; - float *centre = 0, *left = 0, *right = 0, *left_sur = 0, *right_sur = 0; - - left = samples[0]; - centre = samples[1]; - right = samples[2]; - left_sur = samples[3]; - right_sur = samples[4]; - - clev = cmixlev_lut[bsi->cmixlev]; - slev = smixlev_lut[bsi->surmixlev]; - - for (j = 0; j < 256; j++) - { - left_tmp = 0.4142f * *left++ + clev * *centre + slev * *left_sur++; - right_tmp= 0.4142f * *right++ + clev * *centre++ + slev * *right_sur++; - - s16_samples[j * 2 ] = (sint_16) (left_tmp * 32767.0f); - s16_samples[j * 2 + 1] = (sint_16) (right_tmp * 32767.0f); - // printf("[0] = %.6f, [1] = %.6f\n", left_tmp, right_tmp); - } -} - -static void -downmix_3f_2r_to_4ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples) -{ - uint_32 j; - float right_tmp, left_tmp, rear_right_tmp, rear_left_tmp; - float clev,slev; - float *centre = 0, *left = 0, *right = 0, *left_sur = 0, *right_sur = 0; - - left = samples[0]; - centre = samples[1]; - right = samples[2]; - left_sur = samples[3]; - right_sur = samples[4]; - - clev = cmixlev_lut[bsi->cmixlev]; - slev = smixlev_lut[bsi->surmixlev]; - - for (j = 0; j < 256; j++) - { - left_tmp = 0.4142f * *left++ + clev * *centre; - right_tmp= 0.4142f * *right++ + clev * *centre++; - rear_left_tmp = 0.4142f * *left_sur++; - rear_right_tmp = 0.4142f * *right_sur++; - - s16_samples[j * 4 ] = (sint_16) (left_tmp * 32767.0f); - s16_samples[j * 4 + 1] = (sint_16) (right_tmp * 32767.0f); - s16_samples[j * 4 + 2] = (sint_16) (rear_left_tmp * 32767.0f); - s16_samples[j * 4 + 3] = (sint_16) (rear_right_tmp * 32767.0f); -#if 0 - printf("[0] = %.6f, [1] = %.6f, [2] = %.6f, [3] = %.6f\n", - left_tmp, right_tmp, rear_left_tmp, rear_right_tmp); -#endif - } -} - -static void -downmix_3f_2r_to_6ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples) -{ - uint_32 j; - float right_tmp, centre_tmp, left_tmp, rear_right_tmp, rear_left_tmp, lfe_tmp; - float clev,slev; - float *centre = 0, *left = 0, *right = 0, *left_sur = 0, *right_sur = 0, *lfe = 0; - - left = samples[0]; - centre = samples[1]; - right = samples[2]; - left_sur = samples[3]; - right_sur = samples[4]; - lfe = samples[5]; - - clev = cmixlev_lut[bsi->cmixlev]; - slev = smixlev_lut[bsi->surmixlev]; - - for (j = 0; j < 256; j++) - { - left_tmp = 0.4142f * *left++; - right_tmp= 0.4142f * *right++; - centre_tmp = 0.4142f * *centre++; - rear_left_tmp = 0.4142f * *left_sur++; - rear_right_tmp = 0.4142f * *right_sur++; - lfe_tmp = bsi->lfeon ? 0.4142f * *lfe++ : (float)0.0; - - s16_samples[j * 6 ] = (sint_16) (left_tmp * 32767.0f); - s16_samples[j * 6 + 1] = (sint_16) (right_tmp * 32767.0f); - s16_samples[j * 6 + 2] = (sint_16) (rear_left_tmp * 32767.0f); - s16_samples[j * 6 + 3] = (sint_16) (rear_right_tmp * 32767.0f); - s16_samples[j * 6 + 4] = (sint_16) (centre_tmp * 32767.0f); - s16_samples[j * 6 + 5] = (sint_16) (lfe_tmp * 32767.0f); -#if 0 - printf("[0] = %.6f, [1] = %.6f, [2] = %.6f, [3] = %.6f, [4] = %.6f, [5] = %.6f\n", - left_tmp, right_tmp, rear_left_tmp, rear_right_tmp, - centre_tmp, lfe_tmp); -#endif - } -} - -static void -downmix_2f_2r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples) -{ - uint_32 j; - float right_tmp; - float left_tmp; - float slev; - float *left = 0, *right = 0, *left_sur = 0, *right_sur = 0; - - left = samples[0]; - right = samples[1]; - left_sur = samples[2]; - right_sur = samples[3]; - - slev = smixlev_lut[bsi->surmixlev]; - - for (j = 0; j < 256; j++) - { - left_tmp = 0.4142f * *left++ + slev * *left_sur++; - right_tmp= 0.4142f * *right++ + slev * *right_sur++; - - s16_samples[j * 2 ] = (sint_16) (left_tmp * 32767.0f); - s16_samples[j * 2 + 1] = (sint_16) (right_tmp * 32767.0f); - } -} - -static void -downmix_3f_1r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples) -{ - uint_32 j; - float right_tmp; - float left_tmp; - float clev,slev; - float *centre = 0, *left = 0, *right = 0, *sur = 0; - - left = samples[0]; - centre = samples[1]; - right = samples[2]; - //Mono surround - sur = samples[3]; - - clev = cmixlev_lut[bsi->cmixlev]; - slev = smixlev_lut[bsi->surmixlev]; - - for (j = 0; j < 256; j++) - { - left_tmp = 0.4142f * *left++ + clev * *centre++ + slev * *sur; - right_tmp= 0.4142f * *right++ + clev * *centre + slev * *sur++; - - s16_samples[j * 2 ] = (sint_16) (left_tmp * 32767.0f); - s16_samples[j * 2 + 1] = (sint_16) (right_tmp * 32767.0f); - } -} - - -static void -downmix_2f_1r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples) -{ - uint_32 j; - float right_tmp; - float left_tmp; - float slev; - float *left = 0, *right = 0, *sur = 0; - - left = samples[0]; - right = samples[1]; - //Mono surround - sur = samples[2]; - - slev = smixlev_lut[bsi->surmixlev]; - - for (j = 0; j < 256; j++) - { - left_tmp = 0.4142f * *left++ + slev * *sur; - right_tmp= 0.4142f * *right++ + slev * *sur++; - - s16_samples[j * 2 ] = (sint_16) (left_tmp * 32767.0f); - s16_samples[j * 2 + 1] = (sint_16) (right_tmp * 32767.0f); - } -} - -static void -downmix_3f_0r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples) -{ - uint_32 j; - float right_tmp; - float left_tmp; - float clev; - float *centre = 0, *left = 0, *right = 0; - - left = samples[0]; - centre = samples[1]; - right = samples[2]; - - clev = cmixlev_lut[bsi->cmixlev]; - - for (j = 0; j < 256; j++) - { - left_tmp = 0.4142f * *left++ + clev * *centre; - right_tmp= 0.4142f * *right++ + clev * *centre++; - - s16_samples[j * 2 ] = (sint_16) (left_tmp * 32767.0f); - s16_samples[j * 2 + 1] = (sint_16) (right_tmp * 32767.0f); - } -} - -static void -downmix_2f_0r_to_6ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples) -{ - uint_32 j; - float *left = 0, *right = 0; - - left = samples[0]; - right = samples[1]; - - for (j = 0; j < 256; j++) - { - s16_samples[j * 6 ] = (sint_16) (*left++ * 32767.0f); - s16_samples[j * 6 + 1] = (sint_16) (*right++ * 32767.0f); - } //FIXME enable output on surround channels, too. -} - -static void -downmix_2f_0r_to_2ch(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples) -{ - uint_32 j; - float *left = 0, *right = 0; - - left = samples[0]; - right = samples[1]; - - for (j = 0; j < 256; j++) - { - s16_samples[j * 2 ] = (sint_16) (*left++ * 32767.0f); - s16_samples[j * 2 + 1] = (sint_16) (*right++ * 32767.0f); - } -} - -static void -downmix_1f_0r_to_2ch(float *centre,sint_16 *s16_samples) -{ - uint_32 j; - float tmp; - - //Mono program! - - for (j = 0; j < 256; j++) - { - tmp = 32767.0f * 0.7071f * *centre++; - - s16_samples[j * 2 ] = s16_samples[j * 2 + 1] = (sint_16) tmp; - } -} - -// -// Downmix into 2 or 4 channels (4 ch isn't in quite yet) -// -// The downmix function names have the following format -// -// downmix_Xf_Yr_to_[2|4|6]ch[_dolby] -// -// where X = number of front channels -// Y = number of rear channels -// [2|4] = number of output channels -// [_dolby] = with or without dolby surround mix -// - -void downmix(bsi_t* bsi, stream_samples_t samples,sint_16 *s16_samples) -{ - if(bsi->acmod > 7) - dprintf("(downmix) invalid acmod number\n"); - - // - //There are two main cases, with or without Dolby Surround - // - if(ac3_config.flags & AC3_DOLBY_SURR_ENABLE) - { - fprintf(stderr,"Dolby Surround Mixes not currently enabled\n"); - exit(1); - } - - //Non-Dolby surround downmixes - switch(bsi->acmod) - { - // 3/2 - case 7: - switch (ac3_config.num_output_ch) { - case 2: - downmix_3f_2r_to_2ch(bsi,samples,s16_samples); - break; - case 4: - downmix_3f_2r_to_4ch(bsi,samples,s16_samples); - break; - case 6: - downmix_3f_2r_to_6ch(bsi,samples,s16_samples); - break; - default: - fprintf(stderr,"unsupported 3/2 channels %d\n", ac3_config.num_output_ch); - exit(1); - } - break; - - // 2/2 - case 6: - if (ac3_config.num_output_ch != 2) { - fprintf(stderr,"unsupported 2/2 channels %d\n", ac3_config.num_output_ch); - exit(1); - } - downmix_2f_2r_to_2ch(bsi,samples,s16_samples); - break; - - // 3/1 - case 5: - if (ac3_config.num_output_ch != 2) { - fprintf(stderr,"unsupported 3/1 channels %d\n", ac3_config.num_output_ch); - exit(1); - } - downmix_3f_1r_to_2ch(bsi,samples,s16_samples); - break; - - // 2/1 - case 4: - if (ac3_config.num_output_ch != 2) { - fprintf(stderr,"unsupported 2/1 channels %d\n", ac3_config.num_output_ch); - exit(1); - } - downmix_2f_1r_to_2ch(bsi,samples,s16_samples); - break; - - // 3/0 - case 3: - if (ac3_config.num_output_ch != 2) { - fprintf(stderr,"unsupported 3/0 channels %d\n", ac3_config.num_output_ch); - exit(1); - } - downmix_3f_0r_to_2ch(bsi,samples,s16_samples); - break; - - // 2/0 - 2f_0r_to_6ch not really, but allows -D pcm.surround51:1 with 2/0 and 3/2 input (VDR e.g.) - case 2: - switch (ac3_config.num_output_ch) { - case 2: - downmix_2f_0r_to_2ch(bsi,samples,s16_samples); - break; - case 6: - downmix_2f_0r_to_6ch(bsi,samples,s16_samples); - break; - default: - fprintf(stderr,"unsupported 2/0 channels %d\n", ac3_config.num_output_ch); - exit(1); - } - break; - - // 1/0 - case 1: - if (ac3_config.num_output_ch != 2) { - fprintf(stderr,"unsupported 1/0 channels %d\n", ac3_config.num_output_ch); - exit(1); - } - downmix_1f_0r_to_2ch(samples[0],s16_samples); - break; - - // 1+1 - case 0: - if (ac3_config.num_output_ch != 2) { - fprintf(stderr,"unsupported 1/1 channels %d\n", ac3_config.num_output_ch); - exit(1); - } - downmix_1f_0r_to_2ch(samples[ac3_config.dual_mono_ch_sel],s16_samples); - break; - } -} - - - -#if 0 - - //the dolby mixes lay here for the time being - switch(bsi->acmod) - { - // 3/2 - case 7: - left = samples[0]; - centre = samples[1]; - right = samples[2]; - left_sur = samples[3]; - right_sur = samples[4]; - - for (j = 0; j < 256; j++) - { - right_tmp = 0.2265f * *left_sur++ + 0.2265f * *right_sur++; - left_tmp = -1 * right_tmp; - right_tmp += 0.3204f * *right++ + 0.2265f * *centre; - left_tmp += 0.3204f * *left++ + 0.2265f * *centre++; - - samples[1][j] = right_tmp; - samples[0][j] = left_tmp; - } - - break; - - // 2/2 - case 6: - left = samples[0]; - right = samples[1]; - left_sur = samples[2]; - right_sur = samples[3]; - - for (j = 0; j < 256; j++) - { - right_tmp = 0.2265f * *left_sur++ + 0.2265f * *right_sur++; - left_tmp = -1 * right_tmp; - right_tmp += 0.3204f * *right++; - left_tmp += 0.3204f * *left++ ; - - samples[1][j] = right_tmp; - samples[0][j] = left_tmp; - } - break; - - // 3/1 - case 5: - left = samples[0]; - centre = samples[1]; - right = samples[2]; - //Mono surround - right_sur = samples[3]; - - for (j = 0; j < 256; j++) - { - right_tmp = 0.2265f * *right_sur++; - left_tmp = -1 * right_tmp; - right_tmp += 0.3204f * *right++ + 0.2265f * *centre; - left_tmp += 0.3204f * *left++ + 0.2265f * *centre++; - - samples[1][j] = right_tmp; - samples[0][j] = left_tmp; - } - break; - - // 2/1 - case 4: - left = samples[0]; - right = samples[1]; - //Mono surround - right_sur = samples[2]; - - for (j = 0; j < 256; j++) - { - right_tmp = 0.2265f * *right_sur++; - left_tmp = -1 * right_tmp; - right_tmp += 0.3204f * *right++; - left_tmp += 0.3204f * *left++; - - samples[1][j] = right_tmp; - samples[0][j] = left_tmp; - } - break; - - // 3/0 - case 3: - left = samples[0]; - centre = samples[1]; - right = samples[2]; - - for (j = 0; j < 256; j++) - { - right_tmp = 0.3204f * *right++ + 0.2265f * *centre; - left_tmp = 0.3204f * *left++ + 0.2265f * *centre++; - - samples[1][j] = right_tmp; - samples[0][j] = left_tmp; - } - break; - - // 2/0 - case 2: - //Do nothing! - break; - - // 1/0 - case 1: - //Mono program! - right = samples[0]; - - for (j = 0; j < 256; j++) - { - right_tmp = 0.7071f * *right++; - - samples[1][j] = right_tmp; - samples[0][j] = right_tmp; - } - - break; - - // 1+1 - case 0: - //Dual mono, output selected by user - right = samples[ac3_config.dual_mono_ch_sel]; - - for (j = 0; j < 256; j++) - { - right_tmp = 0.7071f * *right++; - - samples[1][j] = right_tmp; - samples[0][j] = right_tmp; - } - break; -#endif diff --git a/ac3dec/libac3/downmix.h b/ac3dec/libac3/downmix.h deleted file mode 100644 index 7537c62..0000000 --- a/ac3dec/libac3/downmix.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * - * downmix.h - * - * Copyright (C) Aaron Holtzman - Sept 1999 - * - * Originally based on code by Yeqing Deng. - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - -void downmix(bsi_t* bsi, stream_samples_t stream_samples,sint_16 *s16_samples); diff --git a/ac3dec/libac3/exponent.c b/ac3dec/libac3/exponent.c deleted file mode 100644 index 98111a5..0000000 --- a/ac3dec/libac3/exponent.c +++ /dev/null @@ -1,135 +0,0 @@ -/* - * exponent.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - - -#include -#include -#include "ac3.h" -#include "ac3_internal.h" - - -#include "decode.h" -#include "exponent.h" - - -static void exp_unpack_ch(uint_16 type,uint_16 expstr,uint_16 ngrps,uint_16 initial_exp, - uint_16 exps[], uint_16 *dest); - -void -exponent_unpack( bsi_t *bsi, audblk_t *audblk) -{ - uint_16 i; - - for(i=0; i< bsi->nfchans; i++) - exp_unpack_ch(UNPACK_FBW, audblk->chexpstr[i], audblk->nchgrps[i], audblk->exps[i][0], - &audblk->exps[i][1], audblk->fbw_exp[i]); - - if(audblk->cplinu) - exp_unpack_ch(UNPACK_CPL, audblk->cplexpstr, audblk->ncplgrps, audblk->cplabsexp << 1, - audblk->cplexps, &audblk->cpl_exp[audblk->cplstrtmant]); - - if(bsi->lfeon) - exp_unpack_ch(UNPACK_LFE, audblk->lfeexpstr, 2, audblk->lfeexps[0], - &audblk->lfeexps[1], audblk->lfe_exp); -} - - -static void -exp_unpack_ch(uint_16 type,uint_16 expstr,uint_16 ngrps,uint_16 initial_exp, - uint_16 exps[], uint_16 *dest) -{ - uint_16 i,j; - sint_16 exp_acc; - sint_16 exp_1,exp_2,exp_3; - - if(expstr == EXP_REUSE) - return; - - /* Handle the initial absolute exponent */ - exp_acc = initial_exp; - j = 0; - - /* In the case of a fbw channel then the initial absolute values is - * also an exponent */ - if(type != UNPACK_CPL) - dest[j++] = exp_acc; - - /* Loop through the groups and fill the dest array appropriately */ - for(i=0; i< ngrps; i++) - { - if(exps[i] > 124) - goto error; - - exp_1 = exps[i] / 25; - exp_2 = (exps[i] - (exp_1 * 25)) / 5; - exp_3 = exps[i] - (exp_1 * 25) - (exp_2 * 5) ; - - exp_acc += (exp_1 - 2); - - switch(expstr) - { - case EXP_D45: - dest[j++] = exp_acc; - dest[j++] = exp_acc; - case EXP_D25: - dest[j++] = exp_acc; - case EXP_D15: - dest[j++] = exp_acc; - } - - exp_acc += (exp_2 - 2); - - switch(expstr) - { - case EXP_D45: - dest[j++] = exp_acc; - dest[j++] = exp_acc; - case EXP_D25: - dest[j++] = exp_acc; - case EXP_D15: - dest[j++] = exp_acc; - } - - exp_acc += (exp_3 - 2); - - switch(expstr) - { - case EXP_D45: - dest[j++] = exp_acc; - dest[j++] = exp_acc; - case EXP_D25: - dest[j++] = exp_acc; - case EXP_D15: - dest[j++] = exp_acc; - } - } - - return; - - goto error; -error: - if(!error_flag) - fprintf(stderr,"** Invalid exponent - skipping frame **\n"); - error_flag = 1; -} - diff --git a/ac3dec/libac3/exponent.h b/ac3dec/libac3/exponent.h deleted file mode 100644 index 06c59db..0000000 --- a/ac3dec/libac3/exponent.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * exponent.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#define UNPACK_FBW 1 -#define UNPACK_CPL 2 -#define UNPACK_LFE 4 - -void exponent_unpack( bsi_t *bsi, audblk_t *audblk); diff --git a/ac3dec/libac3/imdct.c b/ac3dec/libac3/imdct.c deleted file mode 100644 index 6fa0e2a..0000000 --- a/ac3dec/libac3/imdct.c +++ /dev/null @@ -1,479 +0,0 @@ -/* - * imdct.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - -#include -#include -#include -#include "ac3.h" -#include "ac3_internal.h" - - -#include "decode.h" -#include "imdct.h" - -void imdct_do_256(float data[],float delay[]); -void imdct_do_512(float data[],float delay[]); - -typedef struct complex_s -{ - float real; - float imag; -} complex_t; - - -#define N 512 - - -/* 128 point bit-reverse LUT */ -static uint_8 bit_reverse_512[] = { - 0x00, 0x40, 0x20, 0x60, 0x10, 0x50, 0x30, 0x70, - 0x08, 0x48, 0x28, 0x68, 0x18, 0x58, 0x38, 0x78, - 0x04, 0x44, 0x24, 0x64, 0x14, 0x54, 0x34, 0x74, - 0x0c, 0x4c, 0x2c, 0x6c, 0x1c, 0x5c, 0x3c, 0x7c, - 0x02, 0x42, 0x22, 0x62, 0x12, 0x52, 0x32, 0x72, - 0x0a, 0x4a, 0x2a, 0x6a, 0x1a, 0x5a, 0x3a, 0x7a, - 0x06, 0x46, 0x26, 0x66, 0x16, 0x56, 0x36, 0x76, - 0x0e, 0x4e, 0x2e, 0x6e, 0x1e, 0x5e, 0x3e, 0x7e, - 0x01, 0x41, 0x21, 0x61, 0x11, 0x51, 0x31, 0x71, - 0x09, 0x49, 0x29, 0x69, 0x19, 0x59, 0x39, 0x79, - 0x05, 0x45, 0x25, 0x65, 0x15, 0x55, 0x35, 0x75, - 0x0d, 0x4d, 0x2d, 0x6d, 0x1d, 0x5d, 0x3d, 0x7d, - 0x03, 0x43, 0x23, 0x63, 0x13, 0x53, 0x33, 0x73, - 0x0b, 0x4b, 0x2b, 0x6b, 0x1b, 0x5b, 0x3b, 0x7b, - 0x07, 0x47, 0x27, 0x67, 0x17, 0x57, 0x37, 0x77, - 0x0f, 0x4f, 0x2f, 0x6f, 0x1f, 0x5f, 0x3f, 0x7f}; - -static uint_8 bit_reverse_256[] = { - 0x00, 0x20, 0x10, 0x30, 0x08, 0x28, 0x18, 0x38, - 0x04, 0x24, 0x14, 0x34, 0x0c, 0x2c, 0x1c, 0x3c, - 0x02, 0x22, 0x12, 0x32, 0x0a, 0x2a, 0x1a, 0x3a, - 0x06, 0x26, 0x16, 0x36, 0x0e, 0x2e, 0x1e, 0x3e, - 0x01, 0x21, 0x11, 0x31, 0x09, 0x29, 0x19, 0x39, - 0x05, 0x25, 0x15, 0x35, 0x0d, 0x2d, 0x1d, 0x3d, - 0x03, 0x23, 0x13, 0x33, 0x0b, 0x2b, 0x1b, 0x3b, - 0x07, 0x27, 0x17, 0x37, 0x0f, 0x2f, 0x1f, 0x3f}; - -static complex_t buf[128]; - -/* Twiddle factor LUT */ -static complex_t *w[7]; -static complex_t w_1[1]; -static complex_t w_2[2]; -static complex_t w_4[4]; -static complex_t w_8[8]; -static complex_t w_16[16]; -static complex_t w_32[32]; -static complex_t w_64[64]; - -/* Twiddle factors for IMDCT */ -static float xcos1[128]; -static float xsin1[128]; -static float xcos2[64]; -static float xsin2[64]; - -/* Delay buffer for time domain interleaving */ -static float delay[6][256]; - -/* Windowing function for Modified DCT - Thank you acroread */ -static float window[] = { - 0.00014, 0.00024, 0.00037, 0.00051, 0.00067, 0.00086, 0.00107, 0.00130, - 0.00157, 0.00187, 0.00220, 0.00256, 0.00297, 0.00341, 0.00390, 0.00443, - 0.00501, 0.00564, 0.00632, 0.00706, 0.00785, 0.00871, 0.00962, 0.01061, - 0.01166, 0.01279, 0.01399, 0.01526, 0.01662, 0.01806, 0.01959, 0.02121, - 0.02292, 0.02472, 0.02662, 0.02863, 0.03073, 0.03294, 0.03527, 0.03770, - 0.04025, 0.04292, 0.04571, 0.04862, 0.05165, 0.05481, 0.05810, 0.06153, - 0.06508, 0.06878, 0.07261, 0.07658, 0.08069, 0.08495, 0.08935, 0.09389, - 0.09859, 0.10343, 0.10842, 0.11356, 0.11885, 0.12429, 0.12988, 0.13563, - 0.14152, 0.14757, 0.15376, 0.16011, 0.16661, 0.17325, 0.18005, 0.18699, - 0.19407, 0.20130, 0.20867, 0.21618, 0.22382, 0.23161, 0.23952, 0.24757, - 0.25574, 0.26404, 0.27246, 0.28100, 0.28965, 0.29841, 0.30729, 0.31626, - 0.32533, 0.33450, 0.34376, 0.35311, 0.36253, 0.37204, 0.38161, 0.39126, - 0.40096, 0.41072, 0.42054, 0.43040, 0.44030, 0.45023, 0.46020, 0.47019, - 0.48020, 0.49022, 0.50025, 0.51028, 0.52031, 0.53033, 0.54033, 0.55031, - 0.56026, 0.57019, 0.58007, 0.58991, 0.59970, 0.60944, 0.61912, 0.62873, - 0.63827, 0.64774, 0.65713, 0.66643, 0.67564, 0.68476, 0.69377, 0.70269, - 0.71150, 0.72019, 0.72877, 0.73723, 0.74557, 0.75378, 0.76186, 0.76981, - 0.77762, 0.78530, 0.79283, 0.80022, 0.80747, 0.81457, 0.82151, 0.82831, - 0.83496, 0.84145, 0.84779, 0.85398, 0.86001, 0.86588, 0.87160, 0.87716, - 0.88257, 0.88782, 0.89291, 0.89785, 0.90264, 0.90728, 0.91176, 0.91610, - 0.92028, 0.92432, 0.92822, 0.93197, 0.93558, 0.93906, 0.94240, 0.94560, - 0.94867, 0.95162, 0.95444, 0.95713, 0.95971, 0.96217, 0.96451, 0.96674, - 0.96887, 0.97089, 0.97281, 0.97463, 0.97635, 0.97799, 0.97953, 0.98099, - 0.98236, 0.98366, 0.98488, 0.98602, 0.98710, 0.98811, 0.98905, 0.98994, - 0.99076, 0.99153, 0.99225, 0.99291, 0.99353, 0.99411, 0.99464, 0.99513, - 0.99558, 0.99600, 0.99639, 0.99674, 0.99706, 0.99736, 0.99763, 0.99788, - 0.99811, 0.99831, 0.99850, 0.99867, 0.99882, 0.99895, 0.99908, 0.99919, - 0.99929, 0.99938, 0.99946, 0.99953, 0.99959, 0.99965, 0.99969, 0.99974, - 0.99978, 0.99981, 0.99984, 0.99986, 0.99988, 0.99990, 0.99992, 0.99993, - 0.99994, 0.99995, 0.99996, 0.99997, 0.99998, 0.99998, 0.99998, 0.99999, - 0.99999, 0.99999, 0.99999, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, - 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 }; - - -static inline void swap_cmplx(complex_t *a, complex_t *b) -{ - complex_t tmp; - - tmp = *a; - *a = *b; - *b = tmp; -} - - - -static inline complex_t cmplx_mult(complex_t a, complex_t b) -{ - complex_t ret; - - ret.real = a.real * b.real - a.imag * b.imag; - ret.imag = a.real * b.imag + a.imag * b.real; - - return ret; -} - -void imdct_init(void) -{ - int i,k; - complex_t angle_step; - complex_t current_angle; - - /* Twiddle factors to turn IFFT into IMDCT */ - for( i=0; i < 128; i++) - { - xcos1[i] = -cos(2.0f * M_PI * (8*i+1)/(8*N)) ; - xsin1[i] = -sin(2.0f * M_PI * (8*i+1)/(8*N)) ; - } - - /* More twiddle factors to turn IFFT into IMDCT */ - for( i=0; i < 64; i++) - { - xcos2[i] = -cos(2.0f * M_PI * (8*i+1)/(4*N)) ; - xsin2[i] = -sin(2.0f * M_PI * (8*i+1)/(4*N)) ; - } - - /* Canonical twiddle factors for FFT */ - w[0] = w_1; - w[1] = w_2; - w[2] = w_4; - w[3] = w_8; - w[4] = w_16; - w[5] = w_32; - w[6] = w_64; - - for( i = 0; i < 7; i++) - { - angle_step.real = cos(-2.0 * M_PI / (1 << (i+1))); - angle_step.imag = sin(-2.0 * M_PI / (1 << (i+1))); - - current_angle.real = 1.0; - current_angle.imag = 0.0; - - for (k = 0; k < 1 << i; k++) - { - w[i][k] = current_angle; - current_angle = cmplx_mult(current_angle,angle_step); - } - } -} - -void -imdct_do_512(float data[],float delay[]) -{ - int i,k; - int p,q; - int m; - int two_m; - int two_m_plus_one; - - float tmp_a_i; - float tmp_a_r; - float tmp_b_i; - float tmp_b_r; - - float *data_ptr; - float *delay_ptr; - float *window_ptr; - - // - // 512 IMDCT with source and dest data in 'data' - // - - // Pre IFFT complex multiply plus IFFT cmplx conjugate - for( i=0; i < 128; i++) - { - /* z[i] = (X[256-2*i-1] + j * X[2*i]) * (xcos1[i] + j * xsin1[i]) ; */ - buf[i].real = (data[256-2*i-1] * xcos1[i]) - (data[2*i] * xsin1[i]); - buf[i].imag = -1.0 * ((data[2*i] * xcos1[i]) + (data[256-2*i-1] * xsin1[i])); - } - - //Bit reversed shuffling - for(i=0; i<128; i++) - { - k = bit_reverse_512[i]; - if (k < i) - swap_cmplx(&buf[i],&buf[k]); - } - - /* FFT Merge */ - for (m=0; m < 7; m++) - { - if(m) - two_m = (1 << m); - else - two_m = 1; - - two_m_plus_one = (1 << (m+1)); - - for(k = 0; k < two_m; k++) - { - for(i = 0; i < 128; i += two_m_plus_one) - { - p = k + i; - q = p + two_m; - tmp_a_r = buf[p].real; - tmp_a_i = buf[p].imag; - tmp_b_r = buf[q].real * w[m][k].real - buf[q].imag * w[m][k].imag; - tmp_b_i = buf[q].imag * w[m][k].real + buf[q].real * w[m][k].imag; - buf[p].real = tmp_a_r + tmp_b_r; - buf[p].imag = tmp_a_i + tmp_b_i; - buf[q].real = tmp_a_r - tmp_b_r; - buf[q].imag = tmp_a_i - tmp_b_i; - - } - } - } - - /* Post IFFT complex multiply plus IFFT complex conjugate*/ - for( i=0; i < 128; i++) - { - /* y[n] = z[n] * (xcos1[n] + j * xsin1[n]) ; */ - tmp_a_r = buf[i].real; - tmp_a_i = -1.0 * buf[i].imag; - buf[i].real =(tmp_a_r * xcos1[i]) - (tmp_a_i * xsin1[i]); - buf[i].imag =(tmp_a_r * xsin1[i]) + (tmp_a_i * xcos1[i]); - } - - data_ptr = data; - delay_ptr = delay; - window_ptr = window; - - /* Window and convert to real valued signal */ - for(i=0; i< 64; i++) - { - *data_ptr++ = 2.0f * (-buf[64+i].imag * *window_ptr++ + *delay_ptr++); - *data_ptr++ = 2.0f * ( buf[64-i-1].real * *window_ptr++ + *delay_ptr++); - } - - for(i=0; i< 64; i++) - { - *data_ptr++ = 2.0f * (-buf[i].real * *window_ptr++ + *delay_ptr++); - *data_ptr++ = 2.0f * ( buf[128-i-1].imag * *window_ptr++ + *delay_ptr++); - } - - /* The trailing edge of the window goes into the delay line */ - delay_ptr = delay; - - for(i=0; i< 64; i++) - { - *delay_ptr++ = -buf[64+i].real * *--window_ptr; - *delay_ptr++ = buf[64-i-1].imag * *--window_ptr; - } - - for(i=0; i<64; i++) - { - *delay_ptr++ = buf[i].imag * *--window_ptr; - *delay_ptr++ = -buf[128-i-1].real * *--window_ptr; - } -} - -void -imdct_do_256(float data[],float delay[]) -{ - int i,k; - int p,q; - int m; - int two_m; - int two_m_plus_one; - - float tmp_a_i; - float tmp_a_r; - float tmp_b_i; - float tmp_b_r; - - float *data_ptr; - float *delay_ptr; - float *window_ptr; - - complex_t *buf_1, *buf_2; - - buf_1 = &buf[0]; - buf_2 = &buf[64]; - - /* Pre IFFT complex multiply plus IFFT cmplx conjugate */ - for(k=0; k<64; k++) - { - /* X1[k] = X[2*k] */ - /* X2[k] = X[2*k+1] */ - - p = 2 * (128-2*k-1); - q = 2 * (2 * k); - - /* Z1[k] = (X1[128-2*k-1] + j * X1[2*k]) * (xcos2[k] + j * xsin2[k]); */ - buf_1[k].real = data[p] * xcos2[k] - data[q] * xsin2[k]; - buf_1[k].imag = -1.0f * (data[q] * xcos2[k] + data[p] * xsin2[k]); - /* Z2[k] = (X2[128-2*k-1] + j * X2[2*k]) * (xcos2[k] + j * xsin2[k]); */ - buf_2[k].real = data[p + 1] * xcos2[k] - data[q + 1] * xsin2[k]; - buf_2[k].imag = -1.0f * ( data[q + 1] * xcos2[k] + data[p + 1] * xsin2[k]); - } - - //IFFT Bit reversed shuffling - for(i=0; i<64; i++) - { - k = bit_reverse_256[i]; - if (k < i) - { - swap_cmplx(&buf_1[i],&buf_1[k]); - swap_cmplx(&buf_2[i],&buf_2[k]); - } - } - - /* FFT Merge */ - for (m=0; m < 6; m++) - { - two_m = (1 << m); - two_m_plus_one = (1 << (m+1)); - - //FIXME - if(m) - two_m = (1 << m); - else - two_m = 1; - - for(k = 0; k < two_m; k++) - { - for(i = 0; i < 64; i += two_m_plus_one) - { - p = k + i; - q = p + two_m; - //Do block 1 - tmp_a_r = buf_1[p].real; - tmp_a_i = buf_1[p].imag; - tmp_b_r = buf_1[q].real * w[m][k].real - buf_1[q].imag * w[m][k].imag; - tmp_b_i = buf_1[q].imag * w[m][k].real + buf_1[q].real * w[m][k].imag; - buf_1[p].real = tmp_a_r + tmp_b_r; - buf_1[p].imag = tmp_a_i + tmp_b_i; - buf_1[q].real = tmp_a_r - tmp_b_r; - buf_1[q].imag = tmp_a_i - tmp_b_i; - - //Do block 2 - tmp_a_r = buf_2[p].real; - tmp_a_i = buf_2[p].imag; - tmp_b_r = buf_2[q].real * w[m][k].real - buf_2[q].imag * w[m][k].imag; - tmp_b_i = buf_2[q].imag * w[m][k].real + buf_2[q].real * w[m][k].imag; - buf_2[p].real = tmp_a_r + tmp_b_r; - buf_2[p].imag = tmp_a_i + tmp_b_i; - buf_2[q].real = tmp_a_r - tmp_b_r; - buf_2[q].imag = tmp_a_i - tmp_b_i; - - } - } - } - - /* Post IFFT complex multiply */ - for( i=0; i < 64; i++) - { - /* y1[n] = z1[n] * (xcos2[n] + j * xs in2[n]) ; */ - tmp_a_r = buf_1[i].real; - tmp_a_i = -buf_1[i].imag; - buf_1[i].real =(tmp_a_r * xcos2[i]) - (tmp_a_i * xsin2[i]); - buf_1[i].imag =(tmp_a_r * xsin2[i]) + (tmp_a_i * xcos2[i]); - /* y2[n] = z2[n] * (xcos2[n] + j * xsin2[n]) ; */ - tmp_a_r = buf_2[i].real; - tmp_a_i = -buf_2[i].imag; - buf_2[i].real =(tmp_a_r * xcos2[i]) - (tmp_a_i * xsin2[i]); - buf_2[i].imag =(tmp_a_r * xsin2[i]) + (tmp_a_i * xcos2[i]); - } - - data_ptr = data; - delay_ptr = delay; - window_ptr = window; - - /* Window and convert to real valued signal */ - for(i=0; i< 64; i++) - { - *data_ptr++ = 2.0f * (-buf_1[i].imag * *window_ptr++ + *delay_ptr++); - *data_ptr++ = 2.0f * ( buf_1[64-i-1].real * *window_ptr++ + *delay_ptr++); - } - - for(i=0; i< 64; i++) - { - *data_ptr++ = 2.0f * (-buf_1[i].real * *window_ptr++ + *delay_ptr++); - *data_ptr++ = 2.0f * ( buf_1[64-i-1].imag * *window_ptr++ + *delay_ptr++); - } - - delay_ptr = delay; - - for(i=0; i< 64; i++) - { - *delay_ptr++ = -buf_2[i].real * *--window_ptr; - *delay_ptr++ = buf_2[64-i-1].imag * *--window_ptr; - } - - for(i=0; i< 64; i++) - { - *delay_ptr++ = buf_2[i].imag * *--window_ptr; - *delay_ptr++ = -buf_2[64-i-1].real * *--window_ptr; - } -} - -//FIXME remove - for timing code -///#include -//FIXME remove - -void -imdct(bsi_t *bsi,audblk_t *audblk, stream_samples_t samples) { - int i; - - //handy timing code - //struct timeval start,end; - - //gettimeofday(&start,0); - - for(i=0; infchans;i++) - { - if(audblk->blksw[i]) - imdct_do_256(samples[i],delay[i]); - else - imdct_do_512(samples[i],delay[i]); - } - //gettimeofday(&end,0); - //printf("imdct %ld us\n",(end.tv_sec - start.tv_sec) * 1000000 + - //end.tv_usec - start.tv_usec); - - //XXX We don't bother with the IMDCT for the LFE as it's currently - //unused. - //if (bsi->lfeon) - // imdct_do_512(coeffs->lfe,samples->channel[5],delay[5]); - // -} diff --git a/ac3dec/libac3/imdct.h b/ac3dec/libac3/imdct.h deleted file mode 100644 index 750aa87..0000000 --- a/ac3dec/libac3/imdct.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * imdct.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - -void imdct(bsi_t *bsi,audblk_t *audblk, stream_samples_t samples); -void imdct_init(void); diff --git a/ac3dec/libac3/parse.c b/ac3dec/libac3/parse.c deleted file mode 100644 index 19e8965..0000000 --- a/ac3dec/libac3/parse.c +++ /dev/null @@ -1,656 +0,0 @@ -/* - * parse.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - -#include -#include -#include -#include "ac3.h" -#include "ac3_internal.h" - - -#include "bitstream.h" -#include "stats.h" -#include "debug.h" -#include "crc.h" -#include "parse.h" - -/* Misc LUT */ -static const uint_16 nfchans[8] = {2,1,2,3,3,4,4,5}; - -struct frmsize_s -{ - uint_16 bit_rate; - uint_16 frm_size[3]; -}; - -static const struct frmsize_s frmsizecod_tbl[64] = -{ - { 32 ,{64 ,69 ,96 } }, - { 32 ,{64 ,70 ,96 } }, - { 40 ,{80 ,87 ,120 } }, - { 40 ,{80 ,88 ,120 } }, - { 48 ,{96 ,104 ,144 } }, - { 48 ,{96 ,105 ,144 } }, - { 56 ,{112 ,121 ,168 } }, - { 56 ,{112 ,122 ,168 } }, - { 64 ,{128 ,139 ,192 } }, - { 64 ,{128 ,140 ,192 } }, - { 80 ,{160 ,174 ,240 } }, - { 80 ,{160 ,175 ,240 } }, - { 96 ,{192 ,208 ,288 } }, - { 96 ,{192 ,209 ,288 } }, - { 112 ,{224 ,243 ,336 } }, - { 112 ,{224 ,244 ,336 } }, - { 128 ,{256 ,278 ,384 } }, - { 128 ,{256 ,279 ,384 } }, - { 160 ,{320 ,348 ,480 } }, - { 160 ,{320 ,349 ,480 } }, - { 192 ,{384 ,417 ,576 } }, - { 192 ,{384 ,418 ,576 } }, - { 224 ,{448 ,487 ,672 } }, - { 224 ,{448 ,488 ,672 } }, - { 256 ,{512 ,557 ,768 } }, - { 256 ,{512 ,558 ,768 } }, - { 320 ,{640 ,696 ,960 } }, - { 320 ,{640 ,697 ,960 } }, - { 384 ,{768 ,835 ,1152 } }, - { 384 ,{768 ,836 ,1152 } }, - { 448 ,{896 ,975 ,1344 } }, - { 448 ,{896 ,976 ,1344 } }, - { 512 ,{1024 ,1114 ,1536 } }, - { 512 ,{1024 ,1115 ,1536 } }, - { 576 ,{1152 ,1253 ,1728 } }, - { 576 ,{1152 ,1254 ,1728 } }, - { 640 ,{1280 ,1393 ,1920 } }, - { 640 ,{1280 ,1394 ,1920 } } -}; - -void -parse_syncinfo_data(syncinfo_t *syncinfo, uint_8 *data) -{ - // Get the sampling rate - syncinfo->fscod = (data[2] >> 6) & 0x3; - - if(syncinfo->fscod == 3) - { - //invalid sampling rate code - error_flag = 1; - return; - } - else if(syncinfo->fscod == 2) - syncinfo->sampling_rate = 32000; - else if(syncinfo->fscod == 1) - syncinfo->sampling_rate = 44100; - else - syncinfo->sampling_rate = 48000; - - // Get the frame size code - syncinfo->frmsizecod = data[2] & 0x3f; - - // Calculate the frame size and bitrate - syncinfo->frame_size = - frmsizecod_tbl[syncinfo->frmsizecod].frm_size[syncinfo->fscod]; - syncinfo->bit_rate = frmsizecod_tbl[syncinfo->frmsizecod].bit_rate; -} - -/* Parse a syncinfo structure, minus the sync word */ -int -parse_syncinfo(syncinfo_t *syncinfo) -{ - int byte, idx; - uint_8 data[3]; - uint_16 sync_word = 0; - uint_32 time_out = 1<<16; - - - // - // Find a ac3 sync frame. Time out if we read 64k without finding - // one. - // - while(time_out--) - { - byte = bitstream_get_byte(); - if (byte < 0) - return -ENOENT; - sync_word = (sync_word << 8) + byte; - - if(sync_word == 0x0b77) - break; - } - - // - // We need to read in the entire syncinfo struct (0x0b77 + 24 bits) - // in order to determine how big the frame is - // - for (idx = 0; idx < 3; idx++) { - byte = bitstream_get_byte(); - if (byte < 0) - return -ENOENT; - data[idx] = byte; - } - - parse_syncinfo_data(syncinfo, data); - - // Buffer the entire syncframe - if (bitstream_buffer_frame(syncinfo->frame_size * 2 - 5) < 0) - return -ENOENT; - - // Check the crc over the entire frame - crc_init(); - - crc_process_byte(data[0]); - crc_process_byte(data[1]); - crc_process_byte(data[2]); - crc_process_frame(bitstream_get_buffer_start(),syncinfo->frame_size * 2 - 5); - - if(!crc_validate()) - { - error_flag = 1; - fprintf(stderr,"** CRC failed - skipping frame **\n"); - return 0; - } - - if (!(ac3_config.flags & AC3_QUIET)) - stats_print_syncinfo(syncinfo); - return 0; -} - -/* - * This routine fills a bsi struct from the AC3 stream - */ - -void -parse_bsi(bsi_t *bsi) -{ - uint_32 i; - - /* Check the AC-3 version number */ - bsi->bsid = bitstream_get(5); - - /* Get the audio service provided by the steram */ - bsi->bsmod = bitstream_get(3); - - /* Get the audio coding mode (ie how many channels)*/ - bsi->acmod = bitstream_get(3); - /* Predecode the number of full bandwidth channels as we use this - * number a lot */ - bsi->nfchans = nfchans[bsi->acmod]; - - /* If it is in use, get the centre channel mix level */ - if ((bsi->acmod & 0x1) && (bsi->acmod != 0x1)) - bsi->cmixlev = bitstream_get(2); - - /* If it is in use, get the surround channel mix level */ - if (bsi->acmod & 0x4) - bsi->surmixlev = bitstream_get(2); - - /* Get the dolby surround mode if in 2/0 mode */ - if(bsi->acmod == 0x2) - bsi->dsurmod= bitstream_get(2); - - /* Is the low frequency effects channel on? */ - bsi->lfeon = bitstream_get(1); - - /* Get the dialogue normalization level */ - bsi->dialnorm = bitstream_get(5); - - /* Does compression gain exist? */ - bsi->compre = bitstream_get(1); - if (bsi->compre) - { - /* Get compression gain */ - bsi->compr = bitstream_get(8); - } - - /* Does language code exist? */ - bsi->langcode = bitstream_get(1); - if (bsi->langcode) - { - /* Get langauge code */ - bsi->langcod = bitstream_get(8); - } - - /* Does audio production info exist? */ - bsi->audprodie = bitstream_get(1); - if (bsi->audprodie) - { - /* Get mix level */ - bsi->mixlevel = bitstream_get(5); - - /* Get room type */ - bsi->roomtyp = bitstream_get(2); - } - - /* If we're in dual mono mode then get some extra info */ - if (bsi->acmod ==0) - { - /* Get the dialogue normalization level two */ - bsi->dialnorm2 = bitstream_get(5); - - /* Does compression gain two exist? */ - bsi->compr2e = bitstream_get(1); - if (bsi->compr2e) - { - /* Get compression gain two */ - bsi->compr2 = bitstream_get(8); - } - - /* Does language code two exist? */ - bsi->langcod2e = bitstream_get(1); - if (bsi->langcod2e) - { - /* Get langauge code two */ - bsi->langcod2 = bitstream_get(8); - } - - /* Does audio production info two exist? */ - bsi->audprodi2e = bitstream_get(1); - if (bsi->audprodi2e) - { - /* Get mix level two */ - bsi->mixlevel2 = bitstream_get(5); - - /* Get room type two */ - bsi->roomtyp2 = bitstream_get(2); - } - } - - /* Get the copyright bit */ - bsi->copyrightb = bitstream_get(1); - - /* Get the original bit */ - bsi->origbs = bitstream_get(1); - - /* Does timecode one exist? */ - bsi->timecod1e = bitstream_get(1); - - if(bsi->timecod1e) - bsi->timecod1 = bitstream_get(14); - - /* Does timecode two exist? */ - bsi->timecod2e = bitstream_get(1); - - if(bsi->timecod2e) - bsi->timecod2 = bitstream_get(14); - - /* Does addition info exist? */ - bsi->addbsie = bitstream_get(1); - - if(bsi->addbsie) - { - /* Get how much info is there */ - bsi->addbsil = bitstream_get(6); - - /* Get the additional info */ - for(i=0;i<(bsi->addbsil + 1);i++) - bsi->addbsi[i] = bitstream_get(8); - } - - if (!(ac3_config.flags & AC3_QUIET)) - stats_print_bsi(bsi); -} - -/* More pain inducing parsing */ -void -parse_audblk(bsi_t *bsi,audblk_t *audblk) -{ - int i,j; - - for (i=0;i < bsi->nfchans; i++) - { - /* Is this channel an interleaved 256 + 256 block ? */ - audblk->blksw[i] = bitstream_get(1); - } - - for (i=0;i < bsi->nfchans; i++) - { - /* Should we dither this channel? */ - audblk->dithflag[i] = bitstream_get(1); - } - - /* Does dynamic range control exist? */ - audblk->dynrnge = bitstream_get(1); - if (audblk->dynrnge) - { - /* Get dynamic range info */ - audblk->dynrng = bitstream_get(8); - } - - /* If we're in dual mono mode then get the second channel DR info */ - if (bsi->acmod == 0) - { - /* Does dynamic range control two exist? */ - audblk->dynrng2e = bitstream_get(1); - if (audblk->dynrng2e) - { - /* Get dynamic range info */ - audblk->dynrng2 = bitstream_get(8); - } - } - - /* Does coupling strategy exist? */ - audblk->cplstre = bitstream_get(1); - if (audblk->cplstre) - { - /* Is coupling turned on? */ - audblk->cplinu = bitstream_get(1); - if(audblk->cplinu) - { - for(i=0;i < bsi->nfchans; i++) - audblk->chincpl[i] = bitstream_get(1); - if(bsi->acmod == 0x2) - audblk->phsflginu = bitstream_get(1); - audblk->cplbegf = bitstream_get(4); - audblk->cplendf = bitstream_get(4); - audblk->ncplsubnd = (audblk->cplendf + 2) - audblk->cplbegf + 1; - - /* Calculate the start and end bins of the coupling channel */ - audblk->cplstrtmant = (audblk->cplbegf * 12) + 37 ; - audblk->cplendmant = ((audblk->cplendf + 3) * 12) + 37; - - /* The number of combined subbands is ncplsubnd minus each combined - * band */ - audblk->ncplbnd = audblk->ncplsubnd; - - for(i=1; i< audblk->ncplsubnd; i++) - { - audblk->cplbndstrc[i] = bitstream_get(1); - audblk->ncplbnd -= audblk->cplbndstrc[i]; - } - } - } - - if(audblk->cplinu) - { - /* Loop through all the channels and get their coupling co-ords */ - for(i=0;i < bsi->nfchans;i++) - { - if(!audblk->chincpl[i]) - continue; - - /* Is there new coupling co-ordinate info? */ - audblk->cplcoe[i] = bitstream_get(1); - - if(audblk->cplcoe[i]) - { - audblk->mstrcplco[i] = bitstream_get(2); - for(j=0;j < audblk->ncplbnd; j++) - { - audblk->cplcoexp[i][j] = bitstream_get(4); - audblk->cplcomant[i][j] = bitstream_get(4); - } - } - } - - /* If we're in dual mono mode, there's going to be some phase info */ - if( (bsi->acmod == 0x2) && audblk->phsflginu && - (audblk->cplcoe[0] || audblk->cplcoe[1])) - { - for(j=0;j < audblk->ncplbnd; j++) - audblk->phsflg[j] = bitstream_get(1); - - } - } - - /* If we're in dual mono mode, there may be a rematrix strategy */ - if(bsi->acmod == 0x2) - { - audblk->rematstr = bitstream_get(1); - if(audblk->rematstr) - { - if (audblk->cplinu == 0) - { - for(i = 0; i < 4; i++) - audblk->rematflg[i] = bitstream_get(1); - } - if((audblk->cplbegf > 2) && audblk->cplinu) - { - for(i = 0; i < 4; i++) - audblk->rematflg[i] = bitstream_get(1); - } - if((audblk->cplbegf <= 2) && audblk->cplinu) - { - for(i = 0; i < 3; i++) - audblk->rematflg[i] = bitstream_get(1); - } - if((audblk->cplbegf == 0) && audblk->cplinu) - for(i = 0; i < 2; i++) - audblk->rematflg[i] = bitstream_get(1); - - } - } - - if (audblk->cplinu) - { - /* Get the coupling channel exponent strategy */ - audblk->cplexpstr = bitstream_get(2); - audblk->ncplgrps = (audblk->cplendmant - audblk->cplstrtmant) / - (3 << (audblk->cplexpstr-1)); - } - - for(i = 0; i < bsi->nfchans; i++) - audblk->chexpstr[i] = bitstream_get(2); - - /* Get the exponent strategy for lfe channel */ - if(bsi->lfeon) - audblk->lfeexpstr = bitstream_get(1); - - /* Determine the bandwidths of all the fbw channels */ - for(i = 0; i < bsi->nfchans; i++) - { - uint_16 grp_size; - - if(audblk->chexpstr[i] != EXP_REUSE) - { - if (audblk->cplinu && audblk->chincpl[i]) - { - audblk->endmant[i] = audblk->cplstrtmant; - } - else - { - audblk->chbwcod[i] = bitstream_get(6); - audblk->endmant[i] = ((audblk->chbwcod[i] + 12) * 3) + 37; - } - - /* Calculate the number of exponent groups to fetch */ - grp_size = 3 * (1 << (audblk->chexpstr[i] - 1)); - audblk->nchgrps[i] = (audblk->endmant[i] - 1 + (grp_size - 3)) / grp_size; - } - } - - /* Get the coupling exponents if they exist */ - if(audblk->cplinu && (audblk->cplexpstr != EXP_REUSE)) - { - audblk->cplabsexp = bitstream_get(4); - for(i=0;i< audblk->ncplgrps;i++) - audblk->cplexps[i] = bitstream_get(7); - } - - /* Get the fwb channel exponents */ - for(i=0;i < bsi->nfchans; i++) - { - if(audblk->chexpstr[i] != EXP_REUSE) - { - audblk->exps[i][0] = bitstream_get(4); - for(j=1;j<=audblk->nchgrps[i];j++) - audblk->exps[i][j] = bitstream_get(7); - audblk->gainrng[i] = bitstream_get(2); - } - } - - /* Get the lfe channel exponents */ - if(bsi->lfeon && (audblk->lfeexpstr != EXP_REUSE)) - { - audblk->lfeexps[0] = bitstream_get(4); - audblk->lfeexps[1] = bitstream_get(7); - audblk->lfeexps[2] = bitstream_get(7); - } - - /* Get the parametric bit allocation parameters */ - audblk->baie = bitstream_get(1); - - if(audblk->baie) - { - audblk->sdcycod = bitstream_get(2); - audblk->fdcycod = bitstream_get(2); - audblk->sgaincod = bitstream_get(2); - audblk->dbpbcod = bitstream_get(2); - audblk->floorcod = bitstream_get(3); - } - - /* Get the SNR off set info if it exists */ - audblk->snroffste = bitstream_get(1); - - if(audblk->snroffste) - { - audblk->csnroffst = bitstream_get(6); - - if(audblk->cplinu) - { - audblk->cplfsnroffst = bitstream_get(4); - audblk->cplfgaincod = bitstream_get(3); - } - - for(i = 0;i < bsi->nfchans; i++) - { - audblk->fsnroffst[i] = bitstream_get(4); - audblk->fgaincod[i] = bitstream_get(3); - } - if(bsi->lfeon) - { - - audblk->lfefsnroffst = bitstream_get(4); - audblk->lfefgaincod = bitstream_get(3); - } - } - - /* Get coupling leakage info if it exists */ - if(audblk->cplinu) - { - audblk->cplleake = bitstream_get(1); - - if(audblk->cplleake) - { - audblk->cplfleak = bitstream_get(3); - audblk->cplsleak = bitstream_get(3); - } - } - - /* Get the delta bit alloaction info */ - audblk->deltbaie = bitstream_get(1); - - if(audblk->deltbaie) - { - if(audblk->cplinu) - audblk->cpldeltbae = bitstream_get(2); - - for(i = 0;i < bsi->nfchans; i++) - audblk->deltbae[i] = bitstream_get(2); - - if (audblk->cplinu && (audblk->cpldeltbae == DELTA_BIT_NEW)) - { - audblk->cpldeltnseg = bitstream_get(3); - for(i = 0;i < audblk->cpldeltnseg + 1; i++) - { - audblk->cpldeltoffst[i] = bitstream_get(5); - audblk->cpldeltlen[i] = bitstream_get(4); - audblk->cpldeltba[i] = bitstream_get(3); - } - } - - for(i = 0;i < bsi->nfchans; i++) - { - if (audblk->deltbae[i] == DELTA_BIT_NEW) - { - audblk->deltnseg[i] = bitstream_get(3); - for(j = 0; j < audblk->deltnseg[i] + 1; j++) - { - audblk->deltoffst[i][j] = bitstream_get(5); - audblk->deltlen[i][j] = bitstream_get(4); - audblk->deltba[i][j] = bitstream_get(3); - } - } - } - } - - /* Check to see if there's any dummy info to get */ - if((audblk->skiple = bitstream_get(1))) - { - uint_16 skip_data; - - audblk->skipl = bitstream_get(9); - //XXX remove - //fprintf(stderr,"(parse) skipping %d bytes\n",audblk->skipl); - - for(i = 0; i < audblk->skipl ; i++) - { - skip_data = bitstream_get(8); - //XXX remove - //fprintf(stderr,"skipped data %2x\n",skip_data); - //if(skip_data != 0) - //{ - //dprintf("(parse) Invalid skipped data %2x\n",skip_data); - //exit(1); - //} - } - } - - if (!(ac3_config.flags & AC3_QUIET)) - stats_print_audblk(bsi,audblk); -} - -void -parse_auxdata(syncinfo_t *syncinfo) -{ - //FIXME keep this now that we don't really need it? -#if 0 - int i; - int skip_length; - uint_16 crc; - uint_16 auxdatae; - - skip_length = (syncinfo->frame_size * 16) - bitstream_get_total_bits() - 17 - 1; - - //XXX remove - //dprintf("(auxdata) skipping %d auxbits\n",skip_length); - - for(i=0; i < skip_length; i++) - //printf("Skipped bit %i\n",(uint_16)bitstream_get(1)); - bitstream_get(1); - - //get the auxdata exists bit - auxdatae = bitstream_get(1); - - //XXX remove - //dprintf("auxdatae = %i\n",auxdatae); - - //Skip the CRC reserved bit - bitstream_get(1); - - //Get the crc - crc = bitstream_get(16); -#endif -} - - diff --git a/ac3dec/libac3/parse.h b/ac3dec/libac3/parse.h deleted file mode 100644 index 187c714..0000000 --- a/ac3dec/libac3/parse.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * parse.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -void parse_syncinfo_data(syncinfo_t *syncinfo, uint_8 *data); -int parse_syncinfo(syncinfo_t *syncinfo); -void parse_audblk(bsi_t *bsi,audblk_t *audblk); -void parse_bsi(bsi_t *bsi); -void parse_auxdata(syncinfo_t *syncinfo); - diff --git a/ac3dec/libac3/rematrix.c b/ac3dec/libac3/rematrix.c deleted file mode 100644 index caa7094..0000000 --- a/ac3dec/libac3/rematrix.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * rematrix.c - * - * Copyright (C) Aaron Holtzman - July 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - -#include -#include -#include "ac3.h" -#include "ac3_internal.h" - - -#include "decode.h" -#include "rematrix.h" - -struct rematrix_band_s -{ - uint_32 start; - uint_32 end; -}; - -struct rematrix_band_s rematrix_band[] = { {13,24}, {25,36}, {37 ,60}, {61,252}}; - -static inline uint_32 min(uint_32 a,uint_32 b); - -static inline uint_32 -min(uint_32 a,uint_32 b) -{ - return (a < b ? a : b); -} - -/* This routine simply does stereo rematixing for the 2 channel - * stereo mode */ -void rematrix(audblk_t *audblk, stream_samples_t samples) -{ - uint_32 num_bands; - uint_32 start; - uint_32 end; - uint_32 i,j; - float left,right; - - if(!audblk->cplinu || audblk->cplbegf > 2) - num_bands = 4; - else if (audblk->cplbegf > 0) - num_bands = 3; - else - num_bands = 2; - - for(i=0;i < num_bands; i++) - { - if(!audblk->rematflg[i]) - continue; - - start = rematrix_band[i].start; - end = min(rematrix_band[i].end ,12 * audblk->cplbegf + 36); - - for(j=start;j < end; j++) - { - left = samples[0][j] + samples[1][j]; - right = samples[0][j] - samples[1][j]; - samples[0][j] = left; - samples[1][j] = right; - } - } -} diff --git a/ac3dec/libac3/rematrix.h b/ac3dec/libac3/rematrix.h deleted file mode 100644 index 0be6528..0000000 --- a/ac3dec/libac3/rematrix.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * rematrix.h - * - * Copyright (C) Aaron Holtzman - July 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - * - */ - -void rematrix(audblk_t *audblk, stream_samples_t samples); diff --git a/ac3dec/libac3/sanity_check.c b/ac3dec/libac3/sanity_check.c deleted file mode 100644 index 461f20e..0000000 --- a/ac3dec/libac3/sanity_check.c +++ /dev/null @@ -1,131 +0,0 @@ -/* - * sanity_check.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include -#include -#include "ac3.h" -#include "ac3_internal.h" -#include "sanity_check.h" - - -void -sanity_check_init(syncinfo_t *syncinfo, bsi_t *bsi, audblk_t *audblk) -{ - syncinfo->magic = AC3_MAGIC_NUMBER; - bsi->magic = AC3_MAGIC_NUMBER; - audblk->magic1 = AC3_MAGIC_NUMBER; - audblk->magic2 = AC3_MAGIC_NUMBER; - audblk->magic3 = AC3_MAGIC_NUMBER; -} - -void -sanity_check(syncinfo_t *syncinfo, bsi_t *bsi, audblk_t *audblk) -{ - int i; - - if(syncinfo->magic != AC3_MAGIC_NUMBER) - { - fprintf(stderr,"\n** Sanity check failed -- syncinfo magic number **"); - error_flag = 1; - } - - if(bsi->magic != AC3_MAGIC_NUMBER) - { - fprintf(stderr,"\n** Sanity check failed -- bsi magic number **"); - error_flag = 1; - } - - if(audblk->magic1 != AC3_MAGIC_NUMBER) - { - fprintf(stderr,"\n** Sanity check failed -- audblk magic number 1 **"); - error_flag = 1; - } - - if(audblk->magic2 != AC3_MAGIC_NUMBER) - { - fprintf(stderr,"\n** Sanity check failed -- audblk magic number 2 **"); - error_flag = 1; - } - - if(audblk->magic3 != AC3_MAGIC_NUMBER) - { - fprintf(stderr,"\n** Sanity check failed -- audblk magic number 3 **"); - error_flag = 1; - } - - for(i = 0;i < 5 ; i++) - { - if (audblk->fbw_exp[i][255] !=0 || audblk->fbw_exp[i][254] !=0 || - audblk->fbw_exp[i][253] !=0) - { - fprintf(stderr,"\n** Sanity check failed -- fbw_exp out of bounds **"); - error_flag = 1; - } - - if (audblk->fbw_bap[i][255] !=0 || audblk->fbw_bap[i][254] !=0 || - audblk->fbw_bap[i][253] !=0) - { - fprintf(stderr,"\n** Sanity check failed -- fbw_bap out of bounds **"); - error_flag = 1; - } - - } - - if (audblk->cpl_exp[255] !=0 || audblk->cpl_exp[254] !=0 || - audblk->cpl_exp[253] !=0) - { - fprintf(stderr,"\n** Sanity check failed -- cpl_exp out of bounds **"); - error_flag = 1; - } - - if (audblk->cpl_bap[255] !=0 || audblk->cpl_bap[254] !=0 || - audblk->cpl_bap[253] !=0) - { - fprintf(stderr,"\n** Sanity check failed -- cpl_bap out of bounds **"); - error_flag = 1; - } - - if (audblk->cplmant[255] !=0 || audblk->cplmant[254] !=0 || - audblk->cplmant[253] !=0) - { - fprintf(stderr,"\n** Sanity check failed -- cpl_mant out of bounds **"); - error_flag = 1; - } - - if ((audblk->cplinu == 1) && (audblk->cplbegf > (audblk->cplendf+2))) - { - fprintf(stderr,"\n** Sanity check failed -- cpl params inconsistent **"); - error_flag = 1; - } - - for(i=0; i < bsi->nfchans; i++) - { - if((audblk->chincpl[i] == 0) && (audblk->chbwcod[i] > 60)) - { - fprintf(stderr,"\n** Sanity check failed -- chbwcod too big **"); - error_flag = 1; - } - } - - return; -} diff --git a/ac3dec/libac3/sanity_check.h b/ac3dec/libac3/sanity_check.h deleted file mode 100644 index c4ca63a..0000000 --- a/ac3dec/libac3/sanity_check.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * sanity_check.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#define AC3_MAGIC_NUMBER 0xdeadbeef - -void sanity_check_init(syncinfo_t *syncinfo, bsi_t *bsi, audblk_t *audblk); -void sanity_check(syncinfo_t *syncinfo, bsi_t *bsi, audblk_t *audblk); diff --git a/ac3dec/libac3/stats.c b/ac3dec/libac3/stats.c deleted file mode 100644 index d8a8417..0000000 --- a/ac3dec/libac3/stats.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * stats.c - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include -#include -#include "config.h" -#include "ac3.h" -#include "ac3_internal.h" - - -#include "decode.h" -#include "stats.h" -#include "debug.h" - - -static const char *service_ids[8] = -{ - "CM","ME","VI","HI", - "D", "C","E", "VO" -}; - -struct mixlev_s -{ - float clev; - char *desc; -}; - -static const struct mixlev_s cmixlev_tbl[4] = -{ - {0.707, "(-3.0 dB)"}, {0.595, "(-4.5 dB)"}, - {0.500, "(-6.0 dB)"}, {1.0, "Invalid"} -}; - -static const struct mixlev_s smixlev_tbl[4] = -{ - {0.707, "(-3.0 dB)"}, {0.500, "(-6.0 dB)"}, - { 0.0, "off "}, { 1.0, "Invalid"} -}; - -static const char *language[128] = -{ - "unknown", "Albanian", "Breton", "Catalan", "Croatian", "Welsh", "Czech", "Danish", - "German", "English", "Spanish", "Esperanto", "Estonian", "Basque", "Faroese", "French", - "Frisian", "Irish", "Gaelic", "Galician", "Icelandic", "Italian", "Lappish", "Latin", - "Latvian", "Luxembourgian", "Lithuanian", "Hungarian", "Maltese", "Dutch", "Norwegian", "Occitan", - "Polish", "Portugese", "Romanian", "Romansh", "Serbian", "Slovak", "Slovene", "Finnish", - "Swedish", "Turkish", "Flemish", "Walloon", "0x2c", "0x2d", "0x2e", "0x2f", - "0x30", "0x31", "0x32", "0x33", "0x34", "0x35", "0x36", "0x37", - "0x38", "0x39", "0x3a", "0x3b", "0x3c", "0x3d", "0x3e", "0x3f", - "background", "0x41", "0x42", "0x43", "0x44", "Zulu", "Vietnamese", "Uzbek", - "Urdu", "Ukrainian", "Thai", "Telugu", "Tatar", "Tamil", "Tadzhik", "Swahili", - "Sranan Tongo", "Somali", "Sinhalese", "Shona", "Serbo-Croat", "Ruthenian", "Russian", "Quechua", - "Pustu", "Punjabi", "Persian", "Papamiento", "Oriya", "Nepali", "Ndebele", "Marathi", - "Moldavian", "Malaysian", "Malagasay", "Macedonian", "Laotian", "Korean", "Khmer", "Kazakh", - "Kannada", "Japanese", "Indonesian", "Hindi", "Hebrew", "Hausa", "Gurani", "Gujurati", - "Greek", "Georgian", "Fulani", "Dari", "Churash", "Chinese", "Burmese", "Bulgarian", - "Bengali", "Belorussian", "Bambora", "Azerbijani", "Assamese", "Armenian", "Arabic", "Amharic" -}; - -void stats_print_banner(syncinfo_t *syncinfo,bsi_t *bsi) -{ - // fprintf(stdout,PACKAGE"-"VERSION" (C) 2000 Aaron Holtzman (aholtzma@ess.engr.uvic.ca)\n"); - - fprintf(stdout,"%d.%d Mode ",bsi->nfchans,bsi->lfeon); - fprintf(stdout,"%2.1f KHz",syncinfo->sampling_rate * 1e-3); - fprintf(stdout,"%4d kbps ",syncinfo->bit_rate); - if (bsi->langcode && (bsi->langcod < 128)) - fprintf(stdout,"%s ", language[bsi->langcod]); - - switch(bsi->bsmod) - { - case 0: - fprintf(stdout,"Complete Main Audio Service"); - break; - case 1: - fprintf(stdout,"Music and Effects Audio Service"); - case 2: - fprintf(stdout,"Visually Impaired Audio Service"); - break; - case 3: - fprintf(stdout,"Hearing Impaired Audio Service"); - break; - case 4: - fprintf(stdout,"Dialogue Audio Service"); - break; - case 5: - fprintf(stdout,"Commentary Audio Service"); - break; - case 6: - fprintf(stdout,"Emergency Audio Service"); - break; - case 7: - fprintf(stdout,"Voice Over Audio Service"); - break; - } - fprintf(stdout,"\n"); -} - -void stats_print_syncinfo(syncinfo_t *syncinfo) -{ - dprintf("(syncinfo) "); - - switch (syncinfo->fscod) - { - case 2: - dprintf("32 KHz "); - break; - case 1: - dprintf("44.1 KHz "); - break; - case 0: - dprintf("48 KHz "); - break; - default: - dprintf("Invalid sampling rate "); - break; - } - - dprintf("%4d kbps %4d words per frame\n",syncinfo->bit_rate, - syncinfo->frame_size); - -} - -void stats_print_bsi(bsi_t *bsi) -{ - dprintf("(bsi) "); - dprintf("%s",service_ids[bsi->bsmod]); - dprintf(" %d.%d Mode ",bsi->nfchans,bsi->lfeon); - if ((bsi->acmod & 0x1) && (bsi->acmod != 0x1)) - dprintf(" Centre Mix Level %s ",cmixlev_tbl[bsi->cmixlev].desc); - if (bsi->acmod & 0x4) - dprintf(" Sur Mix Level %s ",smixlev_tbl[bsi->cmixlev].desc); - dprintf("\n"); - -} - -char *exp_strat_tbl[4] = {"R ","D15 ","D25 ","D45 "}; - -void stats_print_audblk(bsi_t *bsi,audblk_t *audblk) -{ - uint_32 i; - - dprintf("(audblk) "); - dprintf("%s ",audblk->cplinu ? "cpl on " : "cpl off"); - dprintf("%s ",audblk->baie? "bai " : " "); - dprintf("%s ",audblk->snroffste? "snroffst " : " "); - dprintf("%s ",audblk->deltbaie? "deltba " : " "); - dprintf("%s ",audblk->phsflginu? "phsflg " : " "); - dprintf("(%s %s %s %s %s) ",exp_strat_tbl[audblk->chexpstr[0]], - exp_strat_tbl[audblk->chexpstr[1]],exp_strat_tbl[audblk->chexpstr[2]], - exp_strat_tbl[audblk->chexpstr[3]],exp_strat_tbl[audblk->chexpstr[4]]); - dprintf("["); - for(i=0;infchans;i++) - dprintf("%1d",audblk->blksw[i]); - dprintf("]"); - - dprintf("\n"); -} diff --git a/ac3dec/libac3/stats.h b/ac3dec/libac3/stats.h deleted file mode 100644 index 8a9ecb6..0000000 --- a/ac3dec/libac3/stats.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * stats.h - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -void stats_print_syncinfo(syncinfo_t *syncinfo); -void stats_print_bsi(bsi_t *bsi); -void stats_print_audblk(bsi_t *bsi,audblk_t *audblk); -void stats_print_banner(syncinfo_t *syncinfo,bsi_t *bsi); diff --git a/ac3dec/output.c b/ac3dec/output.c deleted file mode 100644 index 5f707f8..0000000 --- a/ac3dec/output.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (c) by Jaroslav Kysela - * - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - */ - -#include -#include -#include -#include -#include -#include -#include - -typedef signed short sint_16; -typedef unsigned int uint_32; - -#include "output.h" - -static output_t out_config; -static snd_pcm_t *pcm; - -/* - * open the audio device for writing to - */ -int output_open(output_t *output) -{ - const char *pcm_name = output->pcm_name; - char devstr[128]; - const char *basedev; - snd_pcm_hw_params_t *params; - unsigned int rate, buffer_time, period_time, tmp; - snd_pcm_format_t format = output->bits == 16 ? SND_PCM_FORMAT_S16 : SND_PCM_FORMAT_U8; - int err, step; - snd_pcm_hw_params_alloca(¶ms); - - out_config = *output; - - /* - * Open the device driver - */ - if (pcm_name == NULL) { - switch (output->channels) { - case 1: - case 2: - if (output->spdif != SPDIF_NONE) { - unsigned char s[4]; - if (output->spdif == SPDIF_PRO) { - s[0] = (IEC958_AES0_PROFESSIONAL | - IEC958_AES0_NONAUDIO | - IEC958_AES0_PRO_EMPHASIS_NONE | - IEC958_AES0_PRO_FS_48000); - s[1] = (IEC958_AES1_PRO_MODE_NOTID | - IEC958_AES1_PRO_USERBITS_NOTID); - s[2] = IEC958_AES2_PRO_WORDLEN_NOTID; - s[3] = 0; - } else { - s[0] = IEC958_AES0_CON_EMPHASIS_NONE; - if (output->spdif == SPDIF_CON) - s[0] |= IEC958_AES0_NONAUDIO; - s[1] = (IEC958_AES1_CON_ORIGINAL | - IEC958_AES1_CON_PCM_CODER); - s[2] = 0; - s[3] = IEC958_AES3_CON_FS_48000; - } - if (output->hdmi) - basedev = "hdmi"; - else - basedev = "iec958"; - sprintf(devstr, "plug:%s:{" - "AES0 0x%x AES1 0x%x " - "AES2 0x%x AES3 0x%x", - basedev, - s[0], s[1], s[2], s[3]); - if (out_config.card) - sprintf(devstr + strlen(devstr), - " CARD %s", out_config.card); - strcat(devstr, "}"); - format = SND_PCM_FORMAT_S16_LE; - } else { - if (out_config.card) - sprintf(devstr, "plughw:%s", out_config.card); - else - sprintf(devstr, "default"); - } - break; - case 4: - strcpy(devstr, "plug:surround40"); - if (out_config.card) - sprintf(devstr + strlen(devstr), ":{CARD %s}", out_config.card); - break; - case 6: - strcpy(devstr, "plug:surround51"); - if (out_config.card) - sprintf(devstr + strlen(devstr), ":{CARD %s}", out_config.card); - break; - default: - fprintf(stderr, "%d channels are not supported\n", output->channels); - return -EINVAL; - } - pcm_name = devstr; - } - if (!output->quiet) - fprintf(stdout, "Using PCM device '%s'\n", pcm_name); - if ((err = snd_pcm_open(&pcm, pcm_name, SND_PCM_STREAM_PLAYBACK, 0)) < 0) { - fprintf(stderr, "snd_pcm_open: %s\n", snd_strerror(err)); - return err; - } - err = snd_pcm_hw_params_any(pcm, params); - if (err < 0) { - fprintf(stderr, "Broken configuration for this PCM: no configurations available"); - goto __close; - } - /* set interleaved access */ - err = snd_pcm_hw_params_set_access(pcm, params, - SND_PCM_ACCESS_RW_INTERLEAVED); - if (err < 0) { - fprintf(stderr, "Access type not available\n"); - goto __close; - } - err = snd_pcm_hw_params_set_format(pcm, params, format); - if (err < 0) { - fprintf(stderr, "Sample format non available\n"); - goto __close; - } - err = snd_pcm_hw_params_set_channels(pcm, params, output->channels); - if (err < 0) { - fprintf(stderr, "Channels count non available\n"); - goto __close; - } - rate = output->rate; - err = snd_pcm_hw_params_set_rate_near(pcm, params, &rate, 0); - if (err < 0) { - fprintf(stderr, "Rate not available\n"); - goto __close; - } - buffer_time = 500000; - err = snd_pcm_hw_params_set_buffer_time_near(pcm, params, &buffer_time, 0); - if (err < 0) { - fprintf(stderr, "Buffer time not available\n"); - goto __close; - } - step = 2; - period_time = 10000 * 2; - do { - period_time /= 2; - tmp = period_time; - err = snd_pcm_hw_params_set_period_time_near(pcm, params, &tmp, 0); - if (err < 0) { - fprintf(stderr, "Period time not available\n"); - goto __close; - } - if (tmp == period_time) { - period_time /= 3; - tmp = period_time; - err = snd_pcm_hw_params_set_period_time_near(pcm, params, &tmp, 0); - if (tmp == period_time) - period_time = 10000 * 2; - } - } while (buffer_time == period_time && period_time > 10000); - if (buffer_time == period_time) { - fprintf(stderr, "Buffer time and period time match, could not use\n"); - goto __close; - } - if ((err = snd_pcm_hw_params(pcm, params)) < 0) { - fprintf(stderr, "PCM hw_params failed: %s\n", snd_strerror(err)); - goto __close; - } - - return 0; - - __close: - snd_pcm_close(pcm); - pcm = NULL; - return err; -} - -/* - * play the sample to the already opened file descriptor - */ -int output_play(sint_16* output_samples, uint_32 num_frames) -{ - snd_pcm_sframes_t res = 0; - - do { - if (res == -EPIPE) /* underrun */ - res = snd_pcm_prepare(pcm); - else if (res == -ESTRPIPE) { /* suspend */ - while ((res = snd_pcm_resume(pcm)) == -EAGAIN) - sleep(1); - if (res < 0) - res = snd_pcm_prepare(pcm); - } - res = res < 0 ? res : snd_pcm_writei(pcm, (void *)output_samples, num_frames); - if (res > 0) { - output_samples += out_config.channels * res; - num_frames -= res; - } - } while (res == -EPIPE || num_frames > 0); - if (res < 0) - fprintf(stderr, "writei returned error: %s\n", snd_strerror(res)); - return res < 0 ? (int)res : 0; -} - - -void -output_close(void) -{ - snd_pcm_close(pcm); -} diff --git a/ac3dec/output.h b/ac3dec/output.h deleted file mode 100644 index 95e535f..0000000 --- a/ac3dec/output.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * - * output.h - * - * Based on original code by Angus Mackay (amackay@gus.ml.org) - * - * Copyright (C) Aaron Holtzman - May 1999 - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -typedef struct { - const char *pcm_name; - char *card; - int bits; - int rate; - int channels; - unsigned int quiet: 1; - unsigned int hdmi: 1; - enum {SPDIF_NONE = 0, SPDIF_CON, SPDIF_PRO, SPDIF_PCM} spdif; -} output_t; - -int output_open(output_t *output); -int output_play(sint_16* output_samples, uint_32 num_bytes); -void output_close(void); diff --git a/ac3dec/plot_spectrum.m b/ac3dec/plot_spectrum.m deleted file mode 100644 index 43f4806..0000000 --- a/ac3dec/plot_spectrum.m +++ /dev/null @@ -1,17 +0,0 @@ - -window_size = 2048; -f = 0:48000/window_size:48000 * (1 - 1/window_size); -w = transpose(hamming(1536)); -n = size(foo,1); - -spectrum = zeros(1,window_size); - -for i = [1:n] - data = w .* foo(i,:); - spectrum = spectrum + abs(fft(data,window_size)); -end - -plot(f,10*log10(spectrum/max(spectrum))); -grid; -axis([0 24000 -40 0]); - diff --git a/ac3dec/test/Makefile.am b/ac3dec/test/Makefile.am deleted file mode 100644 index ffed19e..0000000 --- a/ac3dec/test/Makefile.am +++ /dev/null @@ -1,37 +0,0 @@ -INCLUDES = -I../libac3 -noinst_PROGRAMS = imdct_test dither_test -#noinst_PROGRAMS = bitstream_test imdct_test imdct_timing uncouple_timing\ - #crc_timing -noinst_HEADERS = timing.h - -#bitstream_test_SOURCES = bitstream_test.c -#bitstream_test_LDADD = ../bitstream.o ../crc.o -# -dither_test_SOURCES = dither_test.c -dither_test_LDADD = ../libac3/dither.o - -imdct_test_SOURCES = imdct_test.c -imdct_test_LDADD = ../libac3/imdct.o -lm -# -#imdct_timing_SOURCES = imdct_timing.c timing.c -#imdct_timing_LDADD = ../imdct.o -lm -# -#uncouple_timing_SOURCES = uncouple_timing.c timing.c -#uncouple_timing_LDADD = ../uncouple.o ../dither.o -lm -# -#crc_timing_SOURCES = crc_timing.c timing.c -#crc_timing_LDADD = ../crc.o -lm - -check: -# rm -f bitstream_test.out -# ./bitstream_test > bitstream_test.out -# diff bitstream_test.out bitstream_test.out.ref -# rm -f imdct_test.out -# ./imdct_test > imdct_test.out -# diff imdct_test.out imdct_test.out.ref - rm -f dither_test.out - ./dither_test > dither_test.out - diff dither_test.out dither_test.out.ref - -clean: - rm -f *.out diff --git a/ac3dec/test/dither_test.c b/ac3dec/test/dither_test.c deleted file mode 100644 index e45dc71..0000000 --- a/ac3dec/test/dither_test.c +++ /dev/null @@ -1,43 +0,0 @@ -/* - * dither_test.c - * - * Aaron Holtzman - May 1999 - * - */ - -#include -#include -#include "ac3.h" -#include "ac3_internal.h" -#include "dither.h" - -#include -#include - -int main(void) -{ - int i,j,foo; - struct timeval start,end; - - /* - for(i=0;i < 65538 ;i++) - //printf("%04x\n",dither_gen()); - printf("%f\n",((sint_16)dither_gen())/ 32768.0); - printf("\n"); - */ - - - - for(j=0;j < 10 ;j++) - { - gettimeofday(&start,0); - for(i=0;i < 10000 ;i++) - { - foo = dither_gen(); - } - gettimeofday(&end,0); - printf("%f us\n",((end.tv_sec - start.tv_sec) * 1000000 + - (end.tv_usec - start.tv_usec))/10000.0); - } - -} diff --git a/ac3dec/test/imdct_test.c b/ac3dec/test/imdct_test.c deleted file mode 100644 index 12572d1..0000000 --- a/ac3dec/test/imdct_test.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * imdct_test.c - * - * Aaron Holtzman - May 1999 - * - */ - -#include -#include -#include "ac3.h" -#include "ac3_internal.h" -#include "imdct.h" - -static stream_samples_t samples; -static bsi_t bsi; -static audblk_t audblk; - -int main(void) -{ - int i; - - samples[0][20] = 0.4; - samples[0][40] = 0.4; - samples[0][30] = 1.0; - - - imdct_init(); - bsi.nfchans = 1; - - imdct(&bsi,&audblk,samples); - - - for(i=0;i<256;i++) - printf("%1.8f\n",samples[0][i]); - - return 0; - -} diff --git a/ac3dec/test/timing.h b/ac3dec/test/timing.h deleted file mode 100644 index 9d8da62..0000000 --- a/ac3dec/test/timing.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * timing.h - * - * Aaron Holtzman - May 1999 - * - */ - -//uint_64 get_time(void); -uint_64 timing_init(void); - -void timing_test_2(void (*func)(void*,void*),void *arg_1,void *arg_2,char name[]); -void timing_test_3(void (*func)(void*,void*,void*),void *arg_1,void *arg_2,void *arg_3,char name[]); -double timing_once_3(void (*func)(void*,void*,void*),void *arg_1,void *arg_2,void *arg_3); - diff --git a/ac3dec/tools/Makefile.am b/ac3dec/tools/Makefile.am deleted file mode 100644 index 9dc32b4..0000000 --- a/ac3dec/tools/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -# # Process this file with automake to produce Makefile.in. -AUTOMAKE_OPTIONS = 1.3 foreign - -CFLAGS = -Wall -O3 -g - -bin_PROGRAMS = extract_ac3 - - -extract_ac3_SOURCES = extract_ac3.c -#verify is broken right now -#verify_ac3_SOURCES = verify_ac3.c -#verify_ac3_LDADD = ../parse.o ../bitstream.o ../crc.o ../debug.o ../stats.o diff --git a/ac3dec/tools/extract_ac3.c b/ac3dec/tools/extract_ac3.c deleted file mode 100644 index e14cf5c..0000000 --- a/ac3dec/tools/extract_ac3.c +++ /dev/null @@ -1,314 +0,0 @@ -/* - * extract_ac3.c - * - * Copyright (C) Aaron Holtzman - June 1999 - * - * Extracts an AC-3 audio stream from an MPEG-2 system stream - * and writes it to stdout - * - * Ideas and bitstream syntax info borrowed from code written - * by Nathan Laredo - * - * Multiple track support by Yuqing Deng - * - * - * This file is part of ac3dec, a free Dolby AC-3 stream decoder. - * - * ac3dec is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * ac3dec is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Make; see the file COPYING. If not, write to - * the Free Software Foundation, - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/* Audio track to play */ -static unsigned char track_code = 0x80; -static unsigned char track_table[8] = -{ - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87 -}; - -#define BUFSIZE 512 /* needs to be as big as biggest header */ -static int vobf; -static unsigned char buf[BUFSIZE]; -static unsigned char *cur_pos; -static unsigned char *end_pos; - -void file_init(char file_name[]) -{ - if(file_name[0] == '-' && file_name[1] == '\0') - { - vobf = STDIN_FILENO; - } - else if ((vobf = open(file_name, O_RDONLY)) < 0) - { - fprintf(stderr,"File not found\n"); - exit(1); - } - cur_pos = buf; - end_pos = buf; -} - -inline void increment_position(long x) -{ - if(cur_pos + x <= end_pos) - { - cur_pos += x; - if(cur_pos == end_pos) - { - cur_pos = buf; - end_pos = buf; - } - } - else - { - long size = 0; - x -= (long)(end_pos - cur_pos); -#ifdef SEEK_PIPES - if(lseek(vobf, x, SEEK_CUR) < 0) - { - fprintf(stderr, "Error: unexpected end of stream\n"); - exit(1); - } -#else - while(x) - { - size = (x > BUFSIZE) ? BUFSIZE : x; - if(read(vobf, buf, size) < size) - { - fprintf(stderr, "Error: unexpected end of stream\n"); - exit(1); - } - x-=size; - } -#endif - cur_pos = buf; - end_pos = buf; - } -} - -inline static void load_next_bytes(long count) -{ - if(cur_pos + count <= end_pos) - return; - if(cur_pos + count > buf + BUFSIZE - 1 ) - { - printf ("No buffer space to read %ld bytes\n", count); - exit(1); - } - - count -= (long)(end_pos - cur_pos); - if(read(vobf, end_pos, count) < count) - { - fprintf(stderr, "Error: unexpected end of stream\n"); - exit(1); - } - end_pos += count; -} - -inline int next_24_bits(long x) -{ - load_next_bytes(3); - if (cur_pos[0] != ((x >> 16) & 0xff)) - return 0; - if (cur_pos[1] != ((x >> 8) & 0xff)) - return 0; - if (cur_pos[2] != ((x ) & 0xff)) - return 0; - - return 1; -} - -inline int next_32_bits(long x) -{ - load_next_bytes(4); - if (cur_pos[0] != ((x >> 24) & 0xff)) - return 0; - if (cur_pos[1] != ((x >> 16) & 0xff)) - return 0; - if (cur_pos[2] != ((x >> 8) & 0xff)) - return 0; - if (cur_pos[3] != ((x ) & 0xff)) - return 0; - - return 1; -} - -void read_write_next_bytes(long count, int outfd) -{ - long size; - size = (long)(end_pos - cur_pos); - if(size > count) - { - write(outfd, cur_pos, count); - cur_pos +=count; - if(cur_pos == end_pos) - { - cur_pos = buf; - end_pos = buf; - } - return; - } - else if(size > 0) - { - write(outfd, cur_pos, size); - } - - while(count) - { - size = (count > BUFSIZE) ? BUFSIZE : count; - if(read(vobf, buf, size) < size || - write(outfd, buf, size) < size) - { - fprintf(stderr, "Error: unexpected end of stream\n"); - } - count -= size; - } - cur_pos = buf; - end_pos = buf; -} - -void parse_pes(void) -{ - unsigned long data_length; - unsigned long header_length; - - load_next_bytes(9); - - //The header length is the PES_header_data_length byte plus 6 for the packet - //start code and packet size, 3 for the PES_header_data_length and two - //misc bytes, and finally 4 bytes for the mystery AC3 packet tag - header_length = cur_pos[8] + 6 + 3 + 4 ; - data_length =(cur_pos[4]<<8) + cur_pos[5]; - - - //If we have AC-3 audio then output it - if(cur_pos[3] == 0xbd) - { - load_next_bytes(header_length); -#if 0 - //Debugging printfs - fprintf(stderr,"start of pes curpos[] = %02x%02x%02x%02x\n", - cur_pos[0],cur_pos[1],cur_pos[2],cur_pos[3]); - fprintf(stderr,"header_length = %d data_length = %x\n", - header_length, data_length); - fprintf(stderr,"extra crap 0x%02x%02x%02x%02x data size 0x%0lx\n",cur_pos[header_length-4], - cur_pos[header_length-3],cur_pos[header_length-2],cur_pos[header_length-1],data_length); -#endif - - //Only extract the track we want - if((cur_pos[header_length-4] == track_code )) - { - increment_position(header_length); - read_write_next_bytes(data_length - header_length + 6, STDOUT_FILENO); - - } - else - { - increment_position(data_length + 6); - } - } - else - { - //The packet size is data_length plus 6 bytes to account for the - //packet start code and the data_length itself. - increment_position(data_length + 6); - } -} - -void parse_pack(void) -{ - unsigned long skip_length; - - // Deal with the pack header - // The first 13 bytes are junk. The fourteenth byte - // contains the number of stuff bytes - load_next_bytes(14); - skip_length = cur_pos[13] & 0x7; - increment_position(14 + skip_length); - - // Deal with the system header if it exists - if(next_32_bits(0x000001bb)) - { - // Bytes 5 and 6 contain the length of the header minus 6 - load_next_bytes(6); - skip_length = (cur_pos[4] << 8) + cur_pos[5]; - increment_position(6 + skip_length); - } - - while(next_24_bits(0x000001) && !next_32_bits(0x000001ba)) - { - parse_pes(); - } -} - -int main(int argc, char *argv[]) -{ - int track = 0; - - if (argc < 2) { - fprintf(stderr, "usage: %s mpeg_stream [track number]\n", argv[0]); - exit(1); - } - - if (argc == 3) - { - track = strtol(argv[2], NULL, 0); - fprintf(stderr,"Extracting track %d\n",track); - } - - if (track < 0 || track > 7) - { - fprintf(stderr, "Invalid track number: %d\n", track); - exit(1); - } - - track_code = track_table[track]; - - - - file_init(argv[1]); - - if(!next_32_bits(0x000001ba)) - { - fprintf(stderr, "Non-program streams not handled - exiting\n\n"); - exit(1); - } - - do - { - parse_pack(); - } - while(next_32_bits(0x000001ba)); - - fprintf(stderr,"curpos[] = %x%x%x%x\n",cur_pos[0],cur_pos[1],cur_pos[2],cur_pos[3]); - - if(!next_32_bits(0x000001b9)) - { - fprintf(stderr, "Error: expected end of stream code\n"); - exit(1); - } - - if(vobf != STDIN_FILENO) close(vobf); - return 0; -}