diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.am | 152 | ||||
| -rw-r--r-- | src/fec/LICENSE | 502 | ||||
| -rw-r--r-- | src/fec/README.md | 12 | ||||
| -rw-r--r-- | src/fec/char.h | 24 | ||||
| -rw-r--r-- | src/fec/decode_rs.h | 298 | ||||
| -rw-r--r-- | src/fec/decode_rs_char.c | 22 | ||||
| -rw-r--r-- | src/fec/encode_rs.h | 58 | ||||
| -rw-r--r-- | src/fec/encode_rs_char.c | 15 | ||||
| -rw-r--r-- | src/fec/fec.h | 30 | ||||
| -rw-r--r-- | src/fec/init_rs.h | 106 | ||||
| -rw-r--r-- | src/fec/init_rs_char.c | 35 | ||||
| -rw-r--r-- | src/fec/rs-common.h | 26 | ||||
| -rw-r--r-- | src/zmq.hpp | 602 | 
13 files changed, 0 insertions, 1882 deletions
| diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index 1087588..0000000 --- a/src/Makefile.am +++ /dev/null @@ -1,152 +0,0 @@ -# Copyright (C) 2008, 2009,2012 Her Majesty the Queen in Right of Canada -# (Communications Research Center Canada) -# Pascal Charest -# -# Copyright (C) 2017, Matthias P. Braendli, http://opendigitalradio.org -# - -# This file is part of ODR-DabMux. -#  -# ODR-DabMux 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 3 of the -# License, or (at your option) any later version. -#  -# ODR-DabMux 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 ODR-DabMux.  If not, see <http://www.gnu.org/licenses/>. - -if IS_GIT_REPO -GITVERSION_FLAGS = -DGITVERSION="\"`git describe --dirty`\"" -else -GITVERSION_FLAGS = -endif - -bin_PROGRAMS=odr-dabmux zmqinput-keygen - -if HAVE_OUTPUT_RAW_TEST -bin_PROGRAMS+=odr-zmq2farsync -endif - -if HAVE_EDI_TEST -bin_PROGRAMS+=odr-zmq2edi -CURL_LIBS    =-lcurl -else -CURL_LIBS    = -endif - -odr_dabmux_CFLAGS   =-Wall -I$(FARSYNC_DIR) $(GITVERSION_FLAGS) -odr_dabmux_CXXFLAGS =-Wall -std=c++11 -I$(FARSYNC_DIR) $(GITVERSION_FLAGS) $(BOOST_CPPFLAGS) $(ZMQ_CPPFLAGS) -odr_dabmux_LDADD    =$(ZMQ_LIBS) $(CURL_LIBS) $(BOOST_LDFLAGS) \ -					 -lpthread $(BOOST_SYSTEM_LIB) $(BOOST_THREAD_LIB) $(BOOST_ASIO_LIB) - -odr_dabmux_SOURCES  =DabMux.cpp DabMux.h \ -					 DabMultiplexer.cpp DabMultiplexer.h \ -					 input/inputs.h \ -					 input/Prbs.cpp input/Prbs.h \ -					 input/Zmq.cpp input/Zmq.h \ -					 input/File.cpp input/File.h \ -					 input/Udp.cpp input/Udp.h \ -					 dabOutput/dabOutput.h \ -					 dabOutput/dabOutputFile.cpp \ -					 dabOutput/dabOutputFifo.cpp \ -					 dabOutput/dabOutputRaw.cpp \ -					 dabOutput/dabOutputSimul.cpp \ -					 dabOutput/dabOutputTcp.cpp \ -					 dabOutput/dabOutputUdp.cpp \ -					 dabOutput/dabOutputZMQ.cpp \ -					 dabOutput/metadata.h dabOutput/metadata.cpp \ -					 dabOutput/edi/AFPacket.cpp dabOutput/edi/AFPacket.h \ -					 dabOutput/edi/TagItems.cpp dabOutput/edi/TagItems.h \ -					 dabOutput/edi/TagPacket.cpp dabOutput/edi/TagPacket.h \ -					 dabOutput/edi/PFT.cpp dabOutput/edi/PFT.h \ -					 dabOutput/edi/Interleaver.cpp dabOutput/edi/Interleaver.h \ -					 ClockTAI.h ClockTAI.cpp \ -					 ConfigParser.cpp ConfigParser.h \ -					 Eti.h Eti.cpp \ -					 InetAddress.h InetAddress.cpp \ -					 Interleaver.h Interleaver.cpp \ -					 Log.h Log.cpp \ -					 ManagementServer.h ManagementServer.cpp \ -					 MuxElements.cpp MuxElements.h \ -					 PcDebug.h \ -					 ReedSolomon.h ReedSolomon.cpp \ -					 RemoteControl.cpp RemoteControl.h \ -					 TcpSocket.h TcpSocket.cpp \ -					 UdpSocket.h UdpSocket.cpp \ -					 ThreadsafeQueue.h \ -					 crc.h crc.c \ -					 fig/FIG.h fig/FIG.cpp \ -					 fig/FIG0.h fig/FIG0structs.h \ -					 fig/FIG0_0.cpp fig/FIG0_0.h \ -					 fig/FIG0_1.cpp fig/FIG0_1.h \ -					 fig/FIG0_2.cpp fig/FIG0_2.h \ -					 fig/FIG0_3.cpp fig/FIG0_3.h \ -					 fig/FIG0_5.cpp fig/FIG0_5.h \ -					 fig/FIG0_6.cpp fig/FIG0_6.h \ -					 fig/FIG0_8.cpp fig/FIG0_8.h \ -					 fig/FIG0_9.cpp fig/FIG0_9.h \ -					 fig/FIG0_10.cpp fig/FIG0_10.h \ -					 fig/FIG0_13.cpp fig/FIG0_13.h \ -					 fig/FIG0_17.cpp fig/FIG0_17.h \ -					 fig/FIG0_18.cpp fig/FIG0_18.h \ -					 fig/FIG0_19.cpp fig/FIG0_19.h \ -					 fig/FIG0_21.cpp fig/FIG0_21.h \ -					 fig/FIG0_24.cpp fig/FIG0_24.h \ -					 fig/FIG1.cpp fig/FIG1.h \ -					 fig/FIGCarousel.cpp fig/FIGCarousel.h \ -					 fig/TransitionHandler.h \ -					 mpeg.h mpeg.c \ -					 PrbsGenerator.cpp PrbsGenerator.h \ -					 utils.cpp utils.h \ -					 zmq.hpp \ -					 fec/char.h fec/rs-common.h \ -					 fec/decode_rs_char.c fec/decode_rs.h \ -					 fec/encode_rs_char.c fec/encode_rs.h \ -					 fec/fec.h \ -					 fec/init_rs_char.c fec/init_rs.h - -zmqinput_keygen_SOURCES  = zmqinput-keygen.c -zmqinput_keygen_LDADD    = $(ZMQ_LIBS) -zmqinput_keygen_CFLAGS   = -Wall $(GITVERSION_FLAGS) $(ZMQ_CPPFLAGS) - -odr_zmq2farsync_SOURCES  = zmq2farsync/zmq2farsync.cpp \ -                           dabOutput/dabOutput.h \ -                           dabOutput/dabOutputRaw.cpp \ -                           Log.h Log.cpp \ -                           zmq.hpp -odr_zmq2farsync_LDADD    = $(ZMQ_LIBS) -odr_zmq2farsync_CFLAGS   = -Wall $(ZMQ_CPPFLAGS) $(GITVERSION_FLAGS) -I$(FARSYNC_DIR) -odr_zmq2farsync_CXXFLAGS = -Wall -std=c++11 $(ZMQ_CPPFLAGS) $(GITVERSION_FLAGS) -I$(FARSYNC_DIR) - -odr_zmq2edi_SOURCES  = zmq2edi/zmq2edi.cpp \ -					   zmq2edi/EDISender.h zmq2edi/EDISender.cpp \ -					   dabOutput/dabOutput.h \ -					   dabOutput/metadata.h dabOutput/metadata.cpp \ -					   dabOutput/edi/AFPacket.cpp dabOutput/edi/AFPacket.h \ -					   dabOutput/edi/TagItems.cpp dabOutput/edi/TagItems.h \ -					   dabOutput/edi/TagPacket.cpp dabOutput/edi/TagPacket.h \ -					   dabOutput/edi/PFT.cpp dabOutput/edi/PFT.h \ -					   dabOutput/edi/Interleaver.cpp dabOutput/edi/Interleaver.h \ -					   InetAddress.h InetAddress.cpp \ -					   UdpSocket.h UdpSocket.cpp \ -					   ReedSolomon.h ReedSolomon.cpp \ -					   fec/char.h fec/rs-common.h \ -					   fec/decode_rs_char.c fec/decode_rs.h \ -					   fec/encode_rs_char.c fec/encode_rs.h \ -					   fec/fec.h \ -					   fec/init_rs_char.c fec/init_rs.h \ -					   Log.h Log.cpp \ -					   crc.h crc.c \ -					   zmq.hpp -odr_zmq2edi_LDADD    = $(ZMQ_LIBS) \ -					   -lpthread $(BOOST_THREAD_LIB) $(BOOST_SYSTEM_LIB) -odr_zmq2edi_CFLAGS   = -Wall $(ZMQ_CPPFLAGS) $(GITVERSION_FLAGS) -odr_zmq2edi_CXXFLAGS = -Wall -std=c++11 $(ZMQ_CPPFLAGS) $(GITVERSION_FLAGS) - -EXTRA_DIST = fec/README.md \ -			 fec/LICENSE diff --git a/src/fec/LICENSE b/src/fec/LICENSE deleted file mode 100644 index 5a883d3..0000000 --- a/src/fec/LICENSE +++ /dev/null @@ -1,502 +0,0 @@ -GNU LESSER GENERAL PUBLIC LICENSE -                       Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -(This is the first released version of the Lesser GPL.  It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.) - -                            Preamble - -  The licenses for most software are designed to take away your -freedom to share and change it.  By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - -  This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it.  You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - -  When we speak of free software, we are referring to freedom of use, -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 and use pieces of -it in new free programs; and that you are informed that you can do -these things. - -  To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights.  These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - -  For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you.  You must make sure that they, too, receive or can get the source -code.  If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it.  And you must show them these terms so they know their rights. - -  We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - -  To protect each distributor, we want to make it very clear that -there is no warranty for the free library.  Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - -  Finally, software patents pose a constant threat to the existence of -any free program.  We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder.  Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - -  Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License.  This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License.  We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - -  When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library.  The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom.  The Lesser General -Public License permits more lax criteria for linking other code with -the library. - -  We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License.  It also provides other free software developers Less -of an advantage over competing non-free programs.  These disadvantages -are the reason we use the ordinary General Public License for many -libraries.  However, the Lesser license provides advantages in certain -special circumstances. - -  For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard.  To achieve this, non-free programs must be -allowed to use the library.  A more frequent case is that a free -library does the same job as widely used non-free libraries.  In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - -  In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software.  For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - -  Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - -  The precise terms and conditions for copying, distribution and -modification follow.  Pay close attention to the difference between a -"work based on the library" and a "work that uses the library".  The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - -                  GNU LESSER GENERAL PUBLIC LICENSE -   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -  0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - -  A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - -  The "Library", below, refers to any such software library or work -which has been distributed under these terms.  A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language.  (Hereinafter, translation is -included without limitation in the term "modification".) - -  "Source code" for a work means the preferred form of the work for -making modifications to it.  For a library, 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 library. - -  Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope.  The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it).  Whether that is true depends on what the Library does -and what the program that uses the Library does. - -  1. You may copy and distribute verbatim copies of the Library's -complete 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 distribute a copy of this License along with the -Library. - -  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 Library or any portion -of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. - -    b) You must cause the files modified to carry prominent notices -    stating that you changed the files and the date of any change. - -    c) You must cause the whole of the work to be licensed at no -    charge to all third parties under the terms of this License. - -    d) If a facility in the modified Library refers to a function or a -    table of data to be supplied by an application program that uses -    the facility, other than as an argument passed when the facility -    is invoked, then you must make a good faith effort to ensure that, -    in the event an application does not supply such function or -    table, the facility still operates, and performs whatever part of -    its purpose remains meaningful. - -    (For example, a function in a library to compute square roots has -    a purpose that is entirely well-defined independent of the -    application.  Therefore, Subsection 2d requires that any -    application-supplied function or table used by this function must -    be optional: if the application does not supply it, the square -    root function must still compute square roots.) - -These requirements apply to the modified work as a whole.  If -identifiable sections of that work are not derived from the Library, -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 Library, 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 Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - -  3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library.  To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License.  (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.)  Do not make any other change in -these notices. - -  Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - -  This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - -  4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you 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. - -  If distribution of 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 satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - -  5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library".  Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - -  However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library".  The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - -  When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library.  The -threshold for this to be true is not precisely defined by law. - -  If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work.  (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - -  Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - -  6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - -  You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License.  You must supply a copy of this License.  If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License.  Also, you must do one -of these things: - -    a) Accompany the work with the complete corresponding -    machine-readable source code for the Library including whatever -    changes were used in the work (which must be distributed under -    Sections 1 and 2 above); and, if the work is an executable linked -    with the Library, with the complete machine-readable "work that -    uses the Library", as object code and/or source code, so that the -    user can modify the Library and then relink to produce a modified -    executable containing the modified Library.  (It is understood -    that the user who changes the contents of definitions files in the -    Library will not necessarily be able to recompile the application -    to use the modified definitions.) - -    b) Use a suitable shared library mechanism for linking with the -    Library.  A suitable mechanism is one that (1) uses at run time a -    copy of the library already present on the user's computer system, -    rather than copying library functions into the executable, and (2) -    will operate properly with a modified version of the library, if -    the user installs one, as long as the modified version is -    interface-compatible with the version that the work was made with. - -    c) Accompany the work with a written offer, valid for at -    least three years, to give the same user the materials -    specified in Subsection 6a, above, for a charge no more -    than the cost of performing this distribution. - -    d) If distribution of the work is made by offering access to copy -    from a designated place, offer equivalent access to copy the above -    specified materials from the same place. - -    e) Verify that the user has already received a copy of these -    materials or that you have already sent this user a copy. - -  For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it.  However, as a special exception, -the materials to be 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. - -  It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system.  Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - -  7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - -    a) Accompany the combined library with a copy of the same work -    based on the Library, uncombined with any other library -    facilities.  This must be distributed under the terms of the -    Sections above. - -    b) Give prominent notice with the combined library of the fact -    that part of it is a work based on the Library, and explaining -    where to find the accompanying uncombined form of the same work. - -  8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License.  Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library 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. - -  9. 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 Library or its derivative works.  These actions are -prohibited by law if you do not accept this License.  Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - -  10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -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 with -this License. - -  11. 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 Library at all.  For example, if a patent -license would not permit royalty-free redistribution of the Library 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 Library. - -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. - -  12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library 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. - -  13. The Free Software Foundation may publish revised and/or new -versions of the Lesser 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 Library -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 Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - -  14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -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 - -  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "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 -LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -  16. 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 LIBRARY 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 -LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries - -  If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change.  You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - -  To apply these terms, attach the following notices to the library.  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. - -    {description} -    Copyright (C) {year} {fullname} - -    This library is free software; you can redistribute it and/or -    modify it under the terms of the GNU Lesser General Public -    License as published by the Free Software Foundation; either -    version 2.1 of the License, or (at your option) any later version. - -    This library 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 -    Lesser General Public License for more details. - -    You should have received a copy of the GNU Lesser General Public -    License along with this library; if not, write to the Free Software -    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary.  Here is a sample; alter the names: - -  Yoyodyne, Inc., hereby disclaims all copyright interest in the -  library `Frob' (a library for tweaking knobs) written by James Random Hacker. - -  {signature of Ty Coon}, 1 April 1990 -  Ty Coon, President of Vice - -That's all there is to it! diff --git a/src/fec/README.md b/src/fec/README.md deleted file mode 100644 index a44d28d..0000000 --- a/src/fec/README.md +++ /dev/null @@ -1,12 +0,0 @@ -FEC routines from KA9Q's libfec -=============================== - -This folder contains part of the libfec library by KA9Q. Only the -char-sized Reed-Solomon encoder and decoder is here. - -The files have been copied from the libfec fork at -https://github.com/Opendigitalradio/ka9q-fec - -Original code is at http://www.ka9q.net/code/fec/ - -All files in this folder are licenced under the LGPL v2.1, please see LICENCE diff --git a/src/fec/char.h b/src/fec/char.h deleted file mode 100644 index 25efd65..0000000 --- a/src/fec/char.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Stuff specific to the 8-bit symbol version of the general purpose RS codecs - * - * Copyright 2003, Phil Karn, KA9Q - * May be used under the terms of the GNU Lesser General Public License (LGPL) - */ -typedef unsigned char data_t; - -#define MODNN(x) modnn(rs,x) - -#define MM (rs->mm) -#define NN (rs->nn) -#define ALPHA_TO (rs->alpha_to)  -#define INDEX_OF (rs->index_of) -#define GENPOLY (rs->genpoly) -#define NROOTS (rs->nroots) -#define FCR (rs->fcr) -#define PRIM (rs->prim) -#define IPRIM (rs->iprim) -#define PAD (rs->pad) -#define A0 (NN) - - - - diff --git a/src/fec/decode_rs.h b/src/fec/decode_rs.h deleted file mode 100644 index c165cf3..0000000 --- a/src/fec/decode_rs.h +++ /dev/null @@ -1,298 +0,0 @@ -/* The guts of the Reed-Solomon decoder, meant to be #included - * into a function body with the following typedefs, macros and variables supplied - * according to the code parameters: - - * data_t - a typedef for the data symbol - * data_t data[] - array of NN data and parity symbols to be corrected in place - * retval - an integer lvalue into which the decoder's return code is written - * NROOTS - the number of roots in the RS code generator polynomial, - *          which is the same as the number of parity symbols in a block. -            Integer variable or literal. - * NN - the total number of symbols in a RS block. Integer variable or literal. - * PAD - the number of pad symbols in a block. Integer variable or literal. - * ALPHA_TO - The address of an array of NN elements to convert Galois field - *            elements in index (log) form to polynomial form. Read only. - * INDEX_OF - The address of an array of NN elements to convert Galois field - *            elements in polynomial form to index (log) form. Read only. - * MODNN - a function to reduce its argument modulo NN. May be inline or a macro. - * FCR - An integer literal or variable specifying the first consecutive root of the - *       Reed-Solomon generator polynomial. Integer variable or literal. - * PRIM - The primitive root of the generator poly. Integer variable or literal. - * DEBUG - If set to 1 or more, do various internal consistency checking. Leave this - *         undefined for production code - - * The memset(), memmove(), and memcpy() functions are used. The appropriate header - * file declaring these functions (usually <string.h>) must be included by the calling - * program. - */ - - -#if !defined(NROOTS) -#error "NROOTS not defined" -#endif - -#if !defined(NN) -#error "NN not defined" -#endif - -#if !defined(PAD) -#error "PAD not defined" -#endif - -#if !defined(ALPHA_TO) -#error "ALPHA_TO not defined" -#endif - -#if !defined(INDEX_OF) -#error "INDEX_OF not defined" -#endif - -#if !defined(MODNN) -#error "MODNN not defined" -#endif - -#if !defined(FCR) -#error "FCR not defined" -#endif - -#if !defined(PRIM) -#error "PRIM not defined" -#endif - -#if !defined(NULL) -#define NULL ((void *)0) -#endif - -#undef MIN -#define	MIN(a,b)	((a) < (b) ? (a) : (b)) -#undef A0 -#define A0 (NN) - -{ -  int deg_lambda, el, deg_omega; -  int i, j, r,k; -  data_t u,q,tmp,num1,num2,den,discr_r; -  data_t lambda[NROOTS+1], s[NROOTS];	/* Err+Eras Locator poly -					 * and syndrome poly */ -  data_t b[NROOTS+1], t[NROOTS+1], omega[NROOTS+1]; -  data_t root[NROOTS], reg[NROOTS+1], loc[NROOTS]; -  int syn_error, count; - -  /* form the syndromes; i.e., evaluate data(x) at roots of g(x) */ -  for(i=0;i<NROOTS;i++) -    s[i] = data[0]; - -  for(j=1;j<NN-PAD;j++){ -    for(i=0;i<NROOTS;i++){ -      if(s[i] == 0){ -	s[i] = data[j]; -      } else { -	s[i] = data[j] ^ ALPHA_TO[MODNN(INDEX_OF[s[i]] + (FCR+i)*PRIM)]; -      } -    } -  } - -  /* Convert syndromes to index form, checking for nonzero condition */ -  syn_error = 0; -  for(i=0;i<NROOTS;i++){ -    syn_error |= s[i]; -    s[i] = INDEX_OF[s[i]]; -  } - -  if (!syn_error) { -    /* if syndrome is zero, data[] is a codeword and there are no -     * errors to correct. So return data[] unmodified -     */ -    count = 0; -    goto finish; -  } -  memset(&lambda[1],0,NROOTS*sizeof(lambda[0])); -  lambda[0] = 1; - -  if (no_eras > 0) { -    /* Init lambda to be the erasure locator polynomial */ -    lambda[1] = ALPHA_TO[MODNN(PRIM*(NN-1-eras_pos[0]))]; -    for (i = 1; i < no_eras; i++) { -      u = MODNN(PRIM*(NN-1-eras_pos[i])); -      for (j = i+1; j > 0; j--) { -	tmp = INDEX_OF[lambda[j - 1]]; -	if(tmp != A0) -	  lambda[j] ^= ALPHA_TO[MODNN(u + tmp)]; -      } -    } - -#if DEBUG >= 1 -    /* Test code that verifies the erasure locator polynomial just constructed -       Needed only for decoder debugging. */ -     -    /* find roots of the erasure location polynomial */ -    for(i=1;i<=no_eras;i++) -      reg[i] = INDEX_OF[lambda[i]]; - -    count = 0; -    for (i = 1,k=IPRIM-1; i <= NN; i++,k = MODNN(k+IPRIM)) { -      q = 1; -      for (j = 1; j <= no_eras; j++) -	if (reg[j] != A0) { -	  reg[j] = MODNN(reg[j] + j); -	  q ^= ALPHA_TO[reg[j]]; -	} -      if (q != 0) -	continue; -      /* store root and error location number indices */ -      root[count] = i; -      loc[count] = k; -      count++; -    } -    if (count != no_eras) { -      printf("count = %d no_eras = %d\n lambda(x) is WRONG\n",count,no_eras); -      count = -1; -      goto finish; -    } -#if DEBUG >= 2 -    printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n"); -    for (i = 0; i < count; i++) -      printf("%d ", loc[i]); -    printf("\n"); -#endif -#endif -  } -  for(i=0;i<NROOTS+1;i++) -    b[i] = INDEX_OF[lambda[i]]; -   -  /* -   * Begin Berlekamp-Massey algorithm to determine error+erasure -   * locator polynomial -   */ -  r = no_eras; -  el = no_eras; -  while (++r <= NROOTS) {	/* r is the step number */ -    /* Compute discrepancy at the r-th step in poly-form */ -    discr_r = 0; -    for (i = 0; i < r; i++){ -      if ((lambda[i] != 0) && (s[r-i-1] != A0)) { -	discr_r ^= ALPHA_TO[MODNN(INDEX_OF[lambda[i]] + s[r-i-1])]; -      } -    } -    discr_r = INDEX_OF[discr_r];	/* Index form */ -    if (discr_r == A0) { -      /* 2 lines below: B(x) <-- x*B(x) */ -      memmove(&b[1],b,NROOTS*sizeof(b[0])); -      b[0] = A0; -    } else { -      /* 7 lines below: T(x) <-- lambda(x) - discr_r*x*b(x) */ -      t[0] = lambda[0]; -      for (i = 0 ; i < NROOTS; i++) { -	if(b[i] != A0) -	  t[i+1] = lambda[i+1] ^ ALPHA_TO[MODNN(discr_r + b[i])]; -	else -	  t[i+1] = lambda[i+1]; -      } -      if (2 * el <= r + no_eras - 1) { -	el = r + no_eras - el; -	/* -	 * 2 lines below: B(x) <-- inv(discr_r) * -	 * lambda(x) -	 */ -	for (i = 0; i <= NROOTS; i++) -	  b[i] = (lambda[i] == 0) ? A0 : MODNN(INDEX_OF[lambda[i]] - discr_r + NN); -      } else { -	/* 2 lines below: B(x) <-- x*B(x) */ -	memmove(&b[1],b,NROOTS*sizeof(b[0])); -	b[0] = A0; -      } -      memcpy(lambda,t,(NROOTS+1)*sizeof(t[0])); -    } -  } - -  /* Convert lambda to index form and compute deg(lambda(x)) */ -  deg_lambda = 0; -  for(i=0;i<NROOTS+1;i++){ -    lambda[i] = INDEX_OF[lambda[i]]; -    if(lambda[i] != A0) -      deg_lambda = i; -  } -  /* Find roots of the error+erasure locator polynomial by Chien search */ -  memcpy(®[1],&lambda[1],NROOTS*sizeof(reg[0])); -  count = 0;		/* Number of roots of lambda(x) */ -  for (i = 1,k=IPRIM-1; i <= NN; i++,k = MODNN(k+IPRIM)) { -    q = 1; /* lambda[0] is always 0 */ -    for (j = deg_lambda; j > 0; j--){ -      if (reg[j] != A0) { -	reg[j] = MODNN(reg[j] + j); -	q ^= ALPHA_TO[reg[j]]; -      } -    } -    if (q != 0) -      continue; /* Not a root */ -    /* store root (index-form) and error location number */ -#if DEBUG>=2 -    printf("count %d root %d loc %d\n",count,i,k); -#endif -    root[count] = i; -    loc[count] = k; -    /* If we've already found max possible roots, -     * abort the search to save time -     */ -    if(++count == deg_lambda) -      break; -  } -  if (deg_lambda != count) { -    /* -     * deg(lambda) unequal to number of roots => uncorrectable -     * error detected -     */ -    count = -1; -    goto finish; -  } -  /* -   * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo -   * x**NROOTS). in index form. Also find deg(omega). -   */ -  deg_omega = deg_lambda-1; -  for (i = 0; i <= deg_omega;i++){ -    tmp = 0; -    for(j=i;j >= 0; j--){ -      if ((s[i - j] != A0) && (lambda[j] != A0)) -	tmp ^= ALPHA_TO[MODNN(s[i - j] + lambda[j])]; -    } -    omega[i] = INDEX_OF[tmp]; -  } - -  /* -   * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = -   * inv(X(l))**(FCR-1) and den = lambda_pr(inv(X(l))) all in poly-form -   */ -  for (j = count-1; j >=0; j--) { -    num1 = 0; -    for (i = deg_omega; i >= 0; i--) { -      if (omega[i] != A0) -	num1  ^= ALPHA_TO[MODNN(omega[i] + i * root[j])]; -    } -    num2 = ALPHA_TO[MODNN(root[j] * (FCR - 1) + NN)]; -    den = 0; -     -    /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ -    for (i = MIN(deg_lambda,NROOTS-1) & ~1; i >= 0; i -=2) { -      if(lambda[i+1] != A0) -	den ^= ALPHA_TO[MODNN(lambda[i+1] + i * root[j])]; -    } -#if DEBUG >= 1 -    if (den == 0) { -      printf("\n ERROR: denominator = 0\n"); -      count = -1; -      goto finish; -    } -#endif -    /* Apply error to data */ -    if (num1 != 0 && loc[j] >= PAD) { -      data[loc[j]-PAD] ^= ALPHA_TO[MODNN(INDEX_OF[num1] + INDEX_OF[num2] + NN - INDEX_OF[den])]; -    } -  } - finish: -  if(eras_pos != NULL){ -    for(i=0;i<count;i++) -      eras_pos[i] = loc[i]; -  } -  retval = count; -} diff --git a/src/fec/decode_rs_char.c b/src/fec/decode_rs_char.c deleted file mode 100644 index 7105233..0000000 --- a/src/fec/decode_rs_char.c +++ /dev/null @@ -1,22 +0,0 @@ -/* General purpose Reed-Solomon decoder for 8-bit symbols or less - * Copyright 2003 Phil Karn, KA9Q - * May be used under the terms of the GNU Lesser General Public License (LGPL) - */ - -#ifdef DEBUG -#include <stdio.h> -#endif - -#include <string.h> - -#include "char.h" -#include "rs-common.h" - -int decode_rs_char(void *p, data_t *data, int *eras_pos, int no_eras){ -  int retval; -  struct rs *rs = (struct rs *)p; -  -#include "decode_rs.h" -   -  return retval; -} diff --git a/src/fec/encode_rs.h b/src/fec/encode_rs.h deleted file mode 100644 index 2c157f9..0000000 --- a/src/fec/encode_rs.h +++ /dev/null @@ -1,58 +0,0 @@ -/* The guts of the Reed-Solomon encoder, meant to be #included - * into a function body with the following typedefs, macros and variables supplied - * according to the code parameters: - - * data_t - a typedef for the data symbol - * data_t data[] - array of NN-NROOTS-PAD and type data_t to be encoded - * data_t parity[] - an array of NROOTS and type data_t to be written with parity symbols - * NROOTS - the number of roots in the RS code generator polynomial, - *          which is the same as the number of parity symbols in a block. -            Integer variable or literal. -	    *  - * NN - the total number of symbols in a RS block. Integer variable or literal. - * PAD - the number of pad symbols in a block. Integer variable or literal. - * ALPHA_TO - The address of an array of NN elements to convert Galois field - *            elements in index (log) form to polynomial form. Read only. - * INDEX_OF - The address of an array of NN elements to convert Galois field - *            elements in polynomial form to index (log) form. Read only. - * MODNN - a function to reduce its argument modulo NN. May be inline or a macro. - * GENPOLY - an array of NROOTS+1 elements containing the generator polynomial in index form - - * The memset() and memmove() functions are used. The appropriate header - * file declaring these functions (usually <string.h>) must be included by the calling - * program. - - * Copyright 2004, Phil Karn, KA9Q - * May be used under the terms of the GNU Lesser General Public License (LGPL) - */ - - -#undef A0 -#define A0 (NN) /* Special reserved value encoding zero in index form */ - -{ -  int i, j; -  data_t feedback; - -  memset(parity,0,NROOTS*sizeof(data_t)); - -  for(i=0;i<NN-NROOTS-PAD;i++){ -    feedback = INDEX_OF[data[i] ^ parity[0]]; -    if(feedback != A0){      /* feedback term is non-zero */ -#ifdef UNNORMALIZED -      /* This line is unnecessary when GENPOLY[NROOTS] is unity, as it must -       * always be for the polynomials constructed by init_rs() -       */ -      feedback = MODNN(NN - GENPOLY[NROOTS] + feedback); -#endif -      for(j=1;j<NROOTS;j++) -	parity[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])]; -    } -    /* Shift */ -    memmove(&parity[0],&parity[1],sizeof(data_t)*(NROOTS-1)); -    if(feedback != A0) -      parity[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])]; -    else -      parity[NROOTS-1] = 0; -  } -} diff --git a/src/fec/encode_rs_char.c b/src/fec/encode_rs_char.c deleted file mode 100644 index a9bf2b8..0000000 --- a/src/fec/encode_rs_char.c +++ /dev/null @@ -1,15 +0,0 @@ -/* Reed-Solomon encoder - * Copyright 2002, Phil Karn, KA9Q - * May be used under the terms of the GNU Lesser General Public License (LGPL) - */ -#include <string.h> - -#include "char.h" -#include "rs-common.h" - -void encode_rs_char(void *p,data_t *data, data_t *parity){ -  struct rs *rs = (struct rs *)p; - -#include "encode_rs.h" - -} diff --git a/src/fec/fec.h b/src/fec/fec.h deleted file mode 100644 index 0d1bae1..0000000 --- a/src/fec/fec.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Main header for reduced libfec. - * - * The FEC code in this folder is - * Copyright 2003 Phil Karn, KA9Q - * May be used under the terms of the GNU Lesser General Public License (LGPL) - */ - -#pragma once - -#include <stdlib.h> - -#include "char.h" -#include "rs-common.h" - -/* Initialize a Reed-Solomon codec - * symsize = symbol size, bits - * gfpoly = Field generator polynomial coefficients - * fcr = first root of RS code generator polynomial, index form - * prim = primitive element to generate polynomial roots - * nroots = RS code generator polynomial degree (number of roots) - * pad = padding bytes at front of shortened block - */ -void *init_rs_char(int symsize,int gfpoly,int fcr,int prim,int nroots,int pad); - -int decode_rs_char(void *p, data_t *data, int *eras_pos, int no_eras); - -void encode_rs_char(void *p,data_t *data, data_t *parity); - -void free_rs_char(void *p); - diff --git a/src/fec/init_rs.h b/src/fec/init_rs.h deleted file mode 100644 index 2b2ae98..0000000 --- a/src/fec/init_rs.h +++ /dev/null @@ -1,106 +0,0 @@ -/* Common code for intializing a Reed-Solomon control block (char or int symbols) - * Copyright 2004 Phil Karn, KA9Q - * May be used under the terms of the GNU Lesser General Public License (LGPL) - */ -#undef NULL -#define NULL ((void *)0) - -{ -  int i, j, sr,root,iprim; - -  rs = NULL; -  /* Check parameter ranges */ -  if(symsize < 0 || symsize > 8*sizeof(data_t)){ -    goto done; -  } - -  if(fcr < 0 || fcr >= (1<<symsize)) -    goto done; -  if(prim <= 0 || prim >= (1<<symsize)) -    goto done; -  if(nroots < 0 || nroots >= (1<<symsize)) -    goto done; /* Can't have more roots than symbol values! */ -  if(pad < 0 || pad >= ((1<<symsize) -1 - nroots)) -    goto done; /* Too much padding */ - -  rs = (struct rs *)calloc(1,sizeof(struct rs)); -  if(rs == NULL) -    goto done; - -  rs->mm = symsize; -  rs->nn = (1<<symsize)-1; -  rs->pad = pad; - -  rs->alpha_to = (data_t *)malloc(sizeof(data_t)*(rs->nn+1)); -  if(rs->alpha_to == NULL){ -    free(rs); -    rs = NULL; -    goto done; -  } -  rs->index_of = (data_t *)malloc(sizeof(data_t)*(rs->nn+1)); -  if(rs->index_of == NULL){ -    free(rs->alpha_to); -    free(rs); -    rs = NULL; -    goto done; -  } - -  /* Generate Galois field lookup tables */ -  rs->index_of[0] = A0; /* log(zero) = -inf */ -  rs->alpha_to[A0] = 0; /* alpha**-inf = 0 */ -  sr = 1; -  for(i=0;i<rs->nn;i++){ -    rs->index_of[sr] = i; -    rs->alpha_to[i] = sr; -    sr <<= 1; -    if(sr & (1<<symsize)) -      sr ^= gfpoly; -    sr &= rs->nn; -  } -  if(sr != 1){ -    /* field generator polynomial is not primitive! */ -    free(rs->alpha_to); -    free(rs->index_of); -    free(rs); -    rs = NULL; -    goto done; -  } - -  /* Form RS code generator polynomial from its roots */ -  rs->genpoly = (data_t *)malloc(sizeof(data_t)*(nroots+1)); -  if(rs->genpoly == NULL){ -    free(rs->alpha_to); -    free(rs->index_of); -    free(rs); -    rs = NULL; -    goto done; -  } -  rs->fcr = fcr; -  rs->prim = prim; -  rs->nroots = nroots; - -  /* Find prim-th root of 1, used in decoding */ -  for(iprim=1;(iprim % prim) != 0;iprim += rs->nn) -    ; -  rs->iprim = iprim / prim; - -  rs->genpoly[0] = 1; -  for (i = 0,root=fcr*prim; i < nroots; i++,root += prim) { -    rs->genpoly[i+1] = 1; - -    /* Multiply rs->genpoly[] by  @**(root + x) */ -    for (j = i; j > 0; j--){ -      if (rs->genpoly[j] != 0) -	rs->genpoly[j] = rs->genpoly[j-1] ^ rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[j]] + root)]; -      else -	rs->genpoly[j] = rs->genpoly[j-1]; -    } -    /* rs->genpoly[0] can never be zero */ -    rs->genpoly[0] = rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[0]] + root)]; -  } -  /* convert rs->genpoly[] to index form for quicker encoding */ -  for (i = 0; i <= nroots; i++) -    rs->genpoly[i] = rs->index_of[rs->genpoly[i]]; - done:; - -} diff --git a/src/fec/init_rs_char.c b/src/fec/init_rs_char.c deleted file mode 100644 index a51099a..0000000 --- a/src/fec/init_rs_char.c +++ /dev/null @@ -1,35 +0,0 @@ -/* Initialize a RS codec - * - * Copyright 2002 Phil Karn, KA9Q - * May be used under the terms of the GNU Lesser General Public License (LGPL) - */ -#include <stdlib.h> - -#include "char.h" -#include "rs-common.h" - -void free_rs_char(void *p){ -  struct rs *rs = (struct rs *)p; - -  free(rs->alpha_to); -  free(rs->index_of); -  free(rs->genpoly); -  free(rs); -} - -/* Initialize a Reed-Solomon codec - * symsize = symbol size, bits - * gfpoly = Field generator polynomial coefficients - * fcr = first root of RS code generator polynomial, index form - * prim = primitive element to generate polynomial roots - * nroots = RS code generator polynomial degree (number of roots) - * pad = padding bytes at front of shortened block - */ -void *init_rs_char(int symsize,int gfpoly,int fcr,int prim, -	int nroots,int pad){ -  struct rs *rs; - -#include "init_rs.h" - -  return rs; -} diff --git a/src/fec/rs-common.h b/src/fec/rs-common.h deleted file mode 100644 index e64eb39..0000000 --- a/src/fec/rs-common.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Stuff common to all the general-purpose Reed-Solomon codecs - * Copyright 2004 Phil Karn, KA9Q - * May be used under the terms of the GNU Lesser General Public License (LGPL) - */ - -/* Reed-Solomon codec control block */ -struct rs { -  int mm;              /* Bits per symbol */ -  int nn;              /* Symbols per block (= (1<<mm)-1) */ -  data_t *alpha_to;     /* log lookup table */ -  data_t *index_of;     /* Antilog lookup table */ -  data_t *genpoly;      /* Generator polynomial */ -  int nroots;     /* Number of generator roots = number of parity symbols */ -  int fcr;        /* First consecutive root, index form */ -  int prim;       /* Primitive element, index form */ -  int iprim;      /* prim-th root of 1, index form */ -  int pad;        /* Padding bytes in shortened block */ -}; - -static inline int modnn(struct rs *rs,int x){ -  while (x >= rs->nn) { -    x -= rs->nn; -    x = (x >> rs->mm) + (x & rs->nn); -  } -  return x; -} diff --git a/src/zmq.hpp b/src/zmq.hpp deleted file mode 100644 index eb5416e..0000000 --- a/src/zmq.hpp +++ /dev/null @@ -1,602 +0,0 @@ -/* -    Copyright (c) 2009-2011 250bpm s.r.o. -    Copyright (c) 2011 Botond Ballo -    Copyright (c) 2007-2009 iMatix Corporation - -    Permission is hereby granted, free of charge, to any person obtaining a copy -    of this software and associated documentation files (the "Software"), to -    deal in the Software without restriction, including without limitation the -    rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -    sell copies of the Software, and to permit persons to whom the Software is -    furnished to do so, subject to the following conditions: - -    The above copyright notice and this permission notice shall be included in -    all copies or substantial portions of the Software. - -    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -    IN THE SOFTWARE. -*/ - -#ifndef __ZMQ_HPP_INCLUDED__ -#define __ZMQ_HPP_INCLUDED__ - -#include <zmq.h> - -#include <algorithm> -#include <cassert> -#include <cstring> -#include <string> -#include <exception> - -//  Detect whether the compiler supports C++11 rvalue references. -#if (defined(__GNUC__) && (__GNUC__ > 4 || \ -      (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) && \ -      defined(__GXX_EXPERIMENTAL_CXX0X__)) -    #define ZMQ_HAS_RVALUE_REFS -    #define ZMQ_DELETED_FUNCTION = delete -#elif defined(__clang__) -    #if __has_feature(cxx_rvalue_references) -        #define ZMQ_HAS_RVALUE_REFS -    #endif - -    #if __has_feature(cxx_deleted_functions) -        #define ZMQ_DELETED_FUNCTION = delete -    #else -        #define ZMQ_DELETED_FUNCTION -    #endif -#elif defined(_MSC_VER) && (_MSC_VER >= 1600) -    #define ZMQ_HAS_RVALUE_REFS -    #define ZMQ_DELETED_FUNCTION -#else -    #define ZMQ_DELETED_FUNCTION -#endif - -#if ZMQ_VERSION >= ZMQ_MAKE_VERSION(3, 3, 0) -#define ZMQ_NEW_MONITOR_EVENT_LAYOUT -#endif - -#if ZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 1, 0) -#define ZMQ_HAS_PROXY_STEERABLE -/*  Socket event data  */ -typedef struct { -    uint16_t event;  // id of the event as bitfield -    int32_t  value ; // value is either error code, fd or reconnect interval -} zmq_event_t; -#endif - -// In order to prevent unused variable warnings when building in non-debug -// mode use this macro to make assertions. -#ifndef NDEBUG -#   define ZMQ_ASSERT(expression) assert(expression) -#else -#   define ZMQ_ASSERT(expression) (void)(expression) -#endif - -namespace zmq -{ - -    typedef zmq_free_fn free_fn; -    typedef zmq_pollitem_t pollitem_t; - -    class error_t : public std::exception -    { -    public: - -        error_t () : errnum (zmq_errno ()) {} - -        virtual const char *what () const throw () -        { -            return zmq_strerror (errnum); -        } - -        int num () const -        { -            return errnum; -        } - -    private: - -        int errnum; -    }; - -    inline int poll (zmq_pollitem_t *items_, int nitems_, long timeout_ = -1) -    { -        int rc = zmq_poll (items_, nitems_, timeout_); -        if (rc < 0) -            throw error_t (); -        return rc; -    } - -    inline void proxy (void *frontend, void *backend, void *capture) -    { -        int rc = zmq_proxy (frontend, backend, capture); -        if (rc != 0) -            throw error_t (); -    } -     -#ifdef ZMQ_HAS_PROXY_STEERABLE -    inline void proxy_steerable (void *frontend, void *backend, void *capture, void *control) -    { -        int rc = zmq_proxy_steerable (frontend, backend, capture, control); -        if (rc != 0) -            throw error_t (); -    } -#endif -     -    inline void version (int *major_, int *minor_, int *patch_) -    { -        zmq_version (major_, minor_, patch_); -    } - -    class message_t -    { -        friend class socket_t; - -    public: - -        inline message_t () -        { -            int rc = zmq_msg_init (&msg); -            if (rc != 0) -                throw error_t (); -        } - -        inline explicit message_t (size_t size_) -        { -            int rc = zmq_msg_init_size (&msg, size_); -            if (rc != 0) -                throw error_t (); -        } - -        inline message_t (void *data_, size_t size_, free_fn *ffn_, -            void *hint_ = NULL) -        { -            int rc = zmq_msg_init_data (&msg, data_, size_, ffn_, hint_); -            if (rc != 0) -                throw error_t (); -        } - -#ifdef ZMQ_HAS_RVALUE_REFS -        inline message_t (message_t &&rhs) : msg (rhs.msg) -        { -            int rc = zmq_msg_init (&rhs.msg); -            if (rc != 0) -                throw error_t (); -        } - -        inline message_t &operator = (message_t &&rhs) -        { -            std::swap (msg, rhs.msg); -            return *this; -        } -#endif - -        inline ~message_t () -        { -            int rc = zmq_msg_close (&msg); -            ZMQ_ASSERT (rc == 0); -        } - -        inline void rebuild () -        { -            int rc = zmq_msg_close (&msg); -            if (rc != 0) -                throw error_t (); -            rc = zmq_msg_init (&msg); -            if (rc != 0) -                throw error_t (); -        } - -        inline void rebuild (size_t size_) -        { -            int rc = zmq_msg_close (&msg); -            if (rc != 0) -                throw error_t (); -            rc = zmq_msg_init_size (&msg, size_); -            if (rc != 0) -                throw error_t (); -        } - -        inline void rebuild (void *data_, size_t size_, free_fn *ffn_, -            void *hint_ = NULL) -        { -            int rc = zmq_msg_close (&msg); -            if (rc != 0) -                throw error_t (); -            rc = zmq_msg_init_data (&msg, data_, size_, ffn_, hint_); -            if (rc != 0) -                throw error_t (); -        } - -        inline void move (message_t *msg_) -        { -            int rc = zmq_msg_move (&msg, &(msg_->msg)); -            if (rc != 0) -                throw error_t (); -        } - -        inline void copy (message_t *msg_) -        { -            int rc = zmq_msg_copy (&msg, &(msg_->msg)); -            if (rc != 0) -                throw error_t (); -        } - -        inline bool more () -        { -            int rc = zmq_msg_more (&msg); -            return rc != 0; -        } - -        inline void *data () -        { -            return zmq_msg_data (&msg); -        } - -        inline const void* data () const -        { -            return zmq_msg_data (const_cast<zmq_msg_t*>(&msg)); -        } - -        inline size_t size () const -        { -            return zmq_msg_size (const_cast<zmq_msg_t*>(&msg)); -        } - -    private: - -        //  The underlying message -        zmq_msg_t msg; - -        //  Disable implicit message copying, so that users won't use shared -        //  messages (less efficient) without being aware of the fact. -        message_t (const message_t&); -        void operator = (const message_t&); -    }; - -    class context_t -    { -        friend class socket_t; - -    public: -        inline context_t () -        { -            ptr = zmq_ctx_new (); -            if (ptr == NULL) -                throw error_t (); -        } - - -        inline explicit context_t (int io_threads_, int max_sockets_ = ZMQ_MAX_SOCKETS_DFLT) -        { -            ptr = zmq_ctx_new (); -            if (ptr == NULL) -                throw error_t (); - -            int rc = zmq_ctx_set (ptr, ZMQ_IO_THREADS, io_threads_); -            ZMQ_ASSERT (rc == 0); - -            rc = zmq_ctx_set (ptr, ZMQ_MAX_SOCKETS, max_sockets_); -            ZMQ_ASSERT (rc == 0); -        } - -#ifdef ZMQ_HAS_RVALUE_REFS -        inline context_t (context_t &&rhs) : ptr (rhs.ptr) -        { -            rhs.ptr = NULL; -        } -        inline context_t &operator = (context_t &&rhs) -        { -            std::swap (ptr, rhs.ptr); -            return *this; -        } -#endif - -        inline ~context_t () -        { -            close(); -        } - -        inline void close() -        { -            if (ptr == NULL) -                return; -            int rc = zmq_ctx_destroy (ptr); -            ZMQ_ASSERT (rc == 0); -            ptr = NULL; -        } - -        //  Be careful with this, it's probably only useful for -        //  using the C api together with an existing C++ api. -        //  Normally you should never need to use this. -        inline operator void* () -        { -            return ptr; -        } - -    private: - -        void *ptr; - -        context_t (const context_t&); -        void operator = (const context_t&); -    }; - -    class socket_t -    { -        friend class monitor_t; -    public: - -        inline socket_t (context_t &context_, int type_) -        { -            ctxptr = context_.ptr; -            ptr = zmq_socket (context_.ptr, type_); -            if (ptr == NULL) -                throw error_t (); -        } - -#ifdef ZMQ_HAS_RVALUE_REFS -        inline socket_t(socket_t&& rhs) : ptr(rhs.ptr) -        { -            rhs.ptr = NULL; -        } -        inline socket_t& operator=(socket_t&& rhs) -        { -            std::swap(ptr, rhs.ptr); -            return *this; -        } -#endif - -        inline ~socket_t () -        { -            close(); -        } - -        inline operator void* () -        { -            return ptr; -        } - -        inline void close() -        { -            if(ptr == NULL) -                // already closed -                return ; -            int rc = zmq_close (ptr); -            ZMQ_ASSERT (rc == 0); -            ptr = 0 ; -        } - -        inline void setsockopt (int option_, const void *optval_, -            size_t optvallen_) -        { -            int rc = zmq_setsockopt (ptr, option_, optval_, optvallen_); -            if (rc != 0) -                throw error_t (); -        } - -        inline void getsockopt (int option_, void *optval_, -            size_t *optvallen_) -        { -            int rc = zmq_getsockopt (ptr, option_, optval_, optvallen_); -            if (rc != 0) -                throw error_t (); -        } -         -        inline void bind (const char *addr_) -        { -            int rc = zmq_bind (ptr, addr_); -            if (rc != 0) -                throw error_t (); -        } - -        inline void unbind (const char *addr_) -        { -            int rc = zmq_unbind (ptr, addr_); -            if (rc != 0) -                throw error_t (); -        } - -        inline void connect (const char *addr_) -        { -            int rc = zmq_connect (ptr, addr_); -            if (rc != 0) -                throw error_t (); -        } - -        inline void disconnect (const char *addr_) -        { -            int rc = zmq_disconnect (ptr, addr_); -            if (rc != 0) -                throw error_t (); -        } - -        inline bool connected() -        { -            return(ptr != NULL); -        } -         -        inline size_t send (const void *buf_, size_t len_, int flags_ = 0) -        { -            int nbytes = zmq_send (ptr, buf_, len_, flags_); -            if (nbytes >= 0) -                return (size_t) nbytes; -            if (zmq_errno () == EAGAIN) -                return 0; -            throw error_t (); -        } - -        inline bool send (message_t &msg_, int flags_ = 0) -        { -            int nbytes = zmq_msg_send (&(msg_.msg), ptr, flags_); -            if (nbytes >= 0) -                return true; -            if (zmq_errno () == EAGAIN) -                return false; -            throw error_t (); -        } - -#ifdef ZMQ_HAS_RVALUE_REFS -        inline bool send (message_t &&msg_, int flags_ = 0) -        { -            return send(msg_, flags_); -        } -#endif - -        inline size_t recv (void *buf_, size_t len_, int flags_ = 0) -        { -            int nbytes = zmq_recv (ptr, buf_, len_, flags_); -            if (nbytes >= 0) -                return (size_t) nbytes; -            if (zmq_errno () == EAGAIN) -                return 0; -            throw error_t (); -        } - -        inline bool recv (message_t *msg_, int flags_ = 0) -        { -            int nbytes = zmq_msg_recv (&(msg_->msg), ptr, flags_); -            if (nbytes >= 0) -                return true; -            if (zmq_errno () == EAGAIN) -                return false; -            throw error_t (); -        } -         -    private: -        void *ptr; -        void *ctxptr; - -        socket_t (const socket_t&) ZMQ_DELETED_FUNCTION; -        void operator = (const socket_t&) ZMQ_DELETED_FUNCTION; -    }; - -    class monitor_t -    { -    public: -        monitor_t() : socketPtr(NULL) {} -        virtual ~monitor_t() {} - -        void monitor(socket_t &socket, const char *addr_, int events = ZMQ_EVENT_ALL) -        { -            int rc = zmq_socket_monitor(socket.ptr, addr_, events); -            if (rc != 0) -                throw error_t (); - -            socketPtr = socket.ptr; -            void *s = zmq_socket (socket.ctxptr, ZMQ_PAIR); -            assert (s); - -            rc = zmq_connect (s, addr_); -            assert (rc == 0); -             -            on_monitor_started(); -             -            while (true) { -                zmq_msg_t eventMsg; -                zmq_msg_init (&eventMsg); -                rc = zmq_recvmsg (s, &eventMsg, 0); -                if (rc == -1 && zmq_errno() == ETERM) -                    break; -                assert (rc != -1); -#if ZMQ_VERSION_MAJOR >= 4 -                const char* data = static_cast<const char*>(zmq_msg_data(&eventMsg)); -                zmq_event_t msgEvent; -                memcpy(&msgEvent.event, data, sizeof(uint16_t)); data += sizeof(uint16_t); -                memcpy(&msgEvent.value, data, sizeof(int32_t)); -                zmq_event_t* event = &msgEvent; -#else -                zmq_event_t* event = static_cast<zmq_event_t*>(zmq_msg_data(&eventMsg)); -#endif -                 -#ifdef ZMQ_NEW_MONITOR_EVENT_LAYOUT -                zmq_msg_t addrMsg; -                zmq_msg_init (&addrMsg); -                rc = zmq_recvmsg (s, &addrMsg, 0); -                if (rc == -1 && zmq_errno() == ETERM) -                    break; -                assert (rc != -1); -                const char* str = static_cast<const char*>(zmq_msg_data (&addrMsg)); -                std::string address(str, str + zmq_msg_size(&addrMsg)); -                zmq_msg_close (&addrMsg); -#else -                // Bit of a hack, but all events in the zmq_event_t union have the same layout so this will work for all event types. -                std::string address = event->data.connected.addr; -#endif - -#ifdef ZMQ_EVENT_MONITOR_STOPPED -                if (event->event == ZMQ_EVENT_MONITOR_STOPPED) -                    break; -#endif - -                switch (event->event) { -                case ZMQ_EVENT_CONNECTED: -                    on_event_connected(*event, address.c_str()); -                    break; -                case ZMQ_EVENT_CONNECT_DELAYED: -                    on_event_connect_delayed(*event, address.c_str()); -                    break; -                case ZMQ_EVENT_CONNECT_RETRIED: -                    on_event_connect_retried(*event, address.c_str()); -                    break; -                case ZMQ_EVENT_LISTENING: -                    on_event_listening(*event, address.c_str()); -                    break; -                case ZMQ_EVENT_BIND_FAILED: -                    on_event_bind_failed(*event, address.c_str()); -                    break; -                case ZMQ_EVENT_ACCEPTED: -                    on_event_accepted(*event, address.c_str()); -                    break; -                case ZMQ_EVENT_ACCEPT_FAILED: -                    on_event_accept_failed(*event, address.c_str()); -                    break; -                case ZMQ_EVENT_CLOSED: -                    on_event_closed(*event, address.c_str()); -                    break; -                case ZMQ_EVENT_CLOSE_FAILED: -                    on_event_close_failed(*event, address.c_str()); -                    break; -                case ZMQ_EVENT_DISCONNECTED: -                    on_event_disconnected(*event, address.c_str()); -                    break; -                default: -                    on_event_unknown(*event, address.c_str()); -                    break; -                } -                zmq_msg_close (&eventMsg); -            } -            zmq_close (s); -            socketPtr = NULL; -        } - -#ifdef ZMQ_EVENT_MONITOR_STOPPED -        void abort() -        { -            if (socketPtr) -                zmq_socket_monitor(socketPtr, NULL, 0); -        } -#endif -        virtual void on_monitor_started() {} -        virtual void on_event_connected(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -        virtual void on_event_connect_delayed(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -        virtual void on_event_connect_retried(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -        virtual void on_event_listening(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -        virtual void on_event_bind_failed(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -        virtual void on_event_accepted(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -        virtual void on_event_accept_failed(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -        virtual void on_event_closed(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -        virtual void on_event_close_failed(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -        virtual void on_event_disconnected(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -        virtual void on_event_unknown(const zmq_event_t &event_, const char* addr_) { (void)event_; (void)addr_; } -    private: -        void* socketPtr; -    }; -} - -#endif | 
